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節