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

注册变量算法

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

image.png

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

上述play执行后,能够看到返回值信息:bash

image.png

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

语法一:
测试

image.png

语法二:加密

image.png


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

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

咱们来看一下小示例,以下:debug

image.png

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

image.png

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

image.png

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

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

image.png

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


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

image.png

上面看似没有问题,其实咱们的在使用user模块时密码字段是要求通过hash处理的值,此处显然不能知足。因此须要对输入的密码值进行哈希处理:
image.png


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

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


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

image.png


经过命令行传入变量。

除了以前总结过的定义变量的方法,咱们还可以在执行playbook时直接传入须要使用的变量。playbook以下:

image.png

上例中的playbook中,并无定义pass_var变量,而是直接引用了pass_var变量,咱们能够执行playbook时候传入变量,方法以下:

image.png

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

image.png


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

playbook:

image.png

运行时同时指定pass_var:

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


不只ansible-playbook命令能够使用“-e”传递变量,ansible命令也一样能够,因此在执行ad-hoc命令时也能够使用一样的方法传入变量,以下:

image.png

上述的几个示例从命令行中传递变量时,度是使用了“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格式的变量进行示例,示例文件内容以下:

image.png

测试用playbook内容:

image.png


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


image.png

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

相关文章
相关标签/搜索