如何在 Ansible Playbook 中进行变量替换,解决环境之间差异的问题?

2019-11-14 16:58:06 浏览数 (1)

通过 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 本文链接:https://blog.csdn.net/zero_gg/article/details/79101756 本文转自公众号 JFrog杰蛙DevOps

0 人点赞