注册变量

absible的模块在运行之后,其实都会返回一些”返回值“,只是默认情况下,这些”返回值“并不会显示而已,我们可以把这些返回值写入到某个变量中,这样我们就能通过引用对应的变量从而获取到这些返回值,这种将模块值写入到变量中的方法被称为”注册变量“,那么咋样将返回值注册到变量,如下一个playbook示例:

ansible变量三(注册变量和playbook的交互)_ansible

上述中使用”register“关键字将当前shell任务的返回值写入了名为testvar的变量中,第二个debug模块输出第一个任务中的注册变量的值,注册变量就是这么简单,使用register关键字指定对应的变量名即可。

上述play执行后,可以看到返回值信息:

ansible变量三(注册变量和playbook的交互)_ansible_02

从上述返回信息可以看出,返回值是json格式的,上述返回值包含一些键值对,比如”changed“:true或”cmd“...,如果想要返回某一些特定值,只需要指定键值对中的key即可,假设,我只想要获取上述返回信息中的cmd的值,则可以使用如下两种语法:

语法一:

ansible变量三(注册变量和playbook的交互)_ansible_03

语法二:

ansible变量三(注册变量和playbook的交互)_自动化_04


提示用户输入信息并写入变量

在运行某些脚本时,有时脚本提示用户输入一些信息,脚本需要根据用户输入的信息的信息决定下一步的动作,这种交互有时候是必须的,那么,在play中该咋样实现这种交互呢?我们可以这样做,提示用户输入信息,然后将用户输入存入到指定的变量中,当我们需要使用这些”输入的信息“时。只要引用对应的变量即可。

我们来看一下小示例,如下:

ansible变量三(注册变量和playbook的交互)_ansible_05

如上所以,我们使用”var_prompt“关键字创建了两个变量,这两个变量的名称的名称分别为”your_name“和”your_age“,当运行playbook,当用户在what is your name输入内容时,这个信息回保存到your_name变量中,后面的一样。

ansible变量三(注册变量和playbook的交互)_自动化_06

如上,按照要求输入名字和年龄,然后保存到变量,最后再debug中的msg显示出来,注意,当你是用这种方式提示用户时,默认情况下不会显示用户输入的信息,如果想要显示用户输入的信息:

ansible变量三(注册变量和playbook的交互)_ansible_07

如上在vars_prompt中,使用private关键字,将其属性设置为no即可,便是变量值为非私有地,默认是yes。

我们还能提示信息设置为默认值,即如果用户不输入任何信息,则将默认值赋予变量,示例playbook如下:

ansible变量三(注册变量和playbook的交互)_自动化_08

如上例所示,我们使用了default关键字设置了solutinon变量的默认值,如果用户没有输入任何值,将将A赋值给solution这个变量,如果用户输入值,则”solution“变量值为用户输入的值。


我们编写一个playbook,这个playbook可以让用户手动输入用户名和密码。然后根据用户输入的信息去创建系统用户,可以使用user模块,我们来尝试编写一个可交互创建系统用户的playbook。

ansible变量三(注册变量和playbook的交互)_ansible_09

上面看似没有问题,其实我们的在使用user模块时密码字段是要求经过hash处理的值,此处显然不能满足。所以需要对输入的密码值进行哈希处理:
ansible变量三(注册变量和playbook的交互)_ansible_10


入上述,encrypt关键字表示对用户输入的信息进行哈希,encrypy:”sha512_crpyt“表示使用sha512

算法对用户输入的信息进行哈希,哈希后的字符串会存入到上例中的”hash_string“变量中,利用encrypt关键字对字符串,就可以解决创建用户指定密码字符串的问题,需要注意,当使用”encrypt“关键字对字符串进行哈希时。ansible需要依赖passlib库完成哈希操作,如果未安装passlib库,执行会报错。


除了能够使用”encrypt“关键字对字符串进行哈希加密。还能够使用”confirm“关键字实现类似确认密码的功能,在为用户设置密码时。通过需要输入两次完全相同的密码,才能够设置成功,通过”confirm“关键字就能实现类似的效果,示例如下:

ansible变量三(注册变量和playbook的交互)_ansible_11


通过命令行传入变量。

除了之前总结过的定义变量的方法,我们还能够在执行playbook时直接传入需要使用的变量。playbook如下:

ansible变量三(注册变量和playbook的交互)_自动化_12

上例中的playbook中,并没有定义pass_var变量,而是直接引用了pass_var变量,我们可以执行playbook时候传入变量,方法如下:

ansible变量三(注册变量和playbook的交互)_自动化_13

如上所述,在调用playbook时使用”--extra-vars“选项可以传递对应的变量与变量值,”--extra-vars”时长选项,对应的短选项是“-e”,我们也可以一次传入多个变量,变量之间用空格隔开,如下:

ansible变量三(注册变量和playbook的交互)_ansible_14


如果playbook中并没有定义pass_var变量,在调用playbook时也没有传入pass_var变量,运行时会报错。如果在play中定义好变量。然后再执行playbook时,再次传入相同名称的变量,最终还是以传入的变量为准。如下:

playbook:

ansible变量三(注册变量和playbook的交互)_ansible_15

运行时同时指定pass_var:

#ansible-playbook  variable-three.yaml -e 'pass_var="test"'


不仅ansible-playbook命令可以使用“-e”传递变量,ansible命令也同样可以,所以在执行ad-hoc命令时也可以使用同样的方法传入变量,如下:

ansible变量三(注册变量和playbook的交互)_自动化_16

上述的几个示例从命令行中传递变量时,度是使用了“key=value“的形式,出来使用”key=value“

的方式传递变量,ansible还支持通过json的格式传递变量,如下:

通过json格式传入两个变量:

#ansible-playbook variable-three.yaml -e '{"testvar":"test","testvar1":"test1"}'

通过json格式传入稍微复杂一点的变量:

#ansible-playbook variable-three.yaml -e '{"countlist":["one","two","three"]}'


在剧本中引用上述命令传入countlist变量时,如果想要获取到值”one“,则可以使用如下两个预发引用变量{{countlist[0]}}或者{{countlist.0}}


命令行不仅能够传入变量,还能传入变量文件,变量文件中的变量都会一并被传入,变量文件可以是json格式的,也可以是YAML格式,此处使用YAML格式的变量进行示例,示例文件内容如下:

ansible变量三(注册变量和playbook的交互)_自动化_17

测试用playbook内容:

ansible变量三(注册变量和playbook的交互)_ansible_18


如上的playbook所示,playbook中引用了变量文件中定义的两个变量,那么,我们杂样从命令行中将变量文件中的变量传入playbook?如下


ansible变量三(注册变量和playbook的交互)_ansible_19

如上述命令所示,使用”@符号加上变量文件的路径,即可在命令行中传入对应的变量文件,变量文件中的所有变量都可以在playbook中引用。