《動態Inventory功能詳解》要點:
本文介紹了動態Inventory功能詳解,希望對您有用。如果有疑問,可以聯系我們。
在大多數情況下,靜態Inventory文件可以很好的描述主機間的關系.尤其是服務器規模不大的情況的情況下,即便是手區來編輯更新Inventory文件也非常的方便快捷.
然而,我們所生活的時候是云計算和大規模集群的時代.在實際生產應用中,經常會遇到業務的快速發展或者流量的急劇增加等等情況,需要在短時間內向架構中添加幾十臺甚至上百臺服務器來提高整個架構的處理能力.這個時候,手動管理Inventory文件不僅沒有效率,而且非常的乏味.
此時,動態Inventory應運而生.Ansible通過調用第三方腳本來動態的配置Inventory文件.目前,一些知名的云主機供應商,如亞馬遜AWS、Cobbler、gitalOcean、Lnode、OpenStack等提供了現成的腳本可供Ansible直接調用,其具體的用法,在對應的平臺上都有詳盡的官方文檔說明顯,這里我們就不在贅述.接下來我們將借助實際安全,詳細介紹如何自行開發動態Inventory文件的腳本.
Ansible啟用動態Inventory 是通過調用外部腳本(任何腳本都可以,二進制文件也可以,只要運行結果返回的是JSON 串就可以) 生成指定格式的JSON串 .Ansible可以對JSON格式的字符串對行解析,并最給將基轉化為Ansible可用的Inventory文件格式.所以,所謂的動態Inventory文件腳本開發其實就是編寫腳本根據具體環境將主機信息及關系(這些數據可以通過抓取數據庫,調用外部API或者直接讀取文件獲得)以JSON格式來表示出來,并將其做為腳本輸出結果傳給Ansible.
需要注意的是,用于生成JSON代碼的腳本必須支持兩個選項:
--list
:返回所有的主機組信息,每個組都應該包含字典形式的主機列表,子組列表,如果需要的話還應該組變量,最簡單的信息是只包含主機列表,返回的數據格式要是JSON格式的--host <hostname>
:返回該主機的變量列表,或者是返回一個空的字典,JSON格式.ansible all -i my-inventory-script -m ping
雖然在命令中并未體現,但Ansible默認是通過調用腳本的—list選項來獲取JSON代碼的.下面是一段由腳本生成的JSON代碼:
“databases”: {
“hosts”: [
“192.168.28.71”,
“192.168.28.72”
],
“vars”: {
“ansible_ssh_user”: “johndoe”,
“ansible_ssh_private_key_file”: “~/.ssh/mykey”,
? ? ? ? ? ? “example_variable”: “value”
? ? ? ? }
? },
? ? “_meta”: {
? ? ? “hostvars”: {
“192.168.28.71”: {
? ? ? ? ? ? ? ? “host_specific_var”: “bar”
? ? ? ? ? ? },
? ? ? ? ? “192.168.28.72”: {
? ? ? ? ? ? ? ? “host_specific_var”: “foo”
? ? ? ? ? ? }
? ? ? }
? }
}
在本例中,databases為主機組名,可自定義.hosts為固定字段,用于以列表形式定義主機組的主機.vars也為固定字段,用于為主機組設置主機組變量.字典_meta中定義的是主機變量.
主機變量并不是Inventory文件中必須的,所以_meta字典也不是必須生成的.當我們的Inventory腳本中生成_meta字典時,Ansible會將_meta信息存放在緩存中,當任務中需要調用這些主機變量時,會直接從緩存中讀取,而不是調用一次變量就執行一次Inventory腳本,這樣大大提高了運行效率.
原文出處——運維部落微信公眾號
轉載請注明本頁網址:
http://www.snjht.com/jiaocheng/4510.html