2017-07-25 63 views
0

我試圖建立Ansible能夠根據主機是什麼清單組運行一個劇本。例如,在清單中,我們有:Ansible:根據庫存變量包括劇本

[group1] 
host1.sub.domain.tld ansible_host=10.0.0.2 
... 
[group1:vars] 
whatsmyplaybook=build-server.yml 

然後,我們希望做一個簡單的劇本,將或多或少地重定向到這是清單中的劇本:

--- 
- name: Load Playbook from inventory 
    include: "{{hostvars[server].whatsmyplaybook}}" 

凡「server」變量將是主機的FQDN,從命令行傳遞:

ansible-playbook whatsmyplaybook.yml -e "server=host1.sub.domain.tld" 

我們的推理是從全新安裝(PXE啓動)啓動服務器,它只會真正知道它的FQDN,然後有一個firstboot腳本SSH連接到我們的Ansible主機,並啓動以上命令。然而,我們這樣做的時候,我們得到以下錯誤:

ERROR! 'hostvars' is undefined 

這表明庫存不會被解析,直至提供host列表,它吸了很多。有沒有另外一種方法來完成這個?

+0

你爲什麼試這個? Ansible戲劇有'主持人'聲明,它決定了他們被應用到哪個組。您包含的任何遊戲都必須具有此聲明,並將在所有匹配的主機組上運行。 – techraf

+0

@techraf「'我們的推理是從一個全新的安裝(PXE啓動)中啓動一個服務器引導程序,它只會真正知道它的FQDN」。我們已經有了可以填寫'hosts'聲明的劇本,但是當我們重建一臺機器時,它們必須被修改或者運行的範圍太大。我們的目標是消除對此的需求,並允許不知道其角色/劇本的主持人讓Ansible與之競爭。 – MrDrMcCoy

回答

0

誠實地說,有點奇怪的工作流程。

您的設置不起作用,因爲大多數變量在劇本分析時間期間未定義。

你可能是有限定單個劇本針對不同羣體不同戲劇更幸運(無需設置組變量,只是用在我的例子)正確的主機模式(組名),並執行其限制在特定的主機:

site.yml:

--- 
- hosts: group1 
    tasks: 
    - include: build-web-server-tasks.yml 

- hosts: group2 
    tasks: 
    - include: build-db-server-tasks2.yml 

命令來提供特定的服務器:

ansible-playbook -l host1.sub.domain.tld site.yml 
+0

我們已經爲每個主機組開發了工作劇本,但是他們要麼針對整個組(不理想)運行,要麼必須手動編輯和調用,以針對新裝載的機器運行(這是我們試圖消除需求的原因對於)。 – MrDrMcCoy

+0

我想這是'-l'開關背後的原因:限制主機模式而不修改劇本。否則我不明白這個問題,對不起。 –

0

你可以開發自己的動態清單文件,使所有需要自舉的機器將自動添加到您的庫存和組中,並且手動輸入庫存文件。

爲了開發動態庫存,你可以按照下面的鏈接:

http://docs.ansible.com/ansible/latest/dev_guide/developing_inventory.html

可以包括針對不同羣體如下多個劇本。

--- 
- hosts: all 
    tasks: 
    - include: build-web-server-tasks.yml 
     where: inventory_hostname in groups['group1'] 
    - include: build-db-server-tasks2.yml 
     where: inventory_hostname in groups['group2'] 

inventory_hostname是主機的名稱作爲Ansible的庫存主機文件配置。這對於您不想依賴發現的主機名ansible_hostname或出於其他神祕原因時非常有用。如果您有一個很長的FQDN,inventory_hostname_short還包含直到第一個時間段的部分,而不包含域的其餘部分。

+0

正如我在問題中指出的那樣,清單已經與必需的主機一起完成。 – MrDrMcCoy