通过 Inventory 文件定义主机和主机组变量
Ansible默认的Inventory文件是INI格式。直接开始测试,先看定义的host文件:
接下来,编写一个playbook文件验证变量的引用是否正确,内容如下:
运行playbook(不指定绝对路径要在playbook文件下运行),如下所示:
可以看到,每台主机都引用了自己的主机变量key;下面开始测试主机组变量,先注释掉每台主机的变量定义,再给nginx组定义一个主机组变量,变量名为key且值为zero_gg(此处如果要修改变量名,要对应修改playbook),如下所示:
运行playbook文件:
可以看到,主机组变量针对组内所有的主机都生效。注意:如果主机同时定义了主机变量和主机组变量,名字相同时,主机变量生效,主机组变量不生效;名字不同时,都可以调用。
通过/etc/ansible/下的文件定义主机和主机组变量
使用yum安装Ansible默认配置文件是在/etc/ansible/目录下,可在该目录下,创建文件夹host_vars定义主机变量,创建group_vars定义主机组变量(此情况要求yaml文件不再/etc/ansible/的子目录下);如果采用其他的安装方式,在playbook文件当前目录下创建两个目录即可。如下:
分别在 group_vars、host_vars 下创建主机组变量文件和主机变量文件,内容如下:
运行 playbook 文件,结果如下:
由上可验证,当主机变量和主机组变量同时存在且名字相同时,只有主机变量生效,主机组变量不生效;
下面验证group_vars/下的nginx组的主机组变量,如下:
通过ansible-playbook命令行传入
通过 ansible-playbook 命令行传参的方式定义变量,默认传进去的都是全局变量,如下:
这种方式同时支持传入多个变量,还支持指定文件的方式传入变量,变量的文件内容支持两种格式:YAML和JSON
YAML:
JSON:
在playbook文件内使用vars
直接运行,如下:
如上,playbook 文件中定义的变量对所有主机都有效,可理解为主机组变量。
在playbook文件内使用vars_files
vars_files 默认搜索当前路径,如果文件不在当前目录,需要指出绝对路径。
使用register内的变量
Ansible playbook内task之间还可以互相传递数据,比如我们总共有两个tasks,其中第2个task是否执行是需要判断第1个task运行后的结果,这个时候我们就得在task之间传递数据,需要把第1个task执行的结果传递给第2个task。
Ansible task之间传递数据使用register方式
这里把第1个task执行hostname的结果register给info这个变量,然后第2个task把这个结果使用debug模板打印出来,如下:
info 的结果是一段 Python 字典数据,存储着很多信息,包括执行时间状态变化输出等信息。从字典中,取出想要的值
修改 register.yaml 文件内容,info[‘stdout’]是一个标准的 Python 语言在字典中取值的用法,执行 playbook,如下所示:
使用vars_prompt传入
Ansible 支持在运行 playbook 的时,通过交互式的方式给定义好的参数传入参数值,只需在playbook中定义vars_prompt的变量名和交互式提示内容即可。
Ansible可以对输入的变量值进行加密处理,比如采用SHA512和MD5算法加密。需要注意:如果要对变量值进行加密,ansible机器上要安装passlib python库
one 为非私有变量,two为私有变量,private的作用是交互模式下是否显示输入的变量值。
这里总结了7中常用的定义变量的方式,以及如何去引用。欢迎大家,实践指正,谢谢!
作者:zero_gg