1. 程式人生 > 實用技巧 >ansible playbook中的變數定義與引用

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使用變數的優先順序順序從高到低為:

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節