ansible playbook中的變數定義與引用
Ansible playbook中變數的定義與引用有很多種方法,這裡在本地環境測試驗證,並整理如下
測試環境:
使用自己的Mac筆記本上安裝ansible作為控制伺服器,VMware Fusion虛擬機器上運行了一個Centos7的虛擬機器(192.168.243.146)作為遠端被控主機
測試用playbook如下:
cat test.yml --- - hosts: test remote_user: root tasks: - name: debug debug: msg="The {{ inventory_hostname }} Value is {{ keyvalue }}"
1 在Inventory檔案中定義變數
將變數定義在inventory檔案(預設為etc/ansible/hosts檔案)中,如下定義一個名為keyvalue的變數:
--- # 針對單個主機定義變數 192.168.243.146 keyvalue=centos [test] 192.168.243.146 # 組定義變數 [test:vars] keyvalue=vmware centos7
如上所示,有針對單個主機定義變數和組定義變數兩種方式。
1)組定義變數的作用範圍是組下的所有主機
2)當兩種定義方式同時存在時,ansible會優先採用單個主機定義的變數值
2 通過host_vars和group_vars目錄來定義變數
/etc/ansible/目錄是linux系統上ansible預設的配置檔案目錄(Mac系統上的話,其預設配置目錄是在/usr/local/etc/ansible/),在該目錄下建立host_vars和group_vars兩個目錄用來存放定義變數的檔案。如:
針對單個主機的變數
cat host_vars/192.168.243.146 --- keyvalue: 192.168.243.146@host_vars
針對test組的變數
cat group_vars/test --- keyvalue: test@group_vars
同樣,單個主機定義的變數優先順序高於組定義的變數。經過實驗,和1中介紹的變數定義方法相比,ansible使用變數的優先順序順序從高到低為:
inventory中單個主機定義變數
group_vars下定義變數
inventory中組定義變數
3 通過ansible-playbook命令列傳入
在執行playbook命令時,通過-e選項傳入引數:
ansible-playbook test.yml -e "keyvalue=inputed"
此外,ansible-playbook還支援yaml和json檔案的方式傳入變數:
cat vars.yml --- keyvalue: vars@yaml
cat vars.json {"keyvalue": "vars@json"}
這種方式傳入的變數,比1和2中介紹的變數定義的優先順序都要高。
4 在playbook的yaml檔案中使用vars欄位定義
cat test.yml --- - hosts: test remote_user: root vars: keyvalue: vars in playbook tasks: - name: debug debug: msg="The {{ inventory_hostname }} Value is {{ keyvalue }}"
通過vars欄位,直接在playbook中定義變數。優先順序高於1和2定義方法,低於3中命令列傳入方法。
5 在playbook的yaml檔案中使用vars_files欄位定義
cat test.yml --- - hosts: test remote_user: root vars_files: - vars.yml tasks: - name: debug debug: msg="The {{ inventory_hostname }} Value is {{ keyvalue }}"
通過vars_files欄位,直接在playbook中引入定義變數的檔案,支援yaml和json兩種檔案格式的定義變數。優先順序高於1和2定義方法,低於3中命令列傳入方法。
6 使用register傳遞變數
register方式用於在task之間傳遞變數。
cat register.yml --- - hosts: test remote_user: root tasks: - name: register test shell: hostname register: info - name: display info debug: msg="Hostname is {{ info }}"
register定義的info變數在第二個task中用來檢視前一個task中執行的hostname命令的結果。可以看到playbook執行後的結果中,info返回的是一段python字典資料,如果只想看到stdout部分的資訊的話,可以通過info[‘stdout’]來引用。
cat register.yml --- - hosts: test remote_user: root tasks: - name: register test shell: hostname register: info - name: display info debug: msg="Hostname is {{ info['stdout'] }}"
7 使用vars_prompt互動式傳入變數
在playbook中定義vars_prompt的變數名和互動式提示資訊,就可以實現在執行playbook時,通過互動的傳入變數值。
cat prompt.yml --- - hosts: test remote_user: root vars_prompt: - name: "var1" prompt: "input value for var1" private: no - name: "var2" prompt: "input value for var2" private: yes default: 'test var2' tasks: - name: display var1 debug: msg="The value of var1 is {{ var1 }}" - name: display var2 debug: msg="The value of var2 is {{ var2 }}"
執行結果為:
private欄位用來定義互動時是否回顯輸入的值,預設private為yes;default用來定義變數的預設值。
參考資料:
《Ansible自動化運維 技術與實踐》4.2節