開發動態的Inventory資料來源¶
Topics
如 動態 Inventory 所介紹,ansible可以從一個動態的資料來源獲取到inventory資訊,包含雲端資料來源
怎麼寫一個自己的資料來源?
很簡單!我們僅僅需要建立一個在適當參數下,能夠返回正確JSON格式資料的指令碼或者程式,你可以使用任何語言來實現.
指令碼規範¶
當我們在外部使用``–list``參數呼叫這個指令碼時,這個指令碼必須返回一個JSON雜湊/字典,它包含所管理的所有組.每個組的value應該是一個關於其包含的主機/IP雜湊/字典,它可能是一個子組或者組的變數或者僅僅是一個主機/IP的列表, 例如:
{
"databases" : {
"hosts" : [ "host1.example.com", "host2.example.com" ],
"vars" : {
"a" : true
}
},
"webservers" : [ "host2.example.com", "host3.example.com" ],
"atlanta" : {
"hosts" : [ "host1.example.com", "host4.example.com", "host5.example.com" ],
"vars" : {
"b" : false
},
"children": [ "marietta", "5points" ]
},
"marietta" : [ "host6.example.com" ],
"5points" : [ "host7.example.com" ]
}
New in version 1.0.
在版本1.0之前,每一個組只能是一個包含hostnames/IP Address的列表,像上面的webservers, marietta, 5points組
當我們使用``–host <hostname>``(這裡的<hostname>只指相對上面資料中的host)參數呼叫時,這個指令碼必須返回一條空的JSON 雜湊/字典, 或者關於變數的JSON雜湊/字典,這些變數將被用來模板或者playbooks. 返回變數是可選的,如果指令碼不希望這樣做,返回一條空的雜湊/字典即可:
{
"favcolor" : "red",
"ntpserver" : "wolf.example.com",
"monitoring" : "pack.example.com"
}
開啟呼叫外部Inventory指令碼¶
New in version 1.3.
這個inventory腳本系統在所有的Ansible版本中都將會被呼叫,但是當使用``–host``參數操作每一臺主機時,這將是十分麻煩(低效率),尤其是當它用在呼叫遠端子系統時.在Ansible 1.3以後的版本(包含1.3),如果inventory指令碼返回的頂級元素為”_meta”,它可能會返回所有主機的變數.如果這個元素中包含一個名為”hostvars”的value,這個inventory指令碼對每一臺主機使用``–host``時將不會被呼叫.這將大大增加主機的執行效率,並且也使客戶端更容易實現這個指令碼的資料快取.
這個資料將會被新增到JSON字典的頂級,像下面的格式:
{
# results of inventory script as above go here
# inventory指令碼將到此終止
# ...
"_meta" : {
"hostvars" : {
"moocow.example.com" : { "asdf" : 1234 },
"llama.example.com" : { "asdf" : 5678 },
}
}
}
See also
- Python API
- Python API to Playbooks and Ad Hoc Task Execution
- Developing Modules
- How to develop modules
- Developing Plugins
- How to develop plugins
- Ansible Tower
- REST API endpoint and GUI for Ansible, syncs with dynamic inventory
- Development Mailing List
- Mailing list for development topics
- irc.freenode.net
- #ansible IRC chat channel