ansible系列第五篇(变量)
变量(1)
注意: 在ubuntu系统经过测试,普通用户和root用户都需要设置密码。
执行playbook脚本时,都需要执行该命令:ansible-playbook -S -R root yaml文件名称
变量由字母,数字,下划线组成。变量名要以字母开头。
在playbook中使用变量
使用vars关键字,表示在当前play中进行变量的相关设置。
使用"{}" 可以引用对应的变量。
在定义变量时,以类似"属性"的方式定义变量,例如:
变量文件分离: 将变量分离到某个文件中,可隐藏某些变量值并将不同类的信息放在不同的文件中,与play剧本分开。
在文件中定义变量时,不要使用vars关键字,直接定义变量即可。例如:
在playbook剧本中引入包含变量的文件时,使用"vars_files" 关键字,被引入的文件要以"-" 开头,以YAML中块序列的语法引入。例如:
执行nginx的playbook剧本:
也可以引入多个变量文件,每个被引入的文件都要以"-"开头。
"vars"关键字和"vars_files"关键字可同时使用。
变量(2)
当运行一个playbook时,默认都会运行一个名为[Gathering Facts]的任务,ansible通过这个默认任务收集远程主机的相关信息。收集到的远程主机信息会保存在对应变量中。
setup模块
查看这个默认任务收集的信息可以使用setup模块。
返回信息比较多,但是都是json格式的字符串。就不一一介绍了,相信各位工程师都可以看懂。
通过setup模块的filter参数可指定需要过滤的关键字。
通过关键字对信息进行过滤,例如查看系统信息
返回信息为:
使用通配符,进行模糊过滤。
也可以在远程主机中写入自定义信息,自定义信息需要写在/etc/ansible/facts.d目录下的以".fact"为后缀的文件中,文件内容格式必须是ini或者json格式。
ansible默认会去远程主机的/etc/ansible/facts.d目录下查找主机中的自定义信息。
在远程主机创建目录
在被控机本地自定义的信息被称为"local facts".
可通过"ansible_local"关键字过滤远程主机的"local facts"信息。
在管控机执行:
输出信息为:
debug模块
可以使用msg参数输出自定义信息,也可以使用var参数直接输出变量中的信息。
例如:
使用debug的msg参数时也可以引用变量的值。{}。
输出信息如下:
变量(3)
注册变量
注册变量:将模块的返回值写入到变量中的方法。
使用"register"关键字指定对应的变量名即可。
输出的信息如下:
如果要获取到返回值中的某一项特定值,只需要指定键值对中的key即可。例如: {}
提示用户输入信息并写入变量
将用户输入的信息存入指定的变量中,当需要输入信息时,引用对应的变量即可。
输出信息如下:
命令执行后默认情况下不显示用户输入的信息。要显示用户输入时的信息,可以使用private关键字。将属性设置为no即可。
为提示信息设置默认值
输出信息如下:
用提示信息创建用户和密码
使用user模块创建用户并设置密码。
使用"encrypt"关键字,对用户输入的字符串进行哈希。
表示使用sha512算法对用户输入的信息进行哈希。
注意: 当使用"encrypt"关键字对字符串进行哈希时,ansible需要依赖passlib库完成哈希操作。
安装:
也可以用其他算法对字符串进行哈希。参考ansible官网。
例如:
执行命令:
输出信息如下:
使用"confirm"关键字实现确认密码的功能。
在useradd.yaml文件中,encrypt关键字的下方添加confirm关键字,并设置属性为yes即可。
在远程主机18.18.23.102上,用user用户并输入密码即可登录。
变量(4)
在清单中配置变量
主机变量
配置被控机时也可以配置对应变量。主机变量的生效范围只限于对应主机。
主机组变量
将多个主机分为一组。为单个组配置组变量。组变量的使用范围为组内所有主机。也可以用YAML格式配置。使用vars关键字指定组变量,vars对应组的下一级。
执行结果如下:
通过set_fact定义变量
set-fact是一个模块,通过set_fact模块在tasks中定义变量。也可以通过set_fact将一个变量的值赋予另一个变量,例如:
说明; 先定义变量nodename,再使用register将shell模块的返回值注册到变量shellreturn中,接下来,使用set_fact模块将nodename变量的值赋予给变量node1,将shellreturn变量的stdout信息赋值给node2变量。最后使用debug模块输出node1和node2的值。
变量(5)
清单配置:
内置变量ansible_version
查看ansible版本号
内置变量hostvars
hostvars在操作当前主机时获取到其他主机中的信息。
命令行执行:
执行playbook脚本时,都需要执行该命令:
输出test2的ens34网卡的IP信息:
使用gather_facts关键字可以控制当前play是否收集对应主机的facts信息。
使用hostvars内置变量获取其他主机中的注册变量。例如:
跨play获取其他主机中的变量信息
内置变量inventory_hostname
通过inventory_hostname变量可以获取到被操作的当前主机的主机名称。
执行命令:
这里的主机名称是对应主机在清单中配置的名称。
内置变量inventory_hostname_short
获取当前play操作的主机在清单中的名称。
返回结果为主机的简短名称。
内置变量play_hosts
获取到当前play所操作的所有主机的主机名列表。
执行hosts.yaml。
总结: inventory_hostname只返回当前被操作的主机的主机名。play_hosts则返回当前play中所有被操作主机的主机名列表。
内置变量groups
通过groups内置变量获取到清单中"所有分组"的分组信息。
执行命令:
获取指定组的分组信息,例如:获取testA信息
内置变量group_names
获取当前主机所在分组的组名。
内置变量inventory_dir
获取到ansible主机中清单文件的存放路径。
一般是默认的清单文件路径:/etc/ansible/hosts
执行命令:
坚持自己所选择的,方能成就自己想成就的。或许学英语对有些人很简单,但是对于运维人员来说,也是一项不小的挑战。往往最新最火的技术就在官方英文文档中,虽然现在的翻译软件很多,但翻译出来的句子大部分有点词不达意,导致自己误解了官网文档的正确意思。学好英语和思考能力是必不可缺的。小编也会尽量每周更新一篇文章和一小段每日英语,希望能够帮助更多的读者。
每日英语(Daily English Tips)(1)
1-100的英文单词如下:
领取专属 10元无门槛券
私享最新 技术干货