前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >如何在 Ansible Playbook 中进行变量替换,解决环境之间差异的问题?

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

作者头像
DevOps时代
发布2019-11-14 16:58:06
4.8K0
发布2019-11-14 16:58:06
举报
通过 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

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-11-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 DevOps时代 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 通过/etc/ansible/下的文件定义主机和主机组变量
  • 通过ansible-playbook命令行传入
  • 在playbook文件内使用vars
  • 在playbook文件内使用vars_files
  • 使用register内的变量
  • 使用vars_prompt传入
相关产品与服务
CODING DevOps
CODING DevOps 一站式研发管理平台,包括代码托管、项目管理、测试管理、持续集成、制品库等多款产品和服务,涵盖软件开发从构想到交付的一切所需,使研发团队在云端高效协同,实践敏捷开发与 DevOps,提升软件交付质量与速度。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档