Ansible Inventory其實是包含靜態Inventory和動態Inventory兩部分,靜態Inventory指的是在文件/etc/ansible/hosts中指定的主機和組,Dynamic Inventory指經過外部腳本獲取主機列表,並按照ansible 所要求的格式返回給ansilbe命令的。這部分通常會結合CMDB資管系統、zabbix 監控系統、crobble安裝系統、雲計算平臺等獲取主機信息。因爲主機資源通常會動態的進行增減,而這些系統通常會智能更新。咱們能夠經過這些工具提供的API 或者接入庫查詢等方式返回主機列表。html
1、最簡單示例python
因爲Ansible在接受腳本動態獲取主機信息時支持的是json格式,這裏我也不從其餘系統中取了,向經過一段代碼打印一個段json格式的主機信息:linux
#!/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)
注:git
一、主機部分必須是列表格式的;github
二、hostdata行,其中的"hosts" 部分能夠省略,但若是使用時,必須是"hosts" ,不能是其餘如‘‘hostlist’’ 等字符串。json
省略後能夠這樣寫:api
hostdata = {group:host1ip,group2:host2ip}
直接執行該段代碼結果以下:bash
[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.25二、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
2、複雜示例測試
在靜態主機配置文件示例中,會有組變量(vars),組之間的包含,以下圖:
若是以上部分想要,經過腳本獲取實現,實現後返回的json格式應該以下圖:
像上面這種複雜的返回格式,通常不會用在ad-hoc環境中,多數會用在ansible-playbook 中,應爲playbook文件中有時假會涉及到vars 參數的傳參。
3、從第三方平臺獲取主機示例
這個在本篇一開頭就提到了,咱們從如cobbler、cmdb等平臺上獲取的示例。因爲ansible 的發起者(做者)同時又是cobbler軟件的建立者,因此官方文檔給了咱們cobbler的示例,同時給出了一個從AWS 去上獲取主機信息的示例 。以下:
關於如何從aws上獲取主機信息併入庫,這個我以前也寫過相關的篇章,具體也能夠參看我以前的博文----AWS主機資產管理 (該篇也是純python實現的)。
經過zabbix api 獲取主機信息,我也寫過一篇zabbix小結(八)Zabbix api ,想要經過zabbix平臺上獲取主機列表信息也能夠參考下。
4、其餘
一、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
二、-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`?
原文來自:http://www.361way.com/ansible-dynamic-inventory/4403.html
本文地址:https://www.linuxprobe.com/ansible-dynamic-inventory.html編輯:張雄,審覈員:逄增寶