2017-09-01 83 views
1

我的主機清單的來源是一個輸出值對的內部工具,例如,這裏有六個觀察值,我目前有160個觀察值:Ansible:如何使用多值數據清單作爲清單並傳遞給目標主機

servername1 processname1 
    servername1 processname2 
    servername1 processname3 
    servername2 processname1 
    servername3 processname1 
    servername4 processname1 

所以第1列是我的目標主機列表(我的庫存)。 Column2是唯一的processname值,專門分配給servername的值。通常會發生相同的服務器。某些服務器只有一個進程名稱,其他服務器可能有2到N.意思是說,我的目標主機可能重複一個唯一的進程名稱列表。我想從這個輸出列表中使用動態庫存,並且我需要將每個觀察值的兩個值關聯並分配給變量。我並不是絕對需要使用動態庫存,我只需要一個解決方案。我還需要通過命令:或shell:modules傳遞給目標主機和{{processname#}}中的值。 (這是獨一無二的,沒有與此需求相關的模塊)

如果需要,我有一種方法來過濾這些數據並以JSON格式或YAML輸出它,爲每個主機制作一個單獨的YML文件。雖然我寧願動態地處理這些;預處理列表是可以接受的。

因爲ansible-playbook需要一些已知的主機清單列表,所以我在開始播放時從我的動態輸出中瞭解如何創建此列表。

我到目前爲止所做的工作:我已經嘗試閱讀並嘗試將這些對設置爲在/etc/ansible/hosts/host_vars/servername#.yml文件中。這是非常難看的,因爲我必須預處理數據的輸出,轉換成YML格式。但它並沒有給我一個主機列表來參考我的手冊。所以雖然看起來hostvar是合乎邏輯的選擇,但我無法理解它。

我需要什麼:

- The suggested format of the data? JSON? YAML? Other? (if I cannot read it in dynamically. 
- Is putting this in host_vars correct? 
- Last night I saw another answer using set_fact, would that help? 

謝謝你的任何見解。我現在已經使用了Ansible 3.5周!我使用靜態和動態庫存做得非常好,但是由於庫存清單並不明顯,因此造成了這種情況,給出了匹配對的格式。

注意:很多人都建議使用host_vars,但在我看來,保留給主機名以及相關的端口和代理值。我可能是錯的。

============================================== =====================

更新:感謝您的正確方向的幫助。 我已更新我們的庫存腳本以JSON輸出主機列表。 第一個新選項是使用JSON輸出主機。 示例: {「my_host」:[「servername1」,「servername2」,]}

將此稱爲動態庫存腳本,效果很好!

ansible all -m ping servername1 | SUCCESS => { 「changed」:false, 「ping」:「pong」 } servername2 | SUCCESS => { 「變爲」:假, 「平」:「傍」 }

下一頁:第二個新的選擇清單腳本是一個新的開關添加到輸入一個主機名。這部分仍然讓我困惑。下面是輸出: showInv主機= servername1

{ 「servername1」: 「processname1」, 「processname2」, 「processname3」]}

,我很想念最後一部分是如何我請在我的劇本中使用特定的「--host = {{my_host}}來調用庫存腳本。

似乎我需要找到現有主機名的變量,並將該變量傳回庫存腳本開關選項「--host =」

回答

2

你說你可以動態存貨。做你自己的。

這裏是the docs

你需要做一個腳本,將做兩件事情:當--list執行

  • ,處理您的文件和打印此JSON到stdout:

    { "myhosts": ["servername1", "servername2", "servername3"] } 
    
  • --host servername1執行,將此JSON打印到標準輸出:

    { "myprocesses": ["processname1", "processname2"] } 
    

所以用--list你應該提供uniq主機列表。在我的例子中,他們屬於myhosts組。

並與--host <hostname>你應該提供該主機的主機變量列表字典(<hostname>)。在我的例子中有一個列表變量myprocesses,其中包含該主機的所有進程。

然後只需撥打ansible-playbook -i my_inv_script myplaybook.yml

例劇本:

--- 
- hosts: myhosts 
    tasks: 
    - debug: 
     msg: "Process name is {{ item }}" 
     with_items: "{{ myprocesses }}" 

這個劇本將走線槽中的所有主機的動態庫存,並打印所有進程的每個主機。

+0

謝謝。我明白這應該如何工作。還有一個問題:第二次包含對庫存腳本的調用時,如何將-host 包含在-i my_inv_script中?我可以引用,是-i「my_inv_script --host {{myhosts}}」? – gantte

+0

您只需使用'-i my_inv_script'指定庫存腳本,然後Ansible在內部調用'my_inv_script --list'來列出所有主機,然後爲每個主機調用'my_inv_script --host '以獲取其變量。 –

+0

有沒有其他方法可以做到這一點?我的廣告資源腳本不支持「--list」。腳本是perl。該腳本需要多個選項才能從數據庫中獲得所需的輸出。我在bash shell腳本中用正確的選項包裝了perl腳本。例如:invList -a appReleasever -p平臺-e releaseVer等等。因此,通過包裝在bash shell中,基本shell的源代碼輸出動態庫存的主機列表。沒有「--list」我可以分配一個變量模擬添加--host = {{hostname}}嗎? – gantte

2

您需要開發一個動態庫存腳本,將第一列作爲主機我和第二列作爲該主機的變量。

請,找到下面的鏈接,我用PHP編寫的 https://github.com/walden-it/ansible-ij/blob/master/inventory.php

看看功能get_vars()和get_hosts(),看看是如何被填充陣列的動態庫存。

而如果你需要它,這裏是這個腳本是看數據庫的轉儲: https://github.com/walden-it/ansible-ij/blob/master/ansible.sql

然後你只用-i庫存指定它在ansible運行,或將其添加爲inventory_fileansible.cfg

+0

如果你能提高你的答案(我以爲你可以通過第二段你寫的),請做。它可以幫助更多的用戶使用相同的問題... –

1

關閉此項。在康斯坦丁的建議幫助下,我現在有一個工作的戲劇。什麼是不明顯的是,Ansible在幕後做了一些「魔術」。我必須修改我的庫存腳本,這會生成我的動態庫存以接受「--list」開關選項和「--host hostname」選項。

完成此操作後,我可以使用-i listInv運行劇本,Ansible內部將此腳本作爲listInv --list生成我的動態庫存列表。然後循環到with_items,並在內部調用腳本listInv --host {{項目}}並輸出匹配的流程名稱。

此外,我的腳本生成的JSON輸出必須使「組」(第一個)字段「myprocess」。最初,我把它當作「my_process」,並且失敗了。刪除下劃線,修正錯誤。

現在都在工作。這是學習的一個很好的例子,但它仍然很神奇。

的劇本是這樣的:

- hosts: all 
    gather_facts: no 
    connection: local 

    tasks: 
    - debug: 
     msg: "Process name is {{ item }}" 
     with_items: "{{ myprocess }}"