ansible playbook中的變量
目錄
?一、變量的優(yōu)先級(jí)
?1.1 YAML陷阱
?二、 Ansbile-playbook變量配置方法
?2.1 在inventory主機(jī)清單文件中定義變量
?2.2 通過host_vars和group_vars目錄來定義變量
?2.3 通過var_files定義變量
?2.4 通過vars_prompt交互式傳入變量
?2.5 通過ansible-playbook命令行定義變量!即參數(shù)傳入變量
?2.6 在playbook劇本中定義變量
?2.7 通過roles角色定義變量
?2.8 使用Facts獲取的信息
?2.9 register注冊(cè)變量
?2.10 hostvars 變量
?2.11 列表變量、循環(huán)變量、字典變量
一、變量的優(yōu)先級(jí)
?extra vars變量(在命令行中使用-e);優(yōu)先級(jí)最高;
? 在inventory中定義的連接變量(比如ansible_ssh_user);優(yōu)先級(jí)第二;
? 大多數(shù)的其他變量(命令行轉(zhuǎn)換,play中的變量,include的變量,role的變量等);優(yōu)先級(jí)第三;
? 在inventory定義的其他變量;優(yōu)先級(jí)第四;
? 有系統(tǒng)發(fā)現(xiàn)的facts;優(yōu)先級(jí)第五;
? "role默認(rèn)變量",這個(gè)是最默認(rèn)的值,很容易喪失優(yōu)先權(quán)。優(yōu)先級(jí)最??;
另外:在inventory清單列表里定義的變量:單個(gè)主機(jī)定義的變量?jī)?yōu)先級(jí)高于主機(jī)組定義的變量
經(jīng)過實(shí)驗(yàn),ansible使用inventory定義變量的優(yōu)先級(jí)順序從高到低為:
host_vars下定義變量 ---> inventory中單個(gè)主機(jī)定義變量 ---> group_vars下定義變量 ---> inventory中組定義變量
1.1 YAML陷阱
YAML語(yǔ)法要求如果值以{{ foo }}開頭的話,那么就需要將整行用雙引號(hào)包起來,這是為了確認(rèn)你不是想聲明一個(gè)YAML字典。
如下面配置是不行的?。。?/p>
| | | |---|---| | |---| | |-hosts:app_servers| | |vars:| | |app_path:{{base_path}}/data/web|
應(yīng)該改成下面這樣:
| | | |---|---| | |---| | |-hosts:app_servers| | |vars:| | |app_path:"{{ base_path }}/data/web"|
二、 Ansbile-playbook變量配置方法
2.1 在inventory主機(jī)清單文件中定義變量
可以直接定義在主機(jī)清單文件/etc/ansible/hosts中,表明該變量只對(duì)對(duì)應(yīng)的主機(jī)或者組有效,對(duì)其余的主機(jī)和組無效。
示例:
| | | | --- | --- | | | $ 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 }}" | | | | | | # 執(zhí)行結(jié)果(注意inventory_hostname代表inventory列表列表里被控節(jié)點(diǎn)的主機(jī)名): | | | | | | $ 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系統(tǒng)上ansible默認(rèn)的配置文件目錄(Mac系統(tǒng)上的話,其默認(rèn)配置目錄是在/usr/local/etc/ansible/),在該目錄下創(chuàng)建host_vars和group_vars兩個(gè)目錄用來存放定義變量的文件。
針對(duì)單個(gè)主機(jī)的變量
| | $ cat /etc/ansible/host_vars/10.4.7.101 | | | --- | | | user: root | | | pass: root@123 |
針對(duì)test組的變量
| | $ cat /etc/ansible/group_vars/test | | | --- | | | user: work | | | pass: work@123 |
在inventory清單列表文件里,單個(gè)主機(jī)定義的變量?jī)?yōu)先級(jí)高于主機(jī)組定義的變量
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的變量名和交互式提示信息,就可以實(shí)現(xiàn)在運(yùn)行playbook時(shí),通過交互的傳入變量值。
private字段:用來定義交互時(shí)是否回顯輸入的值,默認(rèn)private為yes;
default字段:用來定義變量的默認(rèn)值。
| | $ 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 # 把輸入的內(nèi)容傳遞給變量var1。輸入的值顯示出來! | | | please input you age [18]: # playbook中定義默認(rèn)值是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命令行定義變量!即參數(shù)傳入變量
除了vars_prompt和vars_files,也可以通過Ansible命令行發(fā)送變量。如果想要編寫一個(gè)通用的發(fā)布playbook時(shí)則特別有用!你可以傳遞應(yīng)用的版本以便部署。例如下面命令(注意:--extra-vars相等于 -e)
| | $ cat exap.yml | | | --- | | | - hosts: '{{hosts}}' | | | remote_user: '{{user}}' | | | tasks: | | | - name: "一個(gè)測(cè)試" | | | 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 [一個(gè)測(cè)試] ************************************************************************************************************************************* | | | 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 |
也可以將參數(shù)放在文件里面進(jìn)行傳遞(注意命令行里要是用"@文件名"):
| | | | --- | --- | | | # 同樣使用上面的例子 | | | $ 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 [一個(gè)測(cè)試] ************************************************************************************************************************************* | | | 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模塊,可以將所有需要用到的變量統(tǒng)一在vars模塊下定義,定義格式需要遵循YAML語(yǔ)言格式:
語(yǔ)法格式:
| | | | --- | --- | | | 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中定義變量,需要將變量及值的鍵值對(duì)形式寫到roles的vars目錄下的main.yml文件中,同樣適用YAML語(yǔ)言格式,格式如下:
| | | | --- | --- | | | var1: value1 | | | var2: value2 | | | var3: value3 |
但是請(qǐng)注意:通過Roles定義的變量只適用于當(dāng)前roles。
| | | | --- | --- | | | # roles目錄結(jié)構(gòu) | | | $ 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獲取的信息
還有其它地方可以獲取變量, 這些變量是自動(dòng)發(fā)現(xiàn)的,而不是用戶自己設(shè)置的。Facts通過訪問遠(yuǎn)程系統(tǒng)獲取相應(yīng)的信息,一個(gè)很好的例子就是遠(yuǎn)程主機(jī)的IP地址或者操作系統(tǒng)是什么。
| | | | --- | --- | | | $ ansible test -m setup | | | # 使用以下命令可以查看哪些信息是可用的(test是上面在/etc/ansible/hosts列表文件中配置的主機(jī)群組) | | | | | | $ ansible test -m setup|grep "ansible_python_version" | | | "ansible_python_version": "2.7.5", | | | # 在playbook中這樣引用上面被控制主機(jī)的python版本: {{ ansible_python_version }} | | | | | | $ ansible test -m setup|grep "ansible_nodename" | | | "ansible_nodename": "template", | | | # 可以在playbook中這樣引用上面被控制主機(jī)的主機(jī)名: {{ ansible_nodename }} | | | | | | $ ansible test -m setup | grep "ansible_hostname" | | | "ansible_hostname": "template", | | | # 被控制主機(jī)的主機(jī)名變量還可以是: {{ ansible_hostname }} |
如果關(guān)閉Facts,可以大大提高ansible的執(zhí)行速度 ,關(guān)閉方法如下:
| | $ cat anhui.yml | | | --- | | | - hosts: test | | | gather_facts: no |
2.9 register注冊(cè)變量
變量的另一個(gè)主要用途是在運(yùn)行命令時(shí),把命令結(jié)果存儲(chǔ)到一個(gè)變量中,不同模塊的執(zhí)行結(jié)果是不同的。運(yùn)行playbook時(shí)使用-v選項(xiàng)可以看到可能的結(jié)果值,ansible執(zhí)行任務(wù)的結(jié)果值可以保存在變量中,以便稍后使用它。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 變量
該變量用于引用其他主機(jī)上收集的facts中的數(shù)據(jù),或者引用其他主機(jī)的主機(jī)變量、主機(jī)組變量。即從一臺(tái)遠(yuǎn)程主機(jī)獲取另一臺(tái)遠(yuǎn)程主機(jī)的變量。
| | | | --- | --- | | | $ 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 列表變量、循環(huán)變量、字典變量
1)ansible的變量不僅可以是單個(gè)的值,也可以為列表,即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)循環(huán)列表
結(jié)合循環(huán),這個(gè)特性就變得很有用;以參數(shù)傳遞列表給playbook,不用在playbook中固定循環(huán)的次數(shù)與內(nèi)容。
| | $ 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 |
****** 當(dāng)你發(fā)現(xiàn)自己的才華撐不起野心時(shí),就請(qǐng)安靜下來學(xué)習(xí)吧!******
鏈接:https://www.cnblogs.com/lvzhenjiang/p/14385777.html
-
主機(jī)
+關(guān)注
關(guān)注
0文章
1036瀏覽量
35929 -
變量
+關(guān)注
關(guān)注
0文章
614瀏覽量
28907 -
PlayBook
+關(guān)注
關(guān)注
0文章
7瀏覽量
12036
原文標(biāo)題:Ansible Playbook中的變量使用技巧:提高自動(dòng)化效率的必備利器
文章出處:【微信號(hào):magedu-Linux,微信公眾號(hào):馬哥Linux運(yùn)維】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
RIM本周二發(fā)布黑莓PlayBook OS 2.0 現(xiàn)提供更新下載
黑莓Playbook拆解全過程

Ansible軟件平臺(tái)
遠(yuǎn)端機(jī)器的臨時(shí)執(zhí)行命令
ansible調(diào)用playbook遠(yuǎn)程mvn顯示找不到JAVA_HOME
ansible playbook+jenkins如何實(shí)現(xiàn)自動(dòng)新增域名
RIM公司PlayBook平板電腦曝光
使用用Ansible重復(fù)部署ELK STACK

利用Ansible實(shí)現(xiàn)OpenStack自動(dòng)化

利用Ansible實(shí)現(xiàn)OpenStack自動(dòng)化
一文詳解Ansible的自動(dòng)化運(yùn)維

評(píng)論