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

注册变量

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

image.png

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

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

image.png

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

语法一:

image.png

语法二:

image.png


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

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

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

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中引用。


原文地址:https://blog.51cto.com/11726212/2378859

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


----name:setpublickeyonremotehosts&setreomtehostssudoersfilehosts:all#此脚本要求所有的主机root用户密码相同become:noremote_user:rootvars:-remoteuser:user1:rhcetasks:-name:setsecondarygroupforrhce
环境准备#cat/etcedhat-releaseCentOSLinuxrelease7.9.2009(Core)#pythonPython3.7.11(default,Jul312022,16:12:35)[GCC4.8.520150623(RedHat4.8.5-44)]onlinuxType"help","copyright","credits"or"li
准备好环境,在安装之前请先了解openshift提供的ansible有大量的安装选项文档地址:https://docs.okd.io/latest/install/configuring_inventory_file.html1、配置/etc/ansible/hosts 
Ansible:运维工作:系统安装(物理机、虚拟机)-->程序包安装、配置、服务启动-->批量操作-->程序发布-->监控OSProvisioning:物理机:PXE、Cobbler虚拟机:ImageTemplatesConfigration:puppet(ruby)saltstack(python)chefcfengineCommandand
ansible与salt对比相同都是为了同时在多台机器上执行相同的命令都是python开发不同agent(saltstack需要安装、ansible不需要)配置(salt配置麻烦,ansible基本不用配置)学习路线(salt比较陡峭,ansible比较平缓)第三方工具(salt比较少)开源社区的对接(salt比较少)现有用户(salt还是an
[root@node1playbook]#catnginx.yml-hosts:test\\主机组,要和nginx.yml在同一个目录下remote_user:root\\远端执行任务的用户tasks:\\任务-name:installhttpd\\任务描述command:yum-yinstallhttpd\\调用ansible的command模块安装httpd-na
一直不知道这个模块到底在哪,并且也挺想搞清楚官方那些模块到底在哪个目录下。1.使用grep-rl"copy.py"/usr/lib/python2.7/site-packages/ansible(这个目录是专门放ansible源码目录的)然后找到是/usr/lib/python2.7/site-packages/ansible/modules/files/copy.py这个文件,这里需要
ansile作为去除安装agent的自动化工具,通过ssh协议的简单功能强大的自动化工作。在ansile使用的过程中,有三种用途1、ansible自行一次性任务,即执行命令如:ansible10.59.87.11-mping*ansible"dev-hdp"-mcopy-a"src=oot/HfHadoopHiveUdf.jardest=/data1/opt/cloudera/par
ansible-playbook(1) Ansible组成部分InventoryModulesAdHocCommandsplaybooksplaybooks:Tasks:任务,即调用的模块完成的某操作variables:变量Templates:模版Roles:角色 基本结构:-host:webserverremote_user:tasks:
报错:[root@jenkins~]#ansiblego_activity-mcron-a"name='log_clear'minute=0hour=2job=find/home/golanger/log/-typef-name'log$(date+\%d-d-1day)'-delete"ERROR!thistask'cron'hasextraparams,wh
一、测试环境说明1、系统:rhel6.92、ip地址:20.20.20.24/2420.20.20.41/2420.20.20.42/243、以下操作使用root身份进行,也可以使用具有sudo权限的用户进行相关操作二、环境准备1、关闭iptables防火墙、selinux#/etc/init.d/iptablesstop#
ansible常用模块安装:依赖于epel源yuminstallansible-y配置文件:/etc/ansible/ansible.cfgInvertoory:/etc/ansible/hosts 如何查看模块帮助:ansible-doc-lansible-doc-sMODULE_NAME` ansible命令应用基础:语法:ansible<host-pattern>[options]-fforks
copycopy模块是将ansible管理主机上的文件拷贝上远程主机中,与fetch相反,如果目标路径不存在,则自动创建,如果src的目录带“/”则复制该目录下的所有东西,如果src的目录不带“/”则连同该目录一起复制到目标路径;常用模块src参数:用于指定需要copy的文件或目录
9.YAML9.1简介(1)YAML是一个可读性高的用来表达资料序列的格式。(2)YAML参考了其它多种语言。包括:XML、C语言、python、perl以及电子邮件格式的RFC2822等。ClarkEvans在2001年首次发表了这种语言。(3)YAML不是XML,在开发这种语言时,YAML的意思其实是:yetanothermarkuplanguage,9.2特性(1)YA
了解ansibleansible批量在远程主机上执行命令ansible主要是为了进行操作多个主机而进行的#!/bin/envpython文件中直接指向python文件#!/bin/base 指行脚本一.ansible第一步.下载epel源wget-O/etc/yum.repos.d/epel.repohttp://mirrors.aliyun.comepo/epel-7.repo
背景:在私有云环境下,遇到要开通某个项目,则需要快速的响应创建虚拟机,并且做一些基础的配置。为了提高效率以及减少手工犯错的概率,一般会采取ansible批量部署,但是使用ansible的前提是预先配置好免密。在密码一致的场景中,可以使用expect优化做免密的过程解决方案:1.
简单例子1:vars定义变量-hosts:allremote_user:rootvars:-package:nginx-service:nginx tasks:-name:installnginxpackage yum:name={{package}}state=latest-name:installconfigurationfileforhttpd copy:src=/etcginxginx
 ansible自动化运维工具的介绍      ansible结构特性:            模块化,调用特定的模块,完成特定的任务;        基于Python语言实现,由Paramiko、PyYAML和Jinja2三个关键模块;        部署简单,agentless        主从模
---恢复内容开始---Templates:模版 cat/etc/ansible/hosts  cattemplatesginx.conf.j2 -hosts:testremote_user:rootvars:-package:httpd-service:httpdtasks:-name:installnginxpackage yum:name={{package}}state=la
1、配置资源清单inventory文件[root@test1~]#cat>/etc/ansible/hosts<<EOF[k8s]192.168.0.92ansible_ssh_port=22ansible_ssh_user=k8sansible_ssh_pass='123'ansible_become_pass='123456'EOF解释:ansible_ssh_pass='123'