摘要
本文部分内容来源于网络,个人收集整理,请勿传播
本文记录ansible中常用的变量的定义、引用方式。
Inventory
定义主机、主机组变量
主机变量
1 | # cat inventory |
通过playbook验证变量的引用
1 | # cat variable.yaml |
运行playbook
1 | # ansible-playbook variable.yaml |
可以看到,每台主机都引用了自己的主机变量key;
主机组变量
1 | [root@zero01 inventory]# cat host_playbook |
运行playbook文件
1 | [root@zero01 playbook]# ansible-playbook variable.yaml |
可以看到,主机组变量针对组内所有的主机都生效。
注意
- 如果主机同时定义了主机变量和主机组变量,名字相同时,主机变量生效,主机组变量不生效;名字不同时,都可以调用。
- 如果主机同时属于多个主机组,多个主机组定义了同一个变量,一般只有第一个生效
内置目录结构定义主机、主机组变量
- 文件夹host_vars定义主机变量
- 文件夹group_vars定义主机组变量
- 存放位置
- 默认在
/etc/ansible/
下 - 自定义可以放在inventory目录下,或者也可以放在playbook目录下
- 默认在
1 | [root@zero01 ansible]# tree |
创建主机组变量文件和主机变量文件
1 | [root@zero01 ansible]# cat group_vars/nginx |
运行playbook文件
1 | [root@zero01 playbook]# ansible-playbook variable.yaml |
由上可验证,当主机变量和主机组变量同时存在且名字相同时,只有主机变量生效,主机组变量不生效;
主机组变量
1 | [root@zero01 playbook]# rm -rf host_vars/* |
ansible-playbook
命令行传入
通过ansible-playbook命令行传参的方式定义变量,默认传进去的都是全局变量
1 | [root@zero01 playbook]# ansible-playbook variable.yaml -e "key=ZERO" |
这种方式同时支持传入多个变量,还支持指定文件的方式传入变量,变量的文件内容支持两种格式:YAML和JSON
YAML
1 | [root@zero01 tmp]# cat var.yaml |
JSON:
1 | [root@zero01 tmp]# cat var.json |
在playbook文件内使用vars
1 | [root@zero01 playbook]# vi variable.yaml |
直接运行,如下:
1 | [root@zero01 playbook]# ansible-playbook variable.yaml |
如上,playbook文件中定义的变量对所有主机都有效,可理解为主机组变量。
在playbook文件内使用vars_files
1 | [root@zero01 playbook]# cat variable.yaml |
vars_files默认搜索当前路径,如果文件不在当前目录,需要指出绝对路径。
1 | [root@zero01 playbook]# ansible-playbook variable.yaml |
使用register内的变量
Ansible playbook
内task之间还可以互相传递数据,比如我们总共有两个tasks,其中第2个task是否执行是需要判断第1个task运行后的结果,这个时候我们就得在task之间传递数据,需要把第1个task执行的结果传递给第2个task。
使用register传递数据
1 | [root@zero01 playbook]# cat register.yaml |
这里把第1个task执行hostname的结果register给info这个变量,然后第2个task把这个结果使用debug模板打印出来,如下:
1 | [root@zero01 playbook]# ansible-playbook register.yaml -l 192.168.79.129 |
info的结果是一段Python字典数据,存储着很多信息,包括执行时间状态变化输出等信息。从字典中,取出想要的值
1 | [root@zero01 playbook]# cat register.yaml |
修改register.yaml文件内容,info[‘stdout’]是一个标准的Python语言在字典中取值的用法,执行playbook,如下所示:
1 | [root@zero01 playbook]# ansible-playbook register.yaml -l 192.168.79.129 |
使用vars_prompt传入
Ansible支持在运行playbook的时,通过交互式的方式给定义好的参数传入参数值,只需在playbook中定义vars_prompt的变量名和交互式提示内容即可。
Ansible可以对输入的变量值进行加密处理,比如采用SHA512和MD5算法加密。需要注意:如果要对变量值进行加密,ansible机器上要安装passlib python库
1 | [root@zero01 playbook]# cat prompt.yaml |
one为非私有变量,two为私有变量,private的作用是交互模式下是否显示输入的变量值。
1 | [root@zero01 playbook]# ansible-playbook prompt.yaml -l 192.168.79.129 |