ansible快速入门
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ansible快速入门相关的知识,希望对你有一定的参考价值。
文档下载
参考文档
朱双印个人日志-ansible(本文总结于此)
ansible基础概念
ansible是什么?
是一个“配置管理工具”,是一个“自动化运维工具”。它能帮助我们在许多远程主机上,完成一些批量任务,或者一些需要经常重复的工作
ansible的幂特性
ansible有个特性叫“幂特性”。即ansible是以“结果为导向的”。我们指定了一个“目标状态”,ansible会自动判读,“当前状态”是否与“目标状态”一致。如果一致,则不进行任何操作。如果不一致,就将“当前状态”变为“目标状态”。
需要安装什么
ansible通过SSH连接到受管主机进行操作。只有管理主机需要安装ansible软件。
ansible的模块
ansible对主机的各种操作都是通过模块来完成的,比如“ping”模块,“file”模块,“yum”模块等等。可以把模块理解为我们在受管主机上执行的命令。既然是命令,这些模块也有参数供我们使用。
playbook(剧本)
我们在执行ansible命令时,可以把需要条针对不同主机的命令,编写成一个playbook。这个playbook我们可以理解为脚本。它是用YAML格式编写的。通过playbook,我们可以针对不同主机,或是不同组(组里有不同的主机),来指定要做的事。
除了这个功能外,还有
handlers功能(先判断“当前状态”和“目标状态”是否一致,一致就不执行操作)。tags功能(打标签,可以指定只运行打了标签的操作)
指定变量
等等功能。当然,这些功能都需要我们在playbook中使用相应的关键字,进行编写。
ansible的“清单”(Inventory)
ansible的命令格式:
ansible <host-pattern> [-f forks] [-m module_name] [-a args]
例如:ansible 10.1.1.60 –m ping
-m:是指定使用的模块,ping是模块名
看上面这条命令。使用ansible去ping 10.1.1.60这台主机。相当于我们手动执行ping命令一样。
这个命令正常执行需要两个基本条件:
1)ansible所在的主机可以通过SSH连接到受管主机
2)受管主机的IP地址等信息已经添加到ansible的“管理清单”中
“管理清单”的配置就在/etc/andisble/hosts。下面给出示例
#指定主机
192.168.56.110 ansible_port=22 ansible_user=root ansible_ssh_pass=123456
#指定别名
node1 ansible_host=192.168.56.110 ansible_port=22 ansible_user=root ansible_ssh_pass=123456
#如果报错,将ansible的配置文件/etc/ansible/ansible.cfg中的host_key_checking改为False。
当然,如果我们使用了SSH密钥,就不在需要给出密码和用户了。端口如果是默认的22,也可以省略。YAML风格的/etc/ansible/hosts
all:
children:
pro:
children:
proA:
hosts:
xxx.xxx.xxx.xxx
proB:
hosts:
xxx.xxx.xxx.xxx
ansible的常用模块
命令模块
command
描述
command 模块可以帮助我们在远程主机上执行命令。
注意:使用 command 模块在远程主机中执行命令时,不会经过远程主机的 shell 处理,在使用 command 模块时,如果需要执行的命令中含有重定向、管道符等操作时,这些符号也会失效,比如”<”, “>”, “|”, “;” 和 “&” 这些符号,如果你需要这些功能,可以参考后面介绍的 shell 模块。还有一点需要注意,如果远程节点是 windows 操作系统,则需要使用 win_command 模块。
执行 ansible 时,不加 -m 默认使用 command ,可以在 /etc/ansible/ansible.cfg 中修改。
# default module name for /usr/bin/ansible
#module_name = command
参数
free_form参数 :必须参数,指定需要远程执行的命令。需要说明一点,free_form
参数与其他参数(如果想要使用一个参数,那么则需要为这个参数赋值,也就是name=value模式)并不相同。比如,当我们想要在远程主机上执行 ls 命令时,我们并不需要写成”free_form=ls
” ,这样写反而是错误的,因为并没有任何参数的名字是 free_form
,当我们想要在远程主机中执行 ls 命令时,直接写成 ls 即可。因为 command 模块的作用是执行命令,所以,任何一个可以在远程主机上执行的命令都可以被称为 free_form
。
chdir参数 : 此参数的作用就是指定一个目录,在执行对应的命令之前,会先进入到 chdir 参数指定的目录中。
creates参数 :看到 creates,你可能会从字面上理解这个参数,但是使用这个参数并不会帮助我们创建文件,它的作用是当指定的文件存在时,就不执行对应命令,比如,如果 /testdir/test
文件存在,就不执行我们指定的命令。
removes参数 :与 creates 参数的作用正好相反,它的作用是当指定的文件不存在时,就不执行对应命令,比如,如果 /testdir/tests
文件不存在,就不执行我们指定的命令,此参数并不会帮助我们删除文件。
shell
描述
shell 模块可以帮助我们在远程主机上执行命令。与 command 模块不同的是,shell 模块在远程主机中执行命令时,会经过远程主机上的 /bin/sh
程序处理。
参数
free_form参数 :必须参数,指定需要远程执行的命令,但是并没有具体的一个参数名叫free_form
,具体解释参考 command 模块。
chdir参数 : 此参数的作用就是指定一个目录,在执行对应的命令之前,会先进入到 chdir 参数指定的目录中。
creates参数 :使用此参数指定一个文件,当指定的文件存在时,就不执行对应命令,可参考command 模块中的解释。
removes参数 :使用此参数指定一个文件,当指定的文件不存在时,就不执行对应命令,可参考 command 模块中的解释。
executable参数:默认情况下,shell 模块会调用远程主机中的 /bin/sh
去执行对应的命令,通常情况下,远程主机中的默认 shell 都是 bash。如果你想要使用其他类型的 shell 执行命令,则可以使用此参数指定某种类型的 shell 去执行对应的命令。指定 shell 文件时,需要使用绝对路径。
script
描述
script 模块可以帮助我们在远程主机上执行 ansible 管理主机上的脚本,也就是说,脚本一直存在于 ansible 管理主机本地,不需要手动拷贝到远程主机后再执行。
参数
free_form参数 :必须参数,指定需要执行的脚本,脚本位于 ansible 管理主机本地,并没有具体的一个参数名叫 free_form
,具体解释请参考 command 模块。
chdir参数 : 此参数的作用就是指定一个远程主机中的目录,在执行对应的脚本之前,会先进入到 chdir 参数指定的目录中。
creates参数 :使用此参数指定一个远程主机中的文件,当指定的文件存在时,就不执行对应脚本,可参考 command 模块中的解释。
removes参数 :使用此参数指定一个远程主机中的文件,当指定的文件不存在时,就不执行对应脚本,可参考 command 模块中的解释。
文件模块
fetch
描述
从远程节点获取文件
参数
src:源文件路径
dest:目标路径。如果以“/”结尾,则会直接使用src的basename作文件名
copy
描述
拷贝管理主机上的文件到远程节点
参数
src:
dest:
content:当不使用src指定拷贝的文件时,可以用content指定文件内容。src与从content必有一个。通过content和dest,可以在目标节点新建文件,并写入content指定的内容
force:远程主机已有同名文件存在,是否覆盖。默认yes
backup:远程主机已有同名文件存在,是否备份
owner:指定文件拷贝到远程主机后的属主
group:指定文件拷贝到远程主机后的属组
mode:指定文件拷贝到远程主机后的权限
file
描述
执行一些对文件的基本操作。如创建/删除 文件/目录,修改文件权限等
参数
path:必须参数,指定要操作的文件或目录
state:directory(创建目录)
touch(创建文件)
link(软链接)
hard(硬链接)
absent(删除)
src:指定链接源
force:是否强制创建链接文件,无论源文件是否存在。
owner:
group:
mode:
recurse:递归操作。可用于递归修改目录下的文件属性
find
描述
帮助我们在远程主机查找符合条件的文件,就像find命令一样
参数
paths:
recures:递归查找
hidden:默认隐藏文件在查找时会被忽略。可以yes开启
file_type:any,directory,file,link
patterns:指定要查找的文件名,支持shell(如通配符)或正则匹配。默认使用shell匹配。若要用python的正则匹配,徐江user_regex设为yes
user_regex:是否使用正则
contains:根据文章内容查找文件。此参数的值为正则表达式
age:根据时间范围查找文件。默认的时间标准是mtime。-3d表示3天以前。3d表示3天内。还可用秒(s),分(m),时(h),星期(w)
age_stamp:指定时间种类标准,包括atime,ctime,mtime,默认是mtime
size:按文件大小查找文件。“-”号表示小于。单位有t,g,m,k,b
get_checksum:当文件被找到时,同时返回文件的sha1校验码
blockinfile
描述
在指定的文件中插入“一段文本”,这段文本是标记过的。在以后的操作中可以通过“标记”找到这段文本,修改或者删除它。
参数
path:
block:指定我们想要操作的那“一段文本”。此参数有个别名“content”
marker:如果我们插入一段文本,ansible会自动对这段文本进行两个标记。一个开始标记,一个结束标记。既有默认值,我们也可以用mark参数自定义。如marker=#{markder}test。这样显示结果为# BEGIN test和# END test
state:present(默认值是present,执行插入操作或更新操作)
absent(删除对用标记的段落)
insertafter参数 :在插入一段文本时,默认会在文件的末尾插入文本,如果你想要将文本插入在某一行的后面,可以使用此参数指定对应的行,也可以使用正则表达式(python正则),表示将文本插入在符合正则表达式的行的后面。如果有多行文本都能够匹配对应的正则表达式,则以最后一个满足正则的行为准,此参数的值还可以设置为EOF,表示将文本插入到文档末尾。
insertbefore参数 :在插入一段文本时,默认会在文件的末尾插入文本,如果你想要将文本插入在某一行的前面,可以使用此参数指定对应的行,也可以使用正则表达式(python正则),表示将文本插入在符合正则表达式的行的前面。如果有多行文本都能够匹配对应的正则表达式,则以最后一个满足正则的行为准,此参数的值还可以设置为BOF,表示将文本插入到文档开头。
backup参数 :是否在修改文件之前对文件进行备份。
create参数 :当要操作的文件并不存在时,是否创建对应的文件。
例子
lineinfile
描述
确保”某一行文本”存在于指定的文件中,或者确保从文件中删除指定的”文本”(即确保指定的文本不存在于文件中),还可以根据正则表达式,替换”某一行文本”。
参数
path参数 :必须参数,指定要操作的文件。
line参数 : 使用此参数指定文本内容。
regexp参数:使用正则表达式匹配对应的行,当替换文本时,如果有多行文本都能被匹配,则只有最后面被匹配到的那行文本才会被替换,当删除文本时,如果有多行文本都能被匹配,这么这些行都会被删除。
state参数:当想要删除对应的文本时,需要将state参数的值设置为absent,absent为缺席之意,表示删除,state的默认值为present。
backrefs参数: 默认情况下,当根据正则替换文本时,即使regexp参数中的正则存在分组,在line参数中也不能对正则中的分组进行引用,除非将backrefs参数的值设置为yes。backrefs=yes表示开启后向引用,这样,line参数中就能对regexp参数中的分组进行后向引用了,这样说不太容易明白,可以参考后面的示例命令理解。backrefs=yes除了能够开启后向引用功能,还有另一个作用,默认情况下,当使用正则表达式替换对应行时,如果正则没有匹配到任何的行,那么line对应的内容会被插入到文本的末尾,不过,如果使用了backrefs=yes,情况就不一样了,当使用正则表达式替换对应行时,同时设置了backrefs=yes,那么当正则没有匹配到任何的行时,则不会对文件进行任何操作,相当于保持原文件不变。
insertafter参数:借助insertafter参数可以将文本插入到“指定的行”之后,insertafter参数的值可以设置为EOF或者正则表达式,EOF为End Of File之意,表示插入到文档的末尾,默认情况下insertafter的值为EOF,如果将insertafter的值设置为正则表达式,表示将文本插入到匹配到正则的行之后,如果正则没有匹配到任何行,则插入到文件末尾,当使用backrefs参数时,此参数会被忽略。
insertbefore参数:借助insertbefore参数可以将文本插入到“指定的行”之前,insertbefore参数的值可以设置为BOF或者正则表达式,BOF为Begin Of File之意,表示插入到文档的开头,如果将insertbefore的值设置为正则表达式,表示将文本插入到匹配到正则的行之前,如果正则没有匹配到任何行,则插入到文件末尾,当使用backrefs参数时,此参数会被忽略。
backup参数:是否在修改文件之前对文件进行备份。
create参数 :当要操作的文件并不存在时,是否创建对应的文件。
例子
replace
描述
根据指定的正则替换文件中的字符串。文件中所有正则匹配到的字符串都会被替换
参数
path:
regexp:正则
replace:要替换成的字符串
backup:修改前,先备份
stat
包模块
yum_repository
描述
管理远程主机的yum仓库
参数
name:必选参数。指定要操作的唯一的仓库ID。就是.repo文件中每个仓库里对应的“中括号”里的值。如[ceph-noarch]
baseurl:仓库的baseurl
description:注释
file:文件名,.repo的前缀
enabled:是否激活对应的yum源,默认为yes
gpgcheck:是否开启rpm包验证功能。默认为no
gpgcakey:指定验证包所需要的公钥
state:默认为present。absent表删除
yum
描述
在远程主机上通过yum源管理软件包
参数
name:指定要管理的软件包
state:指定软件包状态。默认为present(等效于installed)。还有latest、absent(等效于removed)。latest表安装yum中的最新版本
disable_gpg_check:是否禁用rpm包的公钥gpg验证。默认为no,表示不禁用验证。
enablerepo:安装软件包时,临时启用的yum源
diablerepo:安装软件包时,临时禁用的yum源
系统模块
ping
验证主机连接性
cron
描述
cron模块让我们可以远程设置定时任务。
参数
minute:
hour:
day:
month:
weekday:
special_time:reboot,yearly,annually(每一年,等于yearly),monthly,weekly,daily,hourly
user:不指定任务用户,默认为管理员
job:实际要执行的命令/脚本
name:任务的名称
state:设为absent时,删除对应name的任务
disabled:根据name,使对应任务失效。使用此参数时,任务的job,时间设定都得写对。不然在注销任务的同时,会修改原任务
backup:修改/删除前,先备份
user
描述
管理远程主机的用户,增删改 用户,为用户创建密钥对,等操作
参数
name:
group:
groups:附加组设置,当如果不想覆盖原来的,则要设置append为yes
append:默认为no
shell:
uid:
expire:用户过期时间。比如你要设置“2018-3-21”为过期时间,首先”date –d 2018-3-12 +%s”,获得和epoch时间相差的秒数。然和通过获得秒数设置
comment:用户注释信息
state:默认为present,表存在。absent,表删除用户
remove:删除用户时,是否移除家目录。默认为no
password:设置用户密码,但设置的密码得是哈希后的字符串。可以用python的crypt模块。crypt.crypt('password’)得到密文
update_password:always表如果password设置的值和当前密码不同,则直接更新。on_create表如果不同,则不更新。
genarate_ssh_key:默认为no。在对用用户家目录下生成SSH密钥对。id_rsa和id_rsa.pub。密钥对若已存在,则不做操作
ssh_key_file:自定路径和名称
ssh_key_comment:设置公钥注释信息
ssh_key_passphrase:设置私钥密码。已存在同名私钥,不作操作
ssh_key_type:设置密钥类型。默认为rsa。已存在同名密钥,不做操作
group
描述
管理远程主机的组
参数
name:
state:默认为present,absent表删除
gid:
setup
描述
这个模块被playbooks自动调用来收集关于远程主机的有用变量,这些变量可以在playbooks中使用。
概要
我们在运行playbook时,会发现总是会默认运行一个“【Gathering Factes】”的任务。这个任务会收集远程主机的相关信息(例如远程主机我的IP,主机名,系统版本,配置信息等),这些信息会被保存到对应的变量中。而这个任务,就是通过setup模块实现的。
setup返回的信息是json格式的字符串。
除了基本信息外。ansible默认会去/etc/ansible/facts.d目录下查找目标主机的自定义信息。自定义信息需要写在以“.fact”为后缀的文件中。同时这些文件的内容需要是INI格式或json格式。如:
#testinfo.fact
#INI风格
[testmsg]
msg1=This is the first custom test message
msg2=This is the second custom test message
#JSON格式
{
"testmsg":{
"msg1":"This is the first custom test message",
"msg2":"This is the second custom test message"
}
}
参数
filter:设置shell风格的通配符。以匹配要查找的内容
ansible test70 -m setup -a 'filter=ansible_memory_mb' # 这里匹配的ansible_memory_mb相当于是一个变量名。
ansible test70 -m setup -a "filter=*mb*"
fact_Path:指定.fact文件的路径
与debug的混合使用
除了用filter参数过滤自己想要的信息。还可以在playbook中使用debug来过滤。
先看一下debug模块:
#通过msg参数,打印出自定义的信息
- name: debug demo
debug:
msg: this is debug info,The test file has been touched
#打印变量testvar的键值对
vars:
testvar: value of test variable
tasks:
- name: debug demo
debug:
var: testvar
#打印testvar的值
- name: debug demo
debug:
msg: "value of testvar is : {{testvar}}"
#用debug过率出远程主机的内存信息
---
- hosts: test70
remote_user: root
tasks:
- name: debug demo
debug:
msg: "Remote host memory information: {{ansible_memory_mb}}"
注意:这个变量名存储的就是远程主机的内存信息。
#过滤内存信息里的子项
语法一示例:
debug:
msg: "Remote host memory information : {{ansible_memory_mb.real}}"
语法二示例:
debug:
msg: "Remote host memory information : {{ansible_memory_mb['real']}}"
service
描述
帮助我们管理远程主机上的服务。启动,停止,重启,重载配置文件。但前提是这个服务必须被BSD init, OpenRC, SysV, Solaris SMF, systemd, upstart中的任意一种管理支持。
参数
name:
state:started,stopped,restarted,reloaded
enable:是否开机自启
ansible的playbook
剧本入门
基础命令
剧本需要用YAML格式编写。文件后缀我们使用.yml。关于剧本的命令如下
#运行剧本
ansible-playbook file.yml
#语法检查
ansible-playbook --syntax-check /dir/file.yml
#模拟执行
ansible-playbook –check file.yml
注意:模拟的结果只能参考。因为模拟执行不是真正执行。这就意味着有些任务的结果没有正确返回,模拟就有可能报错。但这不代表会真正报错
剧本示例
先测试联通性,然后创建node目录。目标主机使用的是别名proA和proB
---
remote_user: root
tasks:
- name: Ping the host
ping:
- name: make the directory test
file:
state: directory
上面的hosts也可以写为(即同行可变分行)
- hosts:
proA
proB
file也可以写为(即:号可换等号。当然也可写成分行)
file: path=/root/node1,state=directory
handlers
handlers可以被理解为一种task。handlers中的任务会被task中的“任务”调用。而只有task中的任务进行了实际操作(造成了实际的改变)。对应调用的hardlers任务才会被执行。
单handlers
#修改Nginx监听的默认端口,并重启服务
---
- hosts: proA
remote_user: root
tasks:
- name: Modify the configuration
linefile:
path=/etc/nginx/conf.d/test.file.net.conf
regexp=”listen(.*) 8080(.*)”
line=”listen1 802”
backrefs=yes
backup=yes
notify:
restart nginx
handlers:
- name: restart nginx
service:
name=nginx
state=restarted
多handlers
#多个任务就对应多个notify
---
- hosts: test70
remote_user: root
tasks:
- name: make testfile1
file: path=/testdir/testfile1
state=directory
notify: ht2
- name: make testfile2
file: path=/testdir/testfile2
state=directory
notify: ht1
handlers:
- name: ht1
file: path=/testdir/ht1
state=touch
- name: ht2
file: path=/testdir/ht2
state=touch
注意:handlers的执行顺序,由handlers任务表中定义的任务顺序决定。tasks notify的顺序不影响handlers任务执行顺序
一次notify多个handlers
---
- hosts: test70
remote_user: root
tasks:
- name: task1
file: path=/testdir/testfile
state=touch
notify: handler group1
handlers:
- name: handler1
listen: handler group1
file: path=/testdir/ht1
state=touch
- name: handler2
listen: handler group1
file: path=/testdir/ht2
state=touch
我们可以把listen的值理解为组名。notify调用的组名。这样一次就调用了handler1和handler2
tags
在一个很长的playbook中,只想执行其中的一部分任务或一类任务,就需要tags。tags帮助我们给任务打标签。通过在运行.yml文件时,通过对标签的过滤在执行相应任务。
基础写法
---
- hosts: test70
remote_user: root
tasks:
- name: task1
file:
path: /testdir/t1
state: touch
tags: t1
- name: task2
file: path=/testdir/t2
state=touch
tags: t2
- name: task3
file: path=/testdir/t3
state=touch
tags: t3
标签命令一(指定标签)
#只运行tag2的任务
ansible-playbook --tags=t2 file.yml
#只不运行tag2的任务
ansible-playbook --skip-tags=’t2’ file.yml
tages的多种写法
tages还能这样定义:
tags:
- t1
tags: ['t2']
每个tags还能有多个标签:
语法一:
tags:
- testtag
- t1
语法二:
tags: tag1,t1
语法三:
tags: ['tagtest','t2']
不同任务相同标签
不同的任务可以使用相同的标签:
写法一:
---
- hosts: test70
remote_user: root
tasks:
- name: install httpd package
tags: httpd,package
yum:
name=httpd
state=latest
- name: start up httpd service
tags: httpd,service
service:
name: httpd
state: started
写法二:
#当tags写在play而非task中时,play中所有task都会继承当前play中的tags。而同时又拥有自己的tags。
---
- hosts: test70
remote_user: root
tags: httpd
tasks:
- name: install httpd package
tags: ['package']
yum:
name=httpd
state=latest
- name: start up httpd service
tags:
- service
service:
name: httpd
state: started
标签命令二(多标签,预览)
调用标签时,可以指定多个标签:
ansible-playbook --tags package,service file.yml
预览playbook中的标签:
ansible-playbook --list-tags file.yml
特殊tag
ansible还有5个特殊的tag:
always:假设某任务标签为[“t3”,”always”]。则除非明确“--skip-tags”为t3或always。则即使--tags指定没有t3,该任务也会被调用
never(2.5版本):只有明确指定--tags为never,才会调用该任务
tagged:只运行打了标签的任务
untagged:只运行没打标签的任务
all:运行所有任务。默认情况下,playbook就如--tags all一样运行
变量
变量名应该由字母、数字、下划线组成。变量名需要以字母开头,ansible内置的关键字不能作为变量名。
我们既可在playbook内通过vars关键字指定变量,也可分离变量文件和playbook。
vars指定变量
---
- hosts: test70
vars:
testvar1: testfile
remote_user: root
tasks:
- name: task1
file:
path: /testdir/{{ testvar1 }}
state: touch
其余写法:
写法一:
vars:
testvar1: testfile
testvar2: testfile2
写法二:YMAL的块序列语法
vars:
- testvar1: testfile
- testvar2: testfile2
写法三:类似属性的方式定义
---
- hosts: test70
remote_user: root
vars:
nginx:
conf80: /etc/nginx/conf.d/80.conf
conf8080: /etc/nginx/conf.d/8080.conf
tasks:
- name: task1
file:
path: "{{nginx.conf80}}"
state: touch
- name: task2
file:
path: "{{nginx['conf8080']}}"
state: touch
注意:
如果变量名如{{nginx.conf80}}在使用时,前面无任何路径,则需加双引号“”,反之,则可以不加。当然如果用path=这种写法,也可以不加
变量文件分离
首先定义变量文件nginx_vars.yml。三种示例任选一种
语法一示例:
testvar1: testfile
testvar2: testfile2
语法二示例:
- testvar1: testfile
- testvar2: testfile2
语法三示例:
nginx:
conf80: /etc/nginx/conf.d/80.conf
conf8080: /etc/nginx/conf.d/8080.conf
在play_book中使用vars_file关键字导入文件。当然,使用vars_file的同时,也能同时使用vars
---
- hosts: test70
remote_user: root
vars_files:
- /testdir/ansible/nginx_vars.yml
tasks:
- name: task1
file:
path={{nginx.conf80}}
state=touch
- name: task2
file:
path={{nginx['conf8080']}}
state=touch
注册变量
ansible的模块在运行后,其实都会返回一些“返回值”。只是默认情况下,这些“返回值”并不会显示。我们可以将这些返回值写入到某个变量,这样就能够通过引用对应变量而获取到这些返回值。将模块的返回值写入到变量中就被称为“注册变量”。例如:
---
- hosts: test70
remote_user: root
tasks:
- name: test shell
shell: "echo test > /var/testshellfile"
register: testvar
- name: shell module return values
debug:
var: testvar
解析:利用register,将shell任务的返回值写入了testvar变量。然后用debug模块,显示变量键值对
提示用户输入信息并写入变量
某些脚本需要用户输入信息以进行交互。这时,我们就需要var_prompt关键字
---
- hosts: test70
remote_user: root
vars_prompt:
- name: "your_name"
prompt: "What is your name"
private
- name: "your_age"
prompt: "How old are you"
tasks:
- name: output vars
debug:
msg: Your name is {{your_name}},You are {{your_age}} years old
var_prompt变量中可使用private关键字。默认为yes,表示输入不可见。
还能设置提示信息为默认值。就像case的default选项一样:
---
- hosts: test70
remote_user: root
vars_prompt:
- name: "solution"
prompt: "Choose the solution you want ”
A: solutionA
B: solutionB
C: solutionC "
private: no
default: A
tasks:
- name: output vars
debug:
msg: The final solution is {{solution}}.
创建用户的脚本:
---
- hosts: test70
remote_user: root
vars_prompt:
- name: "user_name" #输入用户名
prompt: "Enter user name"
private: no
- name: "user_password" #输入密码
prompt: "Enter user password"
encrypt: "sha512_crypt" #encrypt关键字可加密密码。value值是算法。使用这个关键字需要passlib库
confirm: yes #确认密码。即需要输入两次密码
tasks:
- name: create user
user:
name: "{{user_name}}"
password: "{{user_password}}"
命令行传入变量
我们在playbook中使用的变量。可以由命令行传入。如果存在同名变量。命令行传入的变量优先级更高。传入变量使用-e或--extra-vars选项。可以一次传入多个变量。也可传入变量文件
---
- hosts: test70
remote_user: root
tasks:
- name: "Passing Variables On The Command Line"
debug:
msg: "{{pass_var}}"
ansible-playbook cmdvar.yml -e 'pass_var="test" pass_var1="test1"'
ansible-playbook cmdvar.yml -e "@/testdir/ansible/testvar"
ansible命令也可以传入变量:
ansible test70 -e "testvar=test" -m shell -a "echo {{testvar}}"
传入的变量除了键值对形式,也支持json的格式:
ansible-playbook cmdvar.yml -e '{"testvar":"test","testvar1":"test1"}'
ansible-playbook cmdvar.yml -e '{"countlist":["one","two","three","four"]}'
以上是关于ansible快速入门的主要内容,如果未能解决你的问题,请参考以下文章