Ansible的inventory檔案定義了它要操作的一些主機,它可以通過inventory對這些主機進行操控。預設的inventory檔案是 /etc/ansible/hosts
。也可通過-i選項,來指定不同的inventory檔案。
Ansible也支援從雲中拉取inventory檔案執行,拉取的檔案可以試
YMAL,ini,etc
等格式。 這個是在ansbible 的 2.4版本新引入的功能,Ansible也有inventory的插件來讓inventory變的更靈活和自定義化。
inventory的格式一般如下:
mail.example.com
[webservers]
foo.example.com
bar.example.com
[dbservers]
one.example.com
two.example.com
three.example.com
關于inventory的較長的描述,參考我早期參與的翻譯項目,
Ansible 中文權威動态inventory
靜态 Inventory 指的是在檔案中指定的主機群組,動态 Inventory 指通過外部腳本擷取主機清單,并按照 ansible 所要求的格式傳回給 ansilbe 指令的。這部分一般會結合 CMDB 資管系統、雲計算平台等擷取主機資訊。
看到一段很不錯的代碼,參考下。
#!/usr/bin/python
#!/Users/aihe/.pyenv/shims/python
#coding : utf-8
import json
import sys
def group():
host1 = ['192.168.0.112']
host2 = ['192.168.0.112','192.168.0.109']
group1 = 'test1'
group2 = 'test2'
hostdata = {
group1:{"hosts":host1},
group2:{"hosts":host2}
}
print(json.dumps(hostdata,indent=4))
def host(ip):
info_dict = {
"192.168.0.112": {
"ansible_ssh_host":"192.168.0.112",
"ansible_ssh_port":22,
"ansible_ssh_user":"root",
"ansible_ssh_pass":"123457"
},
"192.168.0.109": {
"ansible_ssh_host":"192.168.0.109",
"ansible_ssh_port":22,
"ansible_ssh_user":"root",
"ansible_ssh_pass":"xxxx"
}
}
# 判斷key是否在字典中,在的話列印出來,不在的話列印空字典。
if ip in info_dict:
print(json.dumps(info_dict[ip],indent=4))
else:
print(json.dumps({},indent=4))
if len(sys.argv) == 2 and (sys.argv[1] == '--list'):
group()
elif len(sys.argv) == 3 and (sys.argv[1] == '--host'):
host(sys.argv[2])
else:
print("Usage: %s --list or --host <hostname>" % sys.argv[0])
sys.exit(1)
- 單獨執行的時候 image.png
Ansible Inventory指北進階 - 結合Ansible執行。雖然連接配接報錯誤了,但是這因為主機是随便定義的,如果是可以連接配接的主機則是正常工作的。
Ansible Inventory指北進階
到這裡,其實我們的動态inventory大體架構已經出來了,剩下的則是将代碼中的寫死變為動态擷取,資料庫或其它持久存儲的地方擷取即可。
問題
在寫這段代碼的時候遇到幾個問題,很有意思,解決問題的過程就是讓我們成長的過程...
另外報的錯誤實在也是有點迷惑人啊。
inventory插件問題
- 錯誤截圖,看到因為ini的插件無法解析json資料
Ansible Inventory指北進階
檢視所有可用的插件清單
ansible-doc -t inventory -l
- 更改ansible的inventory可用插件。啟用Ansible插件的配置在/etc/ansible/ansible.cfg檔案中,具體是那個檔案在起作用,執行執行
指令就可以看到。ansible --version
Ansible Inventory指北進階
修改插件的位置在。
執行格式問題
錯誤中還有關于執行格式錯誤的資訊。
-
錯誤原因
剛開始一直報執行格式錯誤問題,這個問題有點荒唐,因為我安裝了pyenv,python執行的路徑在開頭寫成了
#!/Users/aihe/.pyenv/shims/python
而這個檔案是sh檔案,普通的可執行文本檔案了,導緻出錯,暈掉...
- 解決方案
将開頭的#!修改為python的解釋器。然後就執行成功了。
#!/usr/bin/python
最後
要知道inventory的格式,inventory在ansible中可以了解為主機清單。動态的inventory可以給我們提供很多便利的操作,我們可以更靈活的控制主機了。
如果你的資料格式,在已有的inventory插件中,你也可以自己嘗試開發一個,具體開發參考下面的參考部分。