Ansible Inventory實際上是包含靜態Inventory和動態Inventory兩部分,靜態Inventory指的是在文件/etc/ansible/hosts中指定的主機和群組,Dynamic Inventory指透過外部腳本獲取主機列表,並按照ansible 所要求的格式傳回給ansilbe指令的。這部分一般會結合CMDB資管系統、zabbix 監控系統、crobble安裝系統、雲端運算平台等取得主機資訊。由於主機資源一般會動態的進行增減,而這些系統一般會智慧更新。我們可以透過這些工具提供的API 或存取庫查詢等方式傳回主機清單。
由於Ansible在接受腳本動態取得主機資訊時支援的是json格式,這裡我也不從其他系統中取了,向透過一段程式碼列印一個段json格式的主機資訊:
#!/usr/bin/env python # coding=utf-8 import json host1ip = ['10.212.52.252','10.212.52.14'] host2ip = ['10.212.52.16'] group = 'test1' group2 = 'test2' hostdata = {group:{"hosts":host1ip},group2:{"hosts":host2ip}} print json.dumps(hostdata,indent=4)
註:
1、主機部分必須是列表格式的;
2、hostdata行,其中的"hosts" 部分可以省略,但如果使用時,必須是"hosts" ,不能是其他如‘‘hostlist’’ 等字串。
省略後可以這樣寫:
hostdata = {group:host1ip,group2:host2ip}
直接執行該段程式碼結果如下:
[root@361way.com ~]# python twogroup.py { "test1": { "hosts": [ "10.212.52.252", "10.212.52.14" ] }, "test2": { "hosts": [ "10.212.52.16" ] } }
上面定義了兩個主機群組,test1群組內包含主機10.212.52.252、10.212.52.14,test2群組內包含主機10.212.52.16 。 ansible可以透過以下方法呼叫:
[root@361way.com ~]# ansible -i twogroup.py test1 -m command -a 'uptime' -k SSH password: 10.212.52.252 | success | rc=0 >> 23:01pm up 24 days 8:24, 2 users, load average: 0.21, 0.35, 0.39 10.212.52.14 | success | rc=0 >> 23:08pm up 332 days 5:23, 2 users, load average: 0.00, 0.01, 0.05 [root@361way.com ~]# ansible -i twogroup.py test2 -m command -a 'uptime' -k SSH password: 10.212.52.16 | success | rc=0 >> 23:09pm up 332 days 6:00, 2 users, load average: 0.08, 0.06, 0.05
在靜態主機設定檔範例中,會有群組變數(vars),群組之間的包含,如下圖:
如果以上部分想要,透過腳本取得實現,實現後回傳的json格式應該如下圖:
像上面這種複雜的返回格式,一般不會用在ad-hoc環境中,多數會用在ansible-playbook 中,應為playbook文件中有時假會涉及到vars 參數的傳參。
這個在本篇一開頭就提到了,我們從如cobbler、cmdb等平台上取得的範例。由於ansible 的發起者(作者)同時又是cobbler軟體的創建者,所以官方文件給了我們cobbler的範例,同時給出了一個從AWS 去上獲取主機資訊的範例 。如下:
cobbler 上取得主機資訊代碼
aws 雲端上取得主機資訊代碼
關於如何從aws上獲取主機資訊併入庫,這個我之前也寫過相關的篇章,具體也可以參考我之前的博文————AWS主機資產管理 (該篇也是純python實現的)。
透過zabbix api 取得主機信息,我也寫過一篇zabbix小結(八)Zabbix api ,想要透過zabbix平台上取得主機清單資訊也可以參考下。
1、ansible -i 參數後調用的腳本並非一定是py檔,也可以是其他腳本輸出的結果,這裡做了個簡單的測試:
[root@361way.com yaml]# ansible -i group.sh test1 -m command -a 'uptime' -k SSH password: 10.212.52.16 | success | rc=0 >> 00:18am up 332 days 7:10, 2 users, load average: 0.00, 0.01, 0.05 10.212.52.14 | success | rc=0 >> 00:17am up 332 days 6:32, 2 users, load average: 0.01, 0.03, 0.05 10.212.52.252 | success | rc=0 >> 00:11am up 24 days 9:33, 2 users, load average: 0.49, 0.42, 0.41 [root@localhost yaml]# cat group.sh #!/bin/bash groups=''' { "test1": { "hosts": [ "10.212.52.252", "10.212.52.14", "10.212.52.16" ] } } ''' echo $groups
2、-i 參數指定的腳本需要有可執行權限 ,不然會報錯,如下:
[root@361way.com yaml]# ansible -i hostjson.py AA -a 'uptime' ERROR: The file hostjson.py looks like it should be an executable inventory script, but is not marked executable. Perhaps you want to correct this with `chmod +x hostjson.py`?
以上是Ansible Dynamic Inventory 介紹的詳細內容。更多資訊請關注PHP中文網其他相關文章!