Ansible變量
系統自動化讓重復的工作變得更加容易,但是每個系統還是有一些細微的差別,變量就是如何處理系統之間的不同之處。這里將會列出變量的極大部分使用方法。
本文假設:你已經知道如何使用Ansible。知道inventory,facts等概念。
Ansible定義變量的幾中方式
1、在清單(inventory)中定義變量
2、在playbook中定義變量,使用var,或var_files:
3、在role中定義變量
4、自定義facts的變量
5、Register facts ,使用task返回結果作為變量
6、從命令行傳遞變量
使用變量,除了可用使用自定義的變量,還可以使用facts和其它主機的變量。
一、合法變量名
1、必須是字符,數字,下劃線組成,變量必須以字符開頭。
2、變量支持字典形式的映射。
3、有時候引用變量,使用小數點形式的引用方法可能會和Python內置的屬性和方法沖突。建議使用[]形式。
二、開始定義與使用變量
1、清單(inventory)變量
1.1定義清單主機變量.在對應的主機后面,提供key=value 形式語句,即可。格式如下
[webserver] 172.16.1.10 ansible_ssh_user=root inventory_host_var="Host_vars" 172.16.1.20 ansible_ssh_user=root
1.2定義清單組變量,格式如下。
[webserver:vars] inventory_group_var="Group_vars"
1.3 可以根據對應的inventory創建文件,寫入變量
mkdir /etc/ansible/host_vars #Ansible會默認讀取此目錄下對應的主機名文件 mkdir /etc/ansible/group_vars #同上 vim /etc/ansible/host_vars/all 或者 vim /etc/ansible/host_vars/hostname vim /etc/ansible/group_vars/groupname
在文件中寫入變量即可。格式為ymal格式文件。
2、在playbook中定義變量
--- - hosts: hostname or groupname vars: #playbook中定義變量的關鍵字 playbook_var: Playbook_vars var_files: #使用變量文件 - filename.yml tasks: - name: Copy Jinja2 file to remote host template: src=/home/aheahe/var_tu.j2 dest=/root/var.conf
3、在role中定義變量
mkdir roles/test/{vars,files,templates,tasks,defaults,handlers} -p #創建role結構
vim roles/test/vars/main.yml #1、編輯task文件 --- role_vars_var: Role_vars_var
vim roles/test/defaults/main.yml #2、編輯默認變量文件 --- role_defaults_var: Role_default_var
vim roles/test/tasks/main.yml #3、編輯roles var文件 --- - name: Learn role vars template: src=1.j2 dest=/root/1
vim roles/test/templates/1.j2 #4、編輯模板文件 {{ role_vars_var }} {{ role_defaults_var }}
vim site.yml #5、編輯執行文件 --- - hosts: 172.16.1.10 roles: - /home/aheahe/roles/test
ansible-playbook site.yml #6、執行
[172.16.1.10~]# cat 1 #7、在被管理節點上查看結果 Role_vars_var Role_default_var
Tip:在引用role的時候,還可以傳遞變量給role
- hosts: webservers roles: - common - { role: test, role_defaults_var: 'var_value' }
4、自定義Facts變量。
如果在被管理的主機上存在/etc/ansible/facts.d 目錄,其中的以.fact 為文件結尾的JSON格式或者YML格式文件都會當做自定義facts。
[172.16.1.10]# vim /etc/ansible/facts.d/local.fact #編輯自定義facts文件 [general] Aheahe=aihe local="Local facts"
[ansible ~]$ansible 172.16.1.10 -m setup -a 'filter=ansible_local' #在ansible控制節點查看自定義facts變量是否生效 172.16.1.10 | success >> { "ansible_facts": { "ansible_local": { "local": { "general": { "aheahe": "aihe", "local": "\"Local facts\"" } } } }, "changed": false }
可以像fact一樣使用,自定義的fact變量。
vim roles/test/templates/1.j2 #使用剛才的角色 {{ role_vars_var }} {{ role_defaults_var }} {{ ansible_local.local.general.local }}
ansible-playbook site.yml #執行剛才的site.yml
[172.16.1.10 -]# cat /root/1 #被管理節點查看結果,顯示正確 Role_vars_var Role_default_var "Local facts"
4.1這里還可以在控制節點上面傳遞自定義變量到被管理節點,編輯如下ymal格式文件。
- hosts: webservers tasks: - name: create directory for ansible custom facts file: state=directory recurse=yes path=/etc/ansible/facts.d - name: install custom impi fact copy: src=ipmi.fact dest=/etc/ansible/facts.d - name: re-readfacts after adding custom fact setup: filter=ansible_local
5、定義Register變量,
Register變量是將task的結果信息當做變量使用。在任務的執行結果后面加上register 關鍵字即可定義變量
vim study.yml --- - hosts: 172.16.1.10 vars: playbook_var: Playbook_vars tasks: - name: Learn Register shell: ifconfig register: command_result - name: Test register shell: date when: command_result.rc == 0
ansible-playbook study.yml -v #執行的時候加上-v 選項。查看輸出信息
6、從命令行傳遞變量.
相信這點對大家來說已經不成問題了,便不再細說
ansible-playbook release.yml --extra-vars "version=1.23.45 other_variable=foo" #傳遞key=value形式變量 --extra-vars '{"pacman":"mrs","ghosts":["inky","pinky","clyde","sue"]}' #傳遞JSON格式變量 --extra-vars "@some_file.json" #傳遞JSON格式文件變量
三、使用變量
上面在舉例子的時候,已經說明如何使用了。下面介紹如何使用fact變量和一臺主機使用另外一臺主機的變量。
使用實現定義好的變量,在變量兩邊加上大括號,格式為{{ var_name }}
vim var.j2 {{ ansible_hostname }} #這里是使用fact變量,兩個主機的結果不一樣 {{ hostvars['172.16.1.10']['ansible_hostname'] }} #這里兩臺主機的結果一樣,node2>使用node1的變量
vim test.yml #提供劇本 --- - hosts: webserver tasks: - name: Use fact and other host vars template: src=/home/aheahe/playbook/var.j2 dest=/root/var.conf
ansible-playbook test.yml #執行
[root@node1]# cat /root/var.conf #這里可以看到node2使用node1的變量。 node1 #這里是使用fact變量,兩個主機的結果不一樣 node1 #這里兩臺主機的結果一樣,node2使用node1的變量
四、變量的優先級。處理同一個變量名多處定義的問題。
3.1、在1.x版本里面,越靠下優先級越高,可以覆蓋上面的
1、role defaults 中定義的變量,優先級最低
2、從被管理系統中收集的facts信息
3、inventory中定義的變量
4、在playbook中的vars: 或者 roles 中的vars
5、一些連接變量,例如ansible_user 。
6、命令行的變量 ansible-playbook -e 選項的變量, 優先級別最高。
3.2 ,在2.x系列的版本中調整變量優先級的順序為如下。優先級由低到高
-
role defaults
-
inventory vars
-
inventory group_vars
-
inventory host_vars
-
playbook group_vars
-
playbook host_vars
-
host facts
-
registered vars
-
set_facts
-
play vars
-
play vars_prompt
-
play vars_files
-
role and include vars
-
block vars (only for tasks in block)
-
task vars (only for the task)
-
extra vars
參考:
http://docs.ansible.com/ansible/playbooks_variables.html
原創文章,作者:艾賀,如若轉載,請注明出處:http://www.www58058.com/9431