注册变量
absible的模块在运行之后,其实都会返回一些”返回值“,只是默认情况下,这些”返回值“并不会显示而已,我们可以把这些返回值写入到某个变量中,这样我们就能通过引用对应的变量从而获取到这些返回值,这种将模块值写入到变量中的方法被称为”注册变量“,那么咋样将返回值注册到变量,如下一个playbook示例:
上述中使用”register“关键字将当前shell任务的返回值写入了名为testvar的变量中,第二个debug模块输出第一个任务中的注册变量的值,注册变量就是这么简单,使用register关键字指定对应的变量名即可。
上述play执行后,可以看到返回值信息:
从上述返回信息可以看出,返回值是json格式的,上述返回值包含一些键值对,比如”changed“:true或”cmd“...,如果想要返回某一些特定值,只需要指定键值对中的key即可,假设,我只想要获取上述返回信息中的cmd的值,则可以使用如下两种语法:
语法一:
语法二:
提示用户输入信息并写入变量
在运行某些脚本时,有时脚本提示用户输入一些信息,脚本需要根据用户输入的信息的信息决定下一步的动作,这种交互有时候是必须的,那么,在play中该咋样实现这种交互呢?我们可以这样做,提示用户输入信息,然后将用户输入存入到指定的变量中,当我们需要使用这些”输入的信息“时。只要引用对应的变量即可。
我们来看一下小示例,如下:
如上所以,我们使用”var_prompt“关键字创建了两个变量,这两个变量的名称的名称分别为”your_name“和”your_age“,当运行playbook,当用户在what is your name输入内容时,这个信息回保存到your_name变量中,后面的一样。
如上,按照要求输入名字和年龄,然后保存到变量,最后再debug中的msg显示出来,注意,当你是用这种方式提示用户时,默认情况下不会显示用户输入的信息,如果想要显示用户输入的信息:
如上在vars_prompt中,使用private关键字,将其属性设置为no即可,便是变量值为非私有地,默认是yes。
我们还能提示信息设置为默认值,即如果用户不输入任何信息,则将默认值赋予变量,示例playbook如下:
如上例所示,我们使用了default关键字设置了solutinon变量的默认值,如果用户没有输入任何值,将将A赋值给solution这个变量,如果用户输入值,则”solution“变量值为用户输入的值。
我们编写一个playbook,这个playbook可以让用户手动输入用户名和密码。然后根据用户输入的信息去创建系统用户,可以使用user模块,我们来尝试编写一个可交互创建系统用户的playbook。
上面看似没有问题,其实我们的在使用user模块时密码字段是要求经过hash处理的值,此处显然不能满足。所以需要对输入的密码值进行哈希处理:
入上述,encrypt关键字表示对用户输入的信息进行哈希,encrypy:”sha512_crpyt“表示使用sha512
算法对用户输入的信息进行哈希,哈希后的字符串会存入到上例中的”hash_string“变量中,利用encrypt关键字对字符串,就可以解决创建用户指定密码字符串的问题,需要注意,当使用”encrypt“关键字对字符串进行哈希时。ansible需要依赖passlib库完成哈希操作,如果未安装passlib库,执行会报错。
除了能够使用”encrypt“关键字对字符串进行哈希加密。还能够使用”confirm“关键字实现类似确认密码的功能,在为用户设置密码时。通过需要输入两次完全相同的密码,才能够设置成功,通过”confirm“关键字就能实现类似的效果,示例如下:
通过命令行传入变量。
除了之前总结过的定义变量的方法,我们还能够在执行playbook时直接传入需要使用的变量。playbook如下:
上例中的playbook中,并没有定义pass_var变量,而是直接引用了pass_var变量,我们可以执行playbook时候传入变量,方法如下:
如上所述,在调用playbook时使用”--extra-vars“选项可以传递对应的变量与变量值,”--extra-vars”时长选项,对应的短选项是“-e”,我们也可以一次传入多个变量,变量之间用空格隔开,如下:
如果playbook中并没有定义pass_var变量,在调用playbook时也没有传入pass_var变量,运行时会报错。如果在play中定义好变量。然后再执行playbook时,再次传入相同名称的变量,最终还是以传入的变量为准。如下:
playbook:
运行时同时指定pass_var:
#ansible-playbook variable-three.yaml -e 'pass_var="test"'
不仅ansible-playbook命令可以使用“-e”传递变量,ansible命令也同样可以,所以在执行ad-hoc命令时也可以使用同样的方法传入变量,如下:
上述的几个示例从命令行中传递变量时,度是使用了“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格式的变量进行示例,示例文件内容如下:
测试用playbook内容:
如上的playbook所示,playbook中引用了变量文件中定义的两个变量,那么,我们杂样从命令行中将变量文件中的变量传入playbook?如下
如上述命令所示,使用”@符号加上变量文件的路径,即可在命令行中传入对应的变量文件,变量文件中的所有变量都可以在playbook中引用。