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使用變量的優先級順序從高到低為:
host_vars下定義變量
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節