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節

發佈了101 篇原創文章 · 獲贊 48 · 訪問量 41萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章