ansible playbook中的變量
目錄
?一、變量的優先級
?1.1 YAML陷阱
?二、 Ansbile-playbook變量配置方法
?2.1 在inventory主機清單文件中定義變量
?2.2 通過host_vars和group_vars目錄來定義變量
?2.3 通過var_files定義變量
?2.4 通過vars_prompt交互式傳入變量
?2.5 通過ansible-playbook命令行定義變量!即參數傳入變量
?2.6 在playbook劇本中定義變量
?2.7 通過roles角色定義變量
?2.8 使用Facts獲取的信息
?2.9 register注冊變量
?2.10 hostvars 變量
?2.11 列表變量、循環變量、字典變量
一、變量的優先級
?extra vars變量(在命令行中使用-e);優先級最高;
? 在inventory中定義的連接變量(比如ansible_ssh_user);優先級第二;
? 大多數的其他變量(命令行轉換,play中的變量,include的變量,role的變量等);優先級第三;
? 在inventory定義的其他變量;優先級第四;
? 有系統發現的facts;優先級第五;
? "role默認變量",這個是最默認的值,很容易喪失優先權。優先級最??;
另外:在inventory清單列表里定義的變量:單個主機定義的變量優先級高于主機組定義的變量
經過實驗,ansible使用inventory定義變量的優先級順序從高到低為:
host_vars下定義變量 ---> inventory中單個主機定義變量 ---> group_vars下定義變量 ---> inventory中組定義變量
1.1 YAML陷阱
YAML語法要求如果值以{{ foo }}開頭的話,那么就需要將整行用雙引號包起來,這是為了確認你不是想聲明一個YAML字典。
如下面配置是不行的!??!
| | | |---|---| | |---| | |-hosts:app_servers| | |vars:| | |app_path:{{base_path}}/data/web|
應該改成下面這樣:
| | | |---|---| | |---| | |-hosts:app_servers| | |vars:| | |app_path:"{{ base_path }}/data/web"|
二、 Ansbile-playbook變量配置方法
2.1 在inventory主機清單文件中定義變量
可以直接定義在主機清單文件/etc/ansible/hosts中,表明該變量只對對應的主機或者組有效,對其余的主機和組無效。
示例:
| | | | --- | --- | | | $ egrep -v "^#|^$" /etc/ansible/hosts | | | 10.4.7.101 key=20180101 | | | 10.4.7.102 key="niubility" | | | | | | $ vim ansi.yml | | | --- | | | - hosts: all | | | gather_facts: False | | | tasks: | | | - name: haha | | | debug: msg="the {{ inventory_hostname }} value is {{ key }}" | | | | | | # 執行結果(注意inventory_hostname代表inventory列表列表里被控節點的主機名): | | | | | | $ ansible-playbook ansi.yml | | | | | | PLAY [all] ************************************************************************************************************************************** | | | | | | TASK [haha] ************************************************************************************************************************************* | | | ok: [10.4.7.101] => { | | | "msg": "the 10.4.7.101 value is 20180101" | | | } | | | ok: [10.4.7.102] => { | | | "msg": "the 10.4.7.102 value is niubility" | | | } | | | | | | PLAY RECAP ************************************************************************************************************************************** | | | 10.4.7.101 : ok=1 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 | | | 10.4.7.102 : ok=1 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 |
2.2 通過host_vars和group_vars目錄來定義變量
/etc/ansible/目錄是linux系統上ansible默認的配置文件目錄(Mac系統上的話,其默認配置目錄是在/usr/local/etc/ansible/),在該目錄下創建host_vars和group_vars兩個目錄用來存放定義變量的文件。
針對單個主機的變量
| | $ cat /etc/ansible/host_vars/10.4.7.101 | | | --- | | | user: root | | | pass: root@123 |
針對test組的變量
| | $ cat /etc/ansible/group_vars/test | | | --- | | | user: work | | | pass: work@123 |
在inventory清單列表文件里,單個主機定義的變量優先級高于主機組定義的變量
2.3 通過var_files定義變量
| | $ cat vars.yml | | | --- | | | key: jiayou | | | | | | $ cat bo.yml | | | --- | | | - hosts: all | | | gather_facts: False | | | vars_files: | | | - vars.yml | | | tasks: | | | - name: display | | | debug: msg="the {{ inventory_hostname }} valus is {{ key }}" | | | | | | $ ansible-playbook bo.yml | | | | | | PLAY [all] ************************************************************************************************************************************** | | | | | | TASK [display] ********************************************************************************************************************************** | | | ok: [10.4.7.101] => { | | | "msg": "the 10.4.7.101 valus is jiayou" | | | } | | | ok: [10.4.7.102] => { | | | "msg": "the 10.4.7.102 valus is jiayou" | | | } | | | | | | PLAY RECAP ************************************************************************************************************************************** | | | 10.4.7.101 : ok=1 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 | | | 10.4.7.102 : ok=1 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 |
2.4 通過vars_prompt交互式傳入變量
在playbook中定義vars_prompt的變量名和交互式提示信息,就可以實現在運行playbook時,通過交互的傳入變量值。
private字段:用來定義交互時是否回顯輸入的值,默認private為yes;
default字段:用來定義變量的默認值。
| | $ cat prom.yml | | | --- | | | - hosts: test | | | remote_user: root | | | vars_prompt: | | | - name: "var1" | | | prompt: "please input you name" | | | private: no | | | - name: "var2" | | | prompt: "please input you age" | | | private: yes | | | default: 18 | | | tasks: | | | - name: display var1 | | | debug: msg="your name of var1 is {{ var1 }}" | | | - name: display var2 | | | debug: msg="you age of var2 is {{ var2 }}" | | | | | | $ ansible-playbook prom.yml | | | please input you name: lvzhenjiang # 把輸入的內容傳遞給變量var1。輸入的值顯示出來! | | | please input you age [18]: # playbook中定義默認值是18,如果不輸入便是18,但是輸入的值不顯示出來!比如這里輸入的23 | | | | | | PLAY [test] ************************************************************************************************************************************* | | | | | | TASK [Gathering Facts] ************************************************************************************************************************** | | | ok: [10.4.7.101] | | | | | | TASK [display var1] ***************************************************************************************************************************** | | | ok: [10.4.7.101] => { | | | "msg": "your name of var1 is lvzhenjiang" | | | } | | | | | | TASK [display var2] ***************************************************************************************************************************** | | | ok: [10.4.7.101] => { | | | "msg": "you age of var2 is 23" | | | } | | | | | | PLAY RECAP ************************************************************************************************************************************** | | | 10.4.7.101 : ok=3 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 |
2.5 通過ansible-playbook命令行定義變量!即參數傳入變量
除了vars_prompt和vars_files,也可以通過Ansible命令行發送變量。如果想要編寫一個通用的發布playbook時則特別有用!你可以傳遞應用的版本以便部署。例如下面命令(注意:--extra-vars相等于 -e)
| | $ cat exap.yml | | | --- | | | - hosts: '{{hosts}}' | | | remote_user: '{{user}}' | | | tasks: | | | - name: "一個測試" | | | debug: msg="your hosts is {{hosts}}, user is {{user}}" | | | | | | $ ansible-playbook exap.yml -e "hosts=test user=root" | | | [WARNING]: Found variable using reserved name: hosts | | | | | | PLAY [test] ************************************************************************************************************************************* | | | | | | TASK [Gathering Facts] ************************************************************************************************************************** | | | ok: [10.4.7.101] | | | | | | TASK [一個測試] ************************************************************************************************************************************* | | | ok: [10.4.7.101] => { | | | "msg": "your hosts is test, user is root" | | | } | | | | | | PLAY RECAP ************************************************************************************************************************************** | | | 10.4.7.101 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 |
也可以將參數放在文件里面進行傳遞(注意命令行里要是用"@文件名"):
| | | | --- | --- | | | # 同樣使用上面的例子 | | | $ cat anhui.yml | | | --- | | | hosts: test | | | user: root | | | | | | $ ansible-playbook exap.yml -e "@anhui.yml" | | | [WARNING]: Found variable using reserved name: hosts | | | | | | PLAY [test] ************************************************************************************************************************************* | | | | | | TASK [Gathering Facts] ************************************************************************************************************************** | | | ok: [10.4.7.101] | | | | | | TASK [一個測試] ************************************************************************************************************************************* | | | ok: [10.4.7.101] => { | | | "msg": "your hosts is test, user is root" | | | } | | | | | | PLAY RECAP ************************************************************************************************************************************** | | | 10.4.7.101 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 |
2.6 在playbook劇本中定義變量
在playbook中定義變量需要用到Ansible的vars模塊,可以將所有需要用到的變量統一在vars模塊下定義,定義格式需要遵循YAML語言格式:
語法格式:
| | | | --- | --- | | | vars: | | | - var1: value1 | | | - var2: value2 | | | - var3: value3 | | | - ....: ..... |
示例如下:
| | $ cat playbook.yml | | | --- | | | - hosts: test | | | remote_user: root | | | vars: | | | - dir1: /root/Ansible | | | - dir2: /root/Ansible/test1 | | | - dir3: /root/Ansible/test2 | | | tasks: | | | - name: Create New Folder | | | file: name={{ dir1 }} state=directory | | | - name: Create New Folder | | | file: name={{ dir2 }} state=directory | | | - name: Create New Folder | | | file: name={{ dir3 }} state=directory | | | | | | $ ansible-playbook playbook.yml | | | | | | PLAY [test] ************************************************************************************************************************************* | | | | | | TASK [Gathering Facts] ************************************************************************************************************************** | | | ok: [10.4.7.101] | | | | | | TASK [Create New Folder] ************************************************************************************************************************ | | | changed: [10.4.7.101] | | | | | | TASK [Create New Folder] ************************************************************************************************************************ | | | changed: [10.4.7.101] | | | | | | TASK [Create New Folder] ************************************************************************************************************************ | | | changed: [10.4.7.101] | | | | | | PLAY RECAP ************************************************************************************************************************************** | | | 10.4.7.101 : ok=4 changed=3 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 |
2.7 通過roles角色定義變量
在Ansible的roles中定義變量,需要將變量及值的鍵值對形式寫到roles的vars目錄下的main.yml文件中,同樣適用YAML語言格式,格式如下:
| | | | --- | --- | | | var1: value1 | | | var2: value2 | | | var3: value3 |
但是請注意:通過Roles定義的變量只適用于當前roles。
| | | | --- | --- | | | # roles目錄結構 | | | $ tree . | | | . | | | ├── hosts | | | ├── playbook.yml | | | └── test | | | ├── files | | | ├── tasks | | | │ └── main.yml | | | ├── templates | | | └── vars | | | └── main.yml | | | | | | 5 directories, 4 files | | | | | | $ cat test/tasks/main.yml | | | - name: create directory | | | file: name={{ dir }} state=directory | | | - name: Get IP Address | | | shell: echo `{{ cmd }}` >> {{ dir }}/{{ file }} | | | | | | $ cat test/vars/main.yml | | | cmd: hostname -I | | | | | | $ cat playbook.yml | | | --- | | | - hosts: test | | | remote_user: root | | | roles: | | | - test | | | | | | $ cat hosts | | | [test] | | | 10.4.7.101 dir=/root/node2 | | | 10.4.7.102 dir=/root/node1 | | | | | | [node1] | | | 10.4.7.100 | | | | | | [test:vars] | | | file=hostname.txt | | | | | | $ ansible-playbook -i hosts playbook.yml | | | | | | PLAY [test] ************************************************************************************************************************************* | | | | | | TASK [Gathering Facts] ************************************************************************************************************************** | | | ok: [10.4.7.101] | | | ok: [10.4.7.102] | | | | | | TASK [test : create directory] ****************************************************************************************************************** | | | ok: [10.4.7.101] | | | ok: [10.4.7.102] | | | | | | TASK [test : Get IP Address] ******************************************************************************************************************** | | | changed: [10.4.7.102] | | | changed: [10.4.7.101] | | | | | | PLAY RECAP ************************************************************************************************************************************** | | | 10.4.7.101 : ok=3 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 | | | 10.4.7.102 : ok=3 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 |
2.8 使用Facts獲取的信息
還有其它地方可以獲取變量, 這些變量是自動發現的,而不是用戶自己設置的。Facts通過訪問遠程系統獲取相應的信息,一個很好的例子就是遠程主機的IP地址或者操作系統是什么。
| | | | --- | --- | | | $ ansible test -m setup | | | # 使用以下命令可以查看哪些信息是可用的(test是上面在/etc/ansible/hosts列表文件中配置的主機群組) | | | | | | $ ansible test -m setup|grep "ansible_python_version" | | | "ansible_python_version": "2.7.5", | | | # 在playbook中這樣引用上面被控制主機的python版本: {{ ansible_python_version }} | | | | | | $ ansible test -m setup|grep "ansible_nodename" | | | "ansible_nodename": "template", | | | # 可以在playbook中這樣引用上面被控制主機的主機名: {{ ansible_nodename }} | | | | | | $ ansible test -m setup | grep "ansible_hostname" | | | "ansible_hostname": "template", | | | # 被控制主機的主機名變量還可以是: {{ ansible_hostname }} |
如果關閉Facts,可以大大提高ansible的執行速度 ,關閉方法如下:
| | $ cat anhui.yml | | | --- | | | - hosts: test | | | gather_facts: no |
2.9 register注冊變量
變量的另一個主要用途是在運行命令時,把命令結果存儲到一個變量中,不同模塊的執行結果是不同的。運行playbook時使用-v選項可以看到可能的結果值,ansible執行任務的結果值可以保存在變量中,以便稍后使用它。register方式主要用于在task之間傳遞變量。
| | | | --- | --- | | | $ cat /etc/ansible/hosts | | | [test] | | | 10.4.7.101 | | | 10.4.7.102 | | | | | | $ cat register.yml | | | --- | | | - hosts: test | | | remote_user: root | | | tasks: | | | - name: register bo_test | | | shell: hostname -I | | | register: info | | | - name: display info | | | debug: msg="this host ip is {{ info['stdout'] }}" | | | | | | $ ansible-playbook register.yml | | | | | | PLAY [test] ************************************************************************************************************* | | | | | | TASK [Gathering Facts] ************************************************************************************************** | | | ok: [10.4.7.102] | | | ok: [10.4.7.101] | | | | | | TASK [register bo_test] ************************************************************************************************* | | | changed: [10.4.7.102] | | | changed: [10.4.7.101] | | | | | | TASK [display info] ***************************************************************************************************** | | | ok: [10.4.7.101] => { | | | "msg": "this host ip is 10.4.7.101 " | | | } | | | ok: [10.4.7.102] => { | | | "msg": "this host ip is 10.4.7.102 " | | | } | | | | | | PLAY RECAP ************************************************************************************************************** | | | 10.4.7.101 : ok=3 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 | | | 10.4.7.102 : ok=3 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 |
2.10 hostvars 變量
該變量用于引用其他主機上收集的facts中的數據,或者引用其他主機的主機變量、主機組變量。即從一臺遠程主機獲取另一臺遠程主機的變量。
| | | | --- | --- | | | $ cat /etc/ansible/hosts | | | [test] | | | 10.4.7.101 addr=beijing | | | 10.4.7.102 user=shibo age=39 | | | | | | $ cat test.yml | | | --- | | | - hosts: test | | | remote_user: root | | | gather_facts: False | | | tasks: | | | - name: this is test1 | | | debug: msg="She is come from {{ hostvars['10.4.7.101']['addr'] }}" | | | - name: this is test2 | | | debug: msg="I am {{ hostvars['10.4.7.102']['user'] }}, and age is {{ hostvars['10.4.7.102']['age'] }}" | | | | | | $ ansible-playbook test.yml | | | | | | PLAY [test] ************************************************************************************************************* | | | | | | TASK [this is test1] **************************************************************************************************** | | | ok: [10.4.7.101] => { | | | "msg": "She is come from beijing" | | | } | | | ok: [10.4.7.102] => { | | | "msg": "She is come from beijing" | | | } | | | | | | TASK [this is test2] **************************************************************************************************** | | | ok: [10.4.7.101] => { | | | "msg": "I am shibo, and age is 39" | | | } | | | ok: [10.4.7.102] => { | | | "msg": "I am shibo, and age is 39" | | | } | | | | | | PLAY RECAP ************************************************************************************************************** | | | 10.4.7.101 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 | | | 10.4.7.102 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 |
2.11 列表變量、循環變量、字典變量
1)ansible的變量不僅可以是單個的值,也可以為列表,即ansible傳列表作為變量
| | $ cat test.yml | | | --- | | | - hosts: test | | | remote_user: root | | | gather_facts: False | | | vars: | | | - list: [1,2,3] | | | tasks: | | | - name: echo | | | debug: msg="{{ list }}" | | | | | | $ ansible-playbook test.yml | | | | | | PLAY [test] ************************************************************************************************************* | | | | | | TASK [echo] ************************************************************************************************************* | | | ok: [10.4.7.101] => { | | | "msg": [ | | | 1, | | | 2, | | | 3 | | | ] | | | } | | | ok: [10.4.7.102] => { | | | "msg": [ | | | 1, | | | 2, | | | 3 | | | ] | | | } | | | | | | PLAY RECAP ************************************************************************************************************** | | | 10.4.7.101 : ok=1 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 | | | 10.4.7.102 : ok=1 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored= |
2)循環列表
結合循環,這個特性就變得很有用;以參數傳遞列表給playbook,不用在playbook中固定循環的次數與內容。
| | $ cat test.yml | | | --- | | | - hosts: 10.4.7.101 | | | remote_user: root | | | gather_facts: False | | | vars: | | | - list: [1,2,3] | | | tasks: | | | - name: this is loop | | | debug: msg="{{ item }}" | | | with_items: '{{list}}' | | | | | | $ ansible-playbook test.yml | | | | | | PLAY [10.4.7.101] ******************************************************************************************************* | | | | | | TASK [this is loop] ***************************************************************************************************** | | | ok: [10.4.7.101] => (item=1) => { | | | "msg": 1 | | | } | | | ok: [10.4.7.101] => (item=2) => { | | | "msg": 2 | | | } | | | ok: [10.4.7.101] => (item=3) => { | | | "msg": 3 | | | } | | | | | | PLAY RECAP ************************************************************************************************************** | | | 10.4.7.101 : ok=1 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 |
****** 當你發現自己的才華撐不起野心時,就請安靜下來學習吧!******
鏈接:https://www.cnblogs.com/lvzhenjiang/p/14385777.html
-
主機
+關注
關注
0文章
1033瀏覽量
35802 -
變量
+關注
關注
0文章
614瀏覽量
28820 -
PlayBook
+關注
關注
0文章
7瀏覽量
12020
原文標題:Ansible Playbook中的變量使用技巧:提高自動化效率的必備利器
文章出處:【微信號:magedu-Linux,微信公眾號:馬哥Linux運維】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
RIM本周二發布黑莓PlayBook OS 2.0 現提供更新下載
黑莓Playbook拆解全過程

Ansible軟件平臺
遠端機器的臨時執行命令
RIM公司PlayBook平板電腦曝光
使用用Ansible重復部署ELK STACK

利用Ansible實現OpenStack自動化

利用Ansible實現OpenStack自動化
一文詳解Ansible的自動化運維

評論