Ansible 变量
变量
通过 Inventory 文件定义主机以及主机组变量
Ansible 默认的 Inventory 文件是 ini 格式,分别对每台主机设置一个变量名称叫做 key,接着使用 debug 模块来查看变量的值,最后通过 nginx 组定义一个变量同样使用 debug 模块查看。如下所示
编写一个 Playbook 文件来验证变量的引用是否正确
运行这个 Playbook 发现每天主机都引用了自己定义的变量,接下来我们注释每台主机的变量定义,直接给 nginx 组定义一个变量,变量名称还是 key ,值为 nginx,如下所示,
执行 验证的 Playbook 可以看到,改组定义的变量针对组内所有主机都生效。如果 nginx 组定义了变量,然后每台主机也定义了变量,只要定义的变量 key 名称不同,我们都可以直接引用这些变量。
通过命令行传参传入
上边介绍了日常过程中常用的一种变量定义方式,接下来介绍一个通过 ansible-playbook 命令行传参的方式定义变量,但是默认传进去的变量都是全局变量。如下:
当然也支持同时传递多个变量,
而且命令行传入的变量的优先级要高于 Playbook 中设置的变量,这样可以更灵活的指定变量的值。
通过文件传入变量
ansible-playbook 支持指定文件的方式传入变量,变量文件支持 YAML 和 JSON 两种格式,如下所示
指定 var.json 文件传入变量
指定 var.yml 文件传入变量
在 Playbook 文件中使用 vars
我们还可以在 Playbook 文件内通过 vars 字段定义变量,比如上边的 variable.yml 文件内容如下:
在 Playbook 文件内使用 vars_files
我们还可以在 Playbook 文件内通过 vars_files 字段引用变量,首先吧所有变量定义到某个文件内,然后在 Playbook 文件内使用 vars_files 参数引用这个变量文件,
var.yml 文件就是变量定义存放的文件,这个时候我们就可以直接运行 variable.yml 。
使用 register 内的变量
Ansible Playbook 内 task 之间还可以互相传递数据,比如我们有两个以上的 tasks ,其中第 2 个 task 是否执行是需要判断第一个 task 运行后的结果,这个时候我们就的在 task 之间传递数据,需要把第 1 个 task 执行的结果传递给第 2 个 task。 Ansible task 之间传递数据使用 register 方式,看一个简单的例子。
这里把第 1 个 task 执行的 hostname 的结果 register 给 info 这个变量,然后在第 2 个 task 把这个结果使用 debug 模块打印出来。
stdout 是一个标准的 Python 语言在字典中取值的用法。
使用 var_prompt 传入
Ansible 还支持在运行 Playbook 的时候通过交互式的方式给定义好的参数传入变量值,只需要在 Playbook 中定义 var_prompt 的变量名和交互式提交内容即可。
而且 Ansible 还支持对输入的变量值进行加密处理,比如采用 SHA512 和 MD5 算法加密,但是需要安装 passlib python 库。下面来看一个例子。
在例子中通过 vars_prompt 参数进行交互输入两个变量的值,变量名分别为 one 和 two ,one 定义为非私有变量,two 变量定义为私有变量且还提供一个默认值。如果不给变量 two 输入值的话,two 的变量的值会变成默认值。
版权声明: 本文为 InfoQ 作者【耳东】的原创文章。
原文链接:【http://xie.infoq.cn/article/d8128bbf88d15ee9b2534ef44】。未经作者许可,禁止转载。
评论