[TOC]
0x00 快速入门
描述:ansible使用ansible-doc --list
可以看见所有的模块,ansble-doc -s
模块名称显示模块使用详情;
ansible-doc --list
ansible-doc --list | grep "ping"
模块名称及作用一览:
- fetch 模块:进行文件拉取
- copy 模块:进行文件/内容的拷贝
- file 模块:进行对文件/目录进行创建与操作
- blockinfile 模块:在指定的文件中插入”一段文本”
0x01 常使用模块介绍
文件操作类模块
copy
描述:copy模块的作用就是拷贝文件
模块参数查看:
代码语言:javascript复制src参数 :用于指定需要copy的文件或目录
dest参数 :用于指定文件将被拷贝到远程主机的哪个目录中,dest为必须参数
content参数 :当不使用src指定拷贝的文件时,可以使用content直接指定文件内容,src与content两个参数必有其一,否则会报错。
force参数 : 当远程主机的目标路径中已经存在同名文件,并且与ansible主机中的文件内容不同时,是否强制覆盖,可选值有yes和no,默认值为yes,表示覆盖,如果设置为no,则不会执行覆盖拷贝操作,远程主机中的文件保持不变。
backup参数 : 当远程主机的目标路径中已经存在同名文件,并且与ansible主机中的文件内容不同时,是否对远程主机的文件进行备份,可选值有yes和no,当设置为yes时,会先备份远程主机中的文件,然后再将ansible主机中的文件拷贝到远程主机。
owner参数 : 指定文件拷贝到远程主机后的属主,但是远程主机上必须有对应的用户,否则会报错。
group参数 : 指定文件拷贝到远程主机后的属组,但是远程主机上必须有对应的组,否则会报错。
mode参数 : 指定文件拷贝到远程主机后的权限,如果你想将权限设置为"rw-r--r--",则可以使用mode=0644表示,如果你想要在user对应的权限位上添加执行权限,则可以使用mode=u x表示。
基础示例:
代码语言:javascript复制#(1)将ansible主机中/testdir/copytest文件复制到远程主机的/opt目录下
#注意如果copytest文件已经存在于远程主机的/opt目录中,并且远程主机中的copytest与ansible主机中copytest文件内容不同远程主机中的copytest文件将被覆盖。
ansible testA -m copy -a "src=/testdir/copytest dest=/opt/" #src代表的ansible主机 / dest 代表了受管控的主机
#(2)在远程主机的/opt目录下生成文件test,test文件中有两行文本,第一行文本为aaa,第二行为bbb
#当使用content指定文件内容时,dest参数对应的值必须是一个文件,而不能是一个路径。
ansible testA -m copy -a 'content="aaanbbbn" dest=/opt/test.txt'
#(3)将ansible主机中/testdir/copytest文件复制到远程主机的/opt目录中时
#远程主机中已经存在文件,并且文件内容与ansible主机中文件的内容不一致,则不执行拷贝操作远程主机中的/opt/copytest文件内容不会被改变。
ansible test70 -m copy -a "src=/testdir/copytest dest=/opt/ force=no"
#(4)执行拷贝操作之前,会将远程主机中的原文件重命名,以作备份,然后再进行拷贝操作
ansible test70 -m copy -a "src=/testdir/copytest dest=/opt/ backup=yes"
#(5)拷贝文件设置对应用户和组以及权限
ansible test70 -m copy -a "src=/testdir/copytest dest=/opt/ owner=zsy"
ansible test70 -m copy -a "src=/testdir/copytest dest=/opt/ group=zsy"
ansible test70 -m copy -a "src=/testdir/copytest dest=/opt/ group=zsy"
WeiyiGeek.示例2.文件内容
fetch
描述: 将远程主机上的文件拉取到本地之中
代码语言:javascript复制ansible weiyigeek-226 -m fetch -a "src=/home/weiyigeek/prometheus/k8s_ca.crt dest=/tmp"
ansible weiyigeek-226 -m fetch -a "src=/home/weiyigeek/prometheus/k8s_token dest=/tmp"
weiyigeek-226 | CHANGED => {
"changed": true,
"checksum": "22c40a4f83ad82343affbab3f8a732c14accbdcd",
"dest": "/tmp/k8s_token/weiyigeek-226/home/weiyigeek/prometheus/k8s_token",
"md5sum": "c9d780a62db497bbfd995b548887e4ed",
"remote_checksum": "22c40a4f83ad82343affbab3f8a732c14accbdcd",
"remote_md5sum": null
}
file
描述:file模块的作用完成一些对文件的基本操作,比如创建文件或目录、删除文件或目录、修改文件权限等
代码语言:javascript复制path参数 :必须参数, 用于指定要操作的文件或目录
state参数 :此参数非常灵活,当我们想要创建软链接文件时,需将state设置为link,想要创建硬链接文件时,需要将state设置为hard,当我们想要删除一个文件时(删除时不用区分目标是文件、目录、还是链接),则需要将state的值设置为absent,"absent"为缺席之意,当我们想让操作的目标"缺席"时,就表示我们想要删除目标。
src参数 :当state设置为link或者hard时,表示我们想要创建一个软链或者硬链,所以,我们必须指明软链或硬链链接的哪个文件,通过src参数即可指定链接源。
force参数 : 当state=link的时候,可配合此参数强制创建链接文件,当force=yes时,表示强制创建链接文件,
owner参数 :用于指定被操作文件的属主
group参数 :用于指定被操作文件的属组
mode参数:用于指定被操作文件的权限
recurse参数:当要操作的文件为目录,将recurse设置为yes,可以递归的修改目录中文件的属性。
实际案例:
代码语言:javascript复制#(1)在test70主机上创建一个名为testfile的文件,如果testfile文件已经存在,则会更新文件的时间戳,与touch命令的作用相同。
ansible test70 -m file -a "path=/testdir/testfile state=touch"
#(2)在test70主机上创建一个名为testdir的目录,如果testdir目录已经存在,则不进行任何操作。
ansible test70 -m file -a "path=/testdir/testdir state=directory"
# (3) 在test70上为testfile文件创建软链接文件,软链接名为linkfile,执行下面命令的时候,testfile已经存在。
ansible test70 -m file -a "path=/testdir/linkfile src=/testdir/testfile state=link"
# (4) 在test70上为testfile文件创建硬链接文件,硬链接名为hardfile,执行下面命令的时候,testfile已经存在。
ansible test70 -m file -a "path=/testdir/hardfile state=hard src=/testdir/testfile"
# (5) 删除远程 机器上的指定文件或目录
ansible test70 -m file -a "path=/testdir/testdir state=absent"
#(6)在创建链接文件时,如果源文件不存在,或者链接文件与其他文件同名时,强制覆盖同名文件或者创建链接文件,参考上述force参数的解释。
ansible test70 -m file -a "path=/testdir/linkfile state=link src=sourcefile force=yes"
#(7)在创建文件或目录的时候指定属主,或者修改远程主机上的文件或目录的属主。
ansible test70 -m file -a "path=/testdir/abc state=touch owner=zsy"
ansible test70 -m file -a "path=/testdir/abc owner=zsy"
ansible test70 -m file -a "path=/testdir/abc state=directory owner=zsy"
#(8)在创建文件或目录的时候指定属组,或者修改远程主机上的文件或目录的属组。
ansible test70 -m file -a "path=/testdir/abb state=touch group=zsy"
ansible test70 -m file -a "path=/testdir/abb group=zsy"
ansible test70 -m file -a "path=/testdir/abb state=directory group=zsy"
#(9)在创建文件或目录的时候指定权限,或者修改远程主机上的文件或目录的权限。
ansible test70 -m file -a "path=/testdir/abb state=touch mode=0644"
ansible test70 -m file -a "path=/testdir/abb mode=0644"
ansible test70 -m file -a "path=/testdir/binfile mode=4700"
ansible test70 -m file -a "path=/testdir/abb state=directory mode=0644"
#(10)当操作远程主机中的目录时,同时递归的将目录中的文件的属主属组都设置为zsy。
ansible test70 -m file -a "path=/testdir/abd state=directory owner=zsy group=zsy recurse=yes"
blockinfile
描述:blockinfile模块可以帮助我们在指定的文件中插入”一段文本”,这段文本是被标记过的以便在以后的操作中可以通过”标记”找到这段文本,然后修改或者删除它
代码语言:javascript复制path参数 :必须参数,指定要操作的文件。
block参数 :想要操作的那"一段文本"别名叫"content"使用content或block的作用是相同的。
marker参数 :假如我们想要在指定文件中插入一段文本,ansible会自动为这段文本添加两个标记,一个开始标记,一个结束标记
#默认情况下,开始标记为# BEGIN ANSIBLE MANAGED BLOCK,结束标记为# END ANSIBLE MANAGED BLOCK
state参数 : 两个可选值present与absent,如果对应的文件中已经存在对应标记的文本并且将state的值设置为absent,则表示从文件中删除对应标记的段落。
insertafter参数 :在插入一段文本时,默认会在文件的末尾插入文本,将文本插入在某一行的后面,可以使用此参数指定对应的行
insertbefore参数 :在插入一段文本时,默认会在文件的末尾插入文本,将文本插入在某一行的前面,可以使用此参数指定对应的行
backup参数 :是否在修改文件之前对文件进行备份。
create参数 :当要操作的文件并不存在时,是否创建对应的文件。
我们可以使用marker参数自定义”标记”,比如,marker=#{mark}test 这样设置以后,开始标记变成了# BEGIN test,结束标记变成了# END test
,没错{mark}会自动被替换成开始标记和结束标记中的BEGIN和END,我们也可以插入很多段文本为不同的段落添加不同的标记
,下次通过对应的标记即可找到对应的段落。
基础示例:
代码语言:javascript复制#(1)将管理端的/etc/rc.d/rc.local文件复制到/tmp目录中,并且在testA受空主机中的/tmp/rc.local文件尾部插入自启脚本
ansible testA -m copy -a "src=/etc/rc.d/rc.local dest=/tmp/"
ansible testA -m blockinfile -a 'path=/tmp/rc.local block="systemctl start mariadbnsystemctl start httpd" ' #使用path参数指定要操作的文件,使用block参数指定文本块内容,
WeiyiGeek.blockinfile
代码语言:javascript复制#(2)自定义标记,但是自定义的标记仍然要"成对出现",需要有开始标记和结束标记,示例如下
ansible testA -m blockinfile -a 'path=/tmp/rc.local block="systemctl start mariadbnsystemctl start httpd" marker="#{mark} serivce to start" '
# 10.10.107.221 | CHANGED => {
# "ansible_facts": {
# "discovered_interpreter_python": "/usr/bin/python"
# },
# "changed": true,
# "msg": "Block inserted"
# }
#上例中的"{mark}" 会自动被替换成开始标记中的"BEGIN" 和结束标记中的 "END",如果文件中不存在同名标记的文本块,那么文件的末尾将会出现如下文本块。
#BEGIN serivce to start
systemctl start mariadb
systemctl start httpd
#END serivce to start
#(3) 执行同样的ansible命令,将block设置为空这时候blockinfile模块会删除对应标记的文本块
ansible testA -m blockinfile -a 'path=/tmp/rc.local block=" " marker="#{mark} serivce to start" ' #或者采用下面语句
ansible testA -m blockinfile -a 'path=/tmp/rc.local marker="#{mark} serivce to start" t" state=absent ' #state值设置为absent,表示删除对应标记的文本
#执行后效果
# BEGIN serivce to start
# END serivce to start
#(4)插入在文件开头,或者根据正则表达式去匹配对应的行,然后将文本块插入到匹配到的行的前头或者后头
#插入文档开头
ansible test70 -m blockinfile -a 'path=/tmp/rc.local block="####blockinfile test####" marker="#{mark} test" insertbefore=BOF' #BOF表示Begin Of File
#插入文档结尾
ansible test70 -m blockinfile -a 'path=/tmp/rc.local block="####blockinfile test####" marker="#{mark} test" insertafter=EOF'
#使用如下命令表示使用正则表达式匹配行,将文本块插入到 "以#!/bin/bash开头的行" 之后 (值得学习)
ansible test70 -m blockinfile -a 'path=/testdir/rc.local block="####blockinfile test####" marker="#{mark} test reg" insertafter="^#!/bin/bash" '
#(5)使用backup参数,可以在操作修改文件之前,对文件进行备份,备份的文件会在原文件名的基础上添加时间戳
ansible testA -m blockinfile -a 'path=/tmp/rc.local marker="#{mark} serivce to start" state=absent backup=yes'
#执行后会删除示例3的备注
#(6)使用create参数,如果指定的文件不存在,则创建它
ansible testA -m blockinfile -a 'path=/testdir/test block="test" marker="#{mark} test" create=yes'
lineinfile
描述:lineinfile模块,确保”某一行文本”存在于指定的文件中,或者确保从文件中删除指定的”文本”(即确保指定的文本不存在于文件中),还可以根据正则表达式,替换”某一行文本”。
参数:
代码语言:javascript复制path参数 :必须参数,指定要操作的文件。
line参数 : 使用此参数指定文本内容。
regexp参数 :使用正则表达式匹配对应的行,当替换文本时如果有多行文本都能被匹配,则只有最后面被匹配到的那行文本才会被替换,当删除文本时,如果有多行文本都能被匹配,这么这些行都会被删除。
state参数:当想要删除对应的文本时将state参数的值设置为absent就可以删除,state的默认值为present;
insertafter参数:EOF 表示插入到文档的末尾 或者 正则找寻
insertbefore参数:EOF 表示插入到文档的末尾 或者 正则找寻
backrefs参数:默认情况下,当根据正则替换文本时,即使regexp参数中的正则存在分组,在line参数中也不能对正则中的分组进行引用,除非将backrefs参数的值设置为yes,backrefs=yes表示开启后向引用,这样,line参数中就能对regexp参数中的分组进行后向引用了,这样说不太容易明白,参考下面的示例命令比较直观一点,backrefs=yes除了能够开启后向引用功能,还有另一个作用,默认情况下,当使用正则表达式替换对应行时,如果正则没有匹配到任何的行,那么line对应的内容会被插入到文本的末尾,不过,如果使用了backrefs=yes,情况就不一样了,当使用正则表达式替换对应行时,同时设置了backrefs=yes,那么当正则没有匹配到任何的行时,则不会对文件进行任何操作,相当于保持原文件不变,
backup参数:是否在修改文件之前对文件进行备份。
create参数:当要操作的文件并不存在时,是否创建对应的文件。
使用/testdir/test文件作为被操作的文件,test文件内容如下
代码语言:javascript复制# cat /testdir/test
Hello ansible,Hiiii
lineinfile -
Ensure a particular line is in a file,
lineinfile -
or replace an existing line using a back-referenced regular expression.
基础案例:
代码语言:javascript复制#示例1.确保指定的"一行文本"存在于文件中,如果指定的文本本来就存在于文件中,则不做任何操作,如果不存在默认在文件的末尾插入这行文本,
ansible test70 -m lineinfile -a 'path=/testdir/test line="test text"'
#(2)根据正则表达式替换"某一行",如果不止一行能够匹配正则,那么只有最后一个匹配正则的行才会被替换,被匹配行会被替换成line参数指定的内容,但是如果指定的表达式没有匹配到任何一行,那么line中的内容会被添加到文件的最后一行。
ansible test70 -m lineinfile -a 'path=/testdir/test regexp="^line" line="test text" '
#(3)如下命令表示根据正则表达式替换"某一行",如果不止一行能够匹配正则,那么只有最后一个匹配正则的行才会被替换,被匹配行会被替换成line参数指定的内容,但是如果指定的表达式没有匹配到任何一行,那么则不对文件进行任何操作。
ansible test70 -m lineinfile -a 'path=/testdir/test regexp="^line" line="test text" backrefs=yes '
#(4)根据line参数的内容删除行,如果文件中有多行都与line参数的内容相同,那么这些相同的行都会被删除。
ansible test70 -m lineinfile -a 'path=/testdir/test line="lineinfile -" state=absent'
#(5)根据正则表达式删除对应行,如果有多行都满足正则表达式,那么所有匹配的行都会被删除
ansible test70 -m lineinfile -a 'path=/testdir/test regexp="^lineinfile" state=absent'
#默认情况下lineinfile模块不支持后向引用(如果对后向引用不是特别了解,可以参考本站中的另一片文章 Linux正则之分组与后向引用)
#如果将backrefs设置为yes,表示开启支持后向引用,使用如下命令,可以将test示例文件中的"Hello ansible,Hiiii"替换成"Hiiii",如果不设置backrefs=yes,则不支持后向引用,那么"Hello ansible,Hiiii"将被替换成"2"
ansible test70 -m lineinfile -a 'path=/testdir/test regexp="(H.{4}).*(H.{4})" line="2" backrefs=yes'
find
描述:find模块可以帮助我们在远程主机中查找符合条件的文件,就像find命令一样。
命令参数:
代码语言:javascript复制paths参数 :必须参数,指定在哪个目录中查找文件,可以指定多个路径,路径间用逗号隔开,此参数别名path / name可以代替paths。
recurse参数 :设置为yes时(默认),表示在指定目录中递归的查找文件
hidden参数 :默认情况下,隐藏文件会被忽略,当hidden参数的值设置为yes时,才会查找隐藏文件。
file_type参数 : 默认ansible只会根据条件查找"文件",并不会查找"目录"或"软链接"等文件类型,指定查找的文件类型any、directory、file、link
patterns参数 : 使用此参数指定需要查找的文件名称,支持使用shell(比如通配符)或者正则表达式去匹配文件名称
use_regex参数:默认情况下,find模块不会使用正则表达式去解析patterns参数中对应的内容,当use_regex设置为yes时,表示使用python正则解析patterns参数中的表达式,否则,使用glob通配符解析patterns参数中的表达式。
contains参数:使用此参数可以根据文章内容查找文件,此参数的值为一个正则表达式,find模块会根据对应的正则表达式匹配文件内容。(重要)
age参数 :使用此参数可以根据时间范围查找文件,默认以文件的mtime为准与指定的时间进行对比,比如如果想要查找mtime在3天之前的文件,那么可以设置age=3d,如果想要查找mtime在3天以内的文件,可以设置age=-3d,这里所说的3天是按照当前时间往前推3天,可以使用的单位有秒(s)、分(m)、时(h)、天(d)、星期(w)。
age_stamp参数 :文件的时间属性中有三个时间种类,atime、ctime、mtime,当我们根据时间范围查找文件时,可以指定以哪个时间种类为准,当根据时间查找文件时,默认以mtime为准。
size参数 :使用此参数可以根据文件大小查找文件,比如,如果想要查找大于3M的文件,那么可以设置size=3m,如果想要查找小于50k的文件,可以设置size=-50k,可以使用的单位有t、g、m、k、b。
get_checksum参数 :当有符合查找条件的文件被找到时,会同时返回对应文件的sha1校验码,如果要查找的文件比较大,那么生成校验码的时间会比较长。
基础示例:
代码语言:javascript复制#在test70主机的/testdir目录中查找文件内容中包含abc字符串的文件,隐藏文件会被忽略,不会进行递归查找。
ansible test70 -m find -a 'paths=/testdir contains=".*abc.*" '
ansible local -m find -a'paths=/etc/ssh/ contains=".*port" get_checksum=yes'
# "mode": "0600",
# "mtime": 1559095047.9539292,
# "nlink": 1,
# "path": "/etc/ssh/sshd_config",
#@在test70主机的/testdir目录以及其子目录中查找文件内容中包含abc字符串的文件,隐藏文件会被忽略。
ansible test70 -m find -a 'paths=/testdir contains=".*abc.*" recurse=yes '
#在test70主机的/testdir目录中查找以.sh结尾的文件,包括隐藏文件,但是不包括目录或其他文件类型,不会进行递归查找。
ansible test70 -m find -a 'paths=/testdir patterns="*.sh" hidden=yes'
#在test70主机的/testdir目录中查找以.sh结尾的文件,包括隐藏文件,包括所有文件类型,比如文件、目录、或者软链接,但是不会进行递归查找。
ansible test70 -m find -a 'paths=/testdir patterns="*.sh" file_type=any hidden=yes'
#在test70主机的/testdir目录中查找以.sh结尾的文件,包括隐藏文件,包括所有文件类型,比如文件、目录、或者软链接,但是不会进行递归查找。
ansible test70 -m find -a 'paths=/testdir patterns="*.sh" file_type=any hidden=yes'
# mode": "0644",
# "mtime": 1560235311.9034688,
# "nlink": 1,
# "path": "/test.sh",
# "pw_name": "root",
#在test70主机的/testdir目录中查找以.sh结尾的文件,只不过patterns对应的表达式为正则表达式,查找范围包括隐藏文件,包括所有文件类型,但是不会进行递归查找,不会对/testdir目录的子目录进行查找。
ansible test70 -m find -a 'paths=/testdir patterns=".*\.sh" use_regex=yes file_type=any hidden=yes' #重点
#在test70主机的/testdir目录中以及其子目录中查找mtime在4天以内的文件,不包含隐藏文件,不包含目录或软链接文件等文件类型。
ansible test70 -m find -a "path=/testdir age=-4d recurse=yes"
ansible local -m find -a 'paths=/root age=-4d recurse=yes' | more
#在test70主机的/testdir目录中以及其子目录中查找atime在2星期以内的文件,不包含隐藏文件,不包含目录或软链接文件等文件类型。
ansible test70 -m find -a "path=/testdir age=-2w age_stamp=atime recurse=yes"
#在test70主机的/testdir目录中以及其子目录中查找大于2G的文件,不包含隐藏文件,不包含目录或软链接文件等文件类型。
ansible test70 -m find -a "paths=/testdir size=2g recurse=yes"
#在test70主机的/testdir目录中以及其子目录中查找以.sh结尾的文件,并且返回符合条件文件的sha1校验码,包括隐藏文件
ansible test70 -m find -a "paths=/testdir patterns=*.sh get_checksum=yes hidden=yes recurse=yes"
WeiyiGeek.find-sum
注意事项:
- patterns想要使用python的正则匹配,需要将use_regex参数的值设置为yes,否则采用通配符。
replace
描述:replace模块可以根据我们指定的正则表达式替换文件中的字符串,文件中所有被正则匹配到的字符串都会被替换。
replace模块的常用参数
- path参数 :必须参数,指定要操作的文件,2.3版本之前,只能使用dest, destfile, name指定要操作的文件,2.4版本中,仍然可以使用这些参数名,这些参数名作为path参数的别名使用。
- regexp参数 : 必须参数,指定一个python正则表达式,文件中与正则匹配的字符串将会被替换。
- replace参数 : 指定最终要替换成的字符串。
- backup参数 :是否在修改文件之前对文件进行备份,最好设置为yes。
实际案例操作:
代码语言:javascript复制#把test70主机中的/testdir/test文件中的所有ASM替换成asm
ansible test70 -m replace -a 'path=/testdir/test regexp="ASM" replace=asm'
#把test70主机中的/testdir/test文件中的所有ASM替换成asm,但是在操作文件之前进行备份。
ansible test70 -m replace -a 'path=/testdir/test regexp="ASM" replace=asm backup=yes'
ansible local -m replace -a 'path=/tmp/ip.txt regexp="10.10.10.2" replace="192.168.1.1" backup=yes'
local | CHANGED => { #执行成功
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"backup_file": "/tmp/ip.txt.10069.2019-07-25@10:14:42~", #备份的文件
"changed": true,
"msg": "1 replacements made"
}
命令类模块
command
描述:可以帮助我们在远程主机上执行命令,使用command模块在远程主机中执行命令时,不会经过远程主机的shell处理;
注意事项:
- 在使用command模块时,如果需要执行的命令中含有重定向、管道符等操作时,这些符号也会失效,比如
"<", ">", "|", ";" 和 "&"
这些符号,如果你需要这些功能,可以参考后面介绍的shell模块, - 如果远程节点是windows操作系统,则需要使用win_command模块。
command模块的常用参数:
代码语言:javascript复制free_from : (Q)指定需要远程执行的命令,当我们想要在远程主机中执行ls命令时,直接写成ls即可
chdir : 指定一个目录在执行对应的命令之前,会先进入到chdir参数指定的目录中。
creates :当指定的文件存在时,就不执行对应命令,比如如果/testdir/test文件存在,就不执行我们指定的命令。
removes :与creates参数的作用正好相反,它的作用是当指定的文件不存在时,就不执行对应命令,
基础示例:
代码语言:javascript复制#(1)默认情况下ls出的结果是test70主机中root用户家目录中的文件列表
ansible test70 -m command -a "ls"
#(2)chdir参数表示执行命令之前,会先进入到指定的目录中,所以如下命令表示查看test70主机上/testdir目录中的文件列表
ansible test70 -m command -a "chdir=/testdir ls"
#(3)如下命令表示/testdir/test文件如果存在于远程主机中,则不执行对应命令,如果不存在才执行"echo test"命令
ansible test70 -m command -a "creates=/testdir/test echo test"
$ansible all -m command -a "ls creates=/etc/hosts"
# 10.10.107.221 | SUCCESS | rc=0 >>
# skipped, since /etc/hosts exists
# local | SUCCESS | rc=0 >>
# skipped, since /etc/hosts exists
# 10.20.172.179 | SUCCESS | rc=0 >>
# skipped, since /etc/hosts exists
#如下命令表示/testdir/test文件如果不存在于远程主机中,则不执行对应命令,如果存在,才执行"echo test"命令
ansible test70 -m command -a "removes=/testdir/test echo test"
ansible all -m command -a "ls removes=/etc/hosts"
WeiyiGeek.command存放则执行
shell
描述:帮助我们在远程主机上执行命令,与command模块不同的是,shell模块在远程主机中执行命令时会经过远程主机上的/bin/sh程序处理。
与Command模块不同的是:它可以使用通配符以及管道符:比如”<”, ”>”, ”|”, ”;” 和 ”&” 这些符号
shell模块的常用参数。
代码语言:javascript复制free_form参数 :必须参数,指定需要远程执行的命令,具体解释参考command模块。
chdir : 此参数的作用就是指定一个目录,在执行对应的命令之前,会先进入到chdir参数指定的目录中。
creates :使用此参数指定一个文件,当指定的文件存在时,就不执行对应命令,(存在不执行/不存在则执行)
removes :使用此参数指定一个文件,当指定的文件不存在时,就不执行对应命令,(存在执行/不存在不执行)
executable :默认情况下,shell模块会调用远程主机中的/bin/sh去执行对应的命令,通常情况下,远程主机中的默认shell都是bash,使用其他类型的shell执行命令指定shell文件时,需要使用绝对路径。
实际案例:
代码语言:javascript复制# 使用shell模块可以在远程服务器上执行命令,它支持管道与重定向等符号。
ansible test70 -m shell -a "chdir=/testdir echo test > test"
# 比如我们使用csh的语法定义了一个数字类型的变量TestNum,然后将TestNum变量的值重定向到了/testdir/TestNumFile
# 在bash中@符号不能用于定义变量,使用executable指定需要的shell类型。
ansible test70 -m shell -a 'executable=/bin/csh @ TestNum=666 ; echo $TestNum > /testdir/TestNumFile'
#指定参数变量来进行echo输出
ansible local -e "testvar=test" -m shell -a "echo {{testvar}}"
# local | CHANGED | rc=0 >>
# test
#实际案例:
$ansible all -m shell -a "ls -lh removes=/etc/hosts"
# 10.10.107.221 | CHANGED | rc=0 >>
# total 4.0K
# -rw-r-----. 1 root root 1.8K May 13 14:15 profile
# 10.20.172.179 | CHANGED | rc=0 >>
# total 16K
# -rw-r--r--. 1 root root 431 Jul 11 15:45 fio.conf
# -rwxr-xr-x. 1 root root 603 Jul 12 15:51 install-docker.sh
# drwxr-xr-x. 3 root root 4.0K Jul 12 15:49 source
# -rwxr-xr-x. 1 root root 381 Jul 12 16:53 tar.sh
# local | CHANGED | rc=0 >>
# total 4.0K
# -rw-r--r-- 1 root root 1.2K Jul 25 09:39 test.txt
# 低权限用户利用 sudo 和 tee 命令追加内容到高用户的文件之中
ansible dtk8s -m shell -a 'echo "192.168.1.31:/nask8sapp /nfsdisk-31 nfs defaults 0 0"|sudo tee -a /etc/fstab'
script
描述:帮助我们在远程主机上执行ansible主机上的脚本,也就是说脚本一直存在于ansible主机本地,不需要手动拷贝到远程主机后再执行。
script模块的常用参数:
代码语言:javascript复制free_form参数 :必须参数,指定需要执行的脚本,脚本位于ansible主机本地,并没有具体的一个参数名叫free_form,具体解释参考command模块。
chdir参数 : 此参数的作用就是指定一个远程主机中的目录,在执行对应的脚本之前,会先进入到chdir参数指定的目录中。
creates参数 :使用此参数指定一个远程主机中的文件,当指定的文件存在时,就不执行对应脚本,可参考command模块中的解释。
removes参数 :使用此参数指定一个远程主机中的文件,当指定的文件不存在时,就不执行对应脚本,可参考command模块中的解释。
基础示例:
代码语言:javascript复制#如下命令表示ansible主机中的/testdir/atest.sh脚本将在test70主机中执行,执行此脚本之前,会先进入到test70主机中的/opt目录
ansible test70 -m script -a "chdir=/opt /testdir/atest.sh"
#如下命令表示,如果test70主机中的/opt/testfile文件已经存在,ansible主机中的/testdir/atest.sh脚本将不会在test70主机中执行,反之则执行。
ansible test70 -m script -a "creates=/opt/testfile /testdir/atest.sh"
#如下命令表示,如果test70主机中的/opt/testfile文件不存在,ansible主机中的/testdir/atest.sh脚本将不会在test70主机中执行,反之则执行。
ansible test70 -m script -a "removes=/opt/testfile /testdir/atest.sh"
#基础示例
ansible all -m script -a "removes=/etc/hostname /tmp/demo.sh"
# cat 10.10.107.221.txt
# root
WeiyiGeek.脚本执行
系统类操作模块
cron
描述:cron模块可以帮助我们管理远程主机中的计划任务,功能相当于crontab命令。
在了解cron模块的参数之前,先写出一些计划任务的示例,示例如下
代码语言:javascript复制#示例1 表示每天的1点5分输出test字符
5 1 * * * echo test 分 / 时 / day / month / week
#示例2 表示每3天执行一次计划任务,于当天的1点1分执行,具体任务为输出test字符
1 1 */3 * * echo test
#示例3 表示每次系统启动后需要执行一次计划任务,具体任务为输出test字符
@reboot echo test
#示例4 表示每小时执行一次计划任务,具体任务 为输出test字符
@hourly echo test
cron模块通常使用的参数:
代码语言:javascript复制minute参数:此计划任务中分钟设定位的值,默认为"*"
hour参数:设置计划任务中小时设定位的值,值默认为"*"
day参数:设置计划任务中日设定位的值,当不使用此参数时,日设定位的值默认为"*"
month参数:设置计划任务中月设定位的值,当不使用此参数时,月设定位的值默认为"*"
weekday参数:设置计划任务中周几设定位的值,当不使用此参数时,周几设定位的值默认为"*"
user参数:设置当前计划任务属于哪个用户,当不使用此参数时,默认为管理员用户
job参数:用于指定计划的任务中需要实际执行的命令或者脚本,比如上例中的"echo test"命令。
name参数:用于设置计划任务的名称,计划任务的名称会在注释中显示,当不指定计划任务的名称时,ansible会默认为计划任务加入注释,注释的内容为#Ansible: None,假设指定计划任务的名称为test,那么注释的内容为#Ansible: test,在一台机器中,计划任务的名称应该具有唯一性,方便我们以后根据名称修改或删除计划任务。
state参数:当计划任务有名称时根据名称修改或删除对应的任务,当删除计划任务时需要将state的值设置为absent
disabled参数:当计划任务有名称时根据名称使对应的任务"失效"(注释掉对应的任务),注意使用此参数时,除了需要指定任务的名称,还需要同时指定任务的job以及任务的时间设定,而且任务的时间设定必须和对应任务完全相同,否则在注释任务的同时,任务的时间设定会被修改,除非你确定这样做;
backup参数:如果此参数的值设置为yes,那么当修改或者删除对应的计划任务时,会先对计划任务进行备份,然后再对计划任务进行修改或者删除,cron模块会在远程主机的/tmp目录下创建备份文件,以crontab开头并且随机加入一些字符,具体的备份文件名称会在返回信息的backup_file字段中看到,推荐将此此参数设置为yes。
special_time参数:比如计划任务的时间设定格式为@reboot或者@hourly,@reboot表示重启时执行,@hourly表示每小时执行一次,相当于设置成"0 * * * *" ,这种@开头的时间设定格式则需要使用special_time参数进行设置
special_time参数的可用值有reboot(重启后)、yearly(每年)、annually(每年,与yearly相同)、monthly(每月)、weekly(每周)、daily(每天)、hourly(每时)。
注意:当上述时间单位设定参数都未指定时,计划任务的时间设定默认会被设定为"* * * * *"
,表示每分钟都会执行一次计划任务,所以在使用cron模块时,我们应该确定对应的时间参数设置正确。
基础示例:
代码语言:javascript复制#在test70主机上创建计划任务指定zsy用户,任务名称为"test crontab",任务于每天1点5分执行,任务内容为输出test字符
ansible test70 -m cron -a "user=zsy name='test crontab' minute=5 hour=1 job='echo test'"
ansible local -m cron -a "name='Test' minute=1 job='echo `date %H:%M:%S` >> /tmp/test.log'" #非常注意转义和参数后的空格
#执行上述命令后,在test70主机中root用户下会有如下计划任务被创建
#Ansible: test crontab
5 1 * * * echo test
1 * * * * echo `date %H:%M:%S` >> /tmp/test.log
#在test70主机上创建计划任务,任务名称为"crontab day test",任务每3天执行一次,于执行当天的1点1分开始执行,任务内容为输出test字符
ansible test70 -m cron -a " name='crontab day test' minute=1 hour=1 day=*/3 job='echo test' "
#Ansible: crontab day test
1 1 */3 * * echo test
#在test70主机上创建计划任务,任务名称为"test special time",任务将在重启时执行,任务内容为输出test字符
ansible test70 -m cron -a " name='test special time' special_time=reboot job='echo test' "
#执行上述命令后,在test70主机中root用户下会有如下计划任务被创建
#Ansible: test special time
@reboot echo test
由于”test special time”已经存在,所以当我们再次操作同名的任务时
,ansible将会认为是修改原来的任务。
在"test special time"已经存在的情况下,执行如下命令,原计划任务会被修改,因为启用了backup,所以任务在修改前会被备份。
ansible test70 -m cron -a " name='test special time' special_time=hourly job='echo test' backup=yes "
#执行上述命令后,从返回信息的backup_file字段中可以看到备份文件的远程主机中的位置
#任务"test special time"已经存在于test70主机中,如果我们想要删除这个计划任务,可以执行如下命令,删除任务的同时可以进行备份。
ansible test70 -m cron -a " name='test special time' state=absent backup=yes "
#命令执行后,从返回信息的backup_file字段中可以看到备份文件的远程主机中的位置
#我们想要将crontab day test这个任务注释掉,则需要使用如下命令,注意最好与backup参数同时使用
ansible test70 -m cron -a "name='crontab day test' minute=1 hour=1 day=*/3 job='echo test' disabled=yes backup=yes"
# 执行上述命令后,对应的计划任务将会被注释
#Ansible: crontab day test
#1 1 */3 * * echo test
补充:
- 如果你忘记了任何时间设定,那么在任务被注释时,还会被设置为默认的时间设定,也就是 “ *”
- 所以在使用disabled参数时最后结合backup参数一起使用,万一一时大意,还有回旋的余地。
service
描述:service模块可以帮助我们管理远程主机上的服务,比如启动或停止远程主机中的nginx服务。
注意:假如你想要管理远程主机中的某个服务,那么这个服务必须能被 BSD init, OpenRC, SysV, Solaris SMF, systemd, upstart
中的任意一种所管理,否则service模块也无法管理远程主机的对应服务,这样说可能不容易理解,那么我们换个方式来解释,假设你在使用centos6,那么你的centos6中的nginx则必须能够通过”service nginx start”启动,如果你的nginx无法通过”service nginx start”进行启动,那么它将同样无法通过ansible的service模块启动,假设你在使用centos7,那么你的centos7中的nginx则必须能够通过”systemctl start nginx”启动,如果它无法通过”systemctl start nginx”进行启动,那么它将同样无法通过ansible的service模块进行启动;
- centos6中默认通过sysv管理服务
- centos7中默认通过systemd管理服务
service模块通常使用的参数:
代码语言:javascript复制name参数:此参数用于指定需要操作的服务名称,比如nginx
state参数:此参数用于指定服务的状态 : started、stopped、restarted、reloaded。
enabled参数:此参数用于指定是否将服务设置为开机 yes / no
基础示例:
代码语言:javascript复制#将test70中的nginx服务处于启动状态
ansible test70 -m service -a "name=nginx state=started"
ansible test70 -m service -a "name=nginx state=stopped" #nginx服务处于停止状态
#将test70中的nginx服务被设置为开机自动启动项
ansible test70 -m service -a " name='nginx' enabled=yes"
#启用或者关闭的同时禁止自启
ansible all -m service -a "name='crond' state=stopped enabled=no"
ansible all -m service -a "name='crond' state=started enabled=yes"
WeiyiGeek.示例2
user
描述:可以帮助我们管理远程主机上的用户,比如创建用户、修改用户、删除用户、为用户创建密钥对等操作。
user模块的常用参数:
代码语言:javascript复制name参数:必须参数,用于指定要操作的用户名称,可以使用别名user。
group参数:此参数用于指定用户所在的基本组
gourps参数:此参数用于指定用户所在的附加组,注意,如果说用户已经存在并且已经拥有多个附加组,那么如果想要继续添加新的附加组,需要结合append参数使用,否则在默认情况下,当再次使用groups参数设置附加组时,用户原来的附加组会被覆盖。
append参数:如果用户原本就存在多个附加组,那么当使用groups参数设置附加组时,当前设置会覆盖原来的附加组设置,如果不想覆盖原来的附加组设置,需要结合append参数,将append设置为yes,表示追加附加组到现有的附加组设置,append默认值为no。
shell参数:此参数用于指定用户的默认shell
uid参数:此参数用于指定用户的uid号
expires参数:此参数用于指定用户的过期时间,相当于设置/etc/shadow文件中的的第8列,比如,你想要设置用户的过期日期为2018年12月31日,那么你首先要获取到2018年12月31日的unix时间戳,使用命令"date -d 2018-12-31 %s"获取到的时间戳为1546185600,所以,当设置expires=1546185600时,表示用户的过期时间为2018年12月31日0点0分,设置成功后,查看远程主机的/etc/shadow文件,对应用户的第八列的值将变成17895(表示1970年1月1日到2018年12月31日的天数,unix时间戳的值会自动转换为天数,我们不用手动的进行换算),目前此参数只支持在Linux和FreeBSD系统中使用。
comment参数:此参数用于指定用户的注释信息
state参数:此参数用于指定用户是否存在于远程主机中可选值有present、absent,默认值为present,表示用户需要存在,当设置为absent时表示删除用户。
当state的值设置为absent时,表示要删除远程主机中的用户,但是在删除用户时,不会删除用户的家目录等信息,这是因为remoove参数的默认值为no
remove参数:如果设置为yes,在删除用户的同时,会删除用户的家目录,当state=absent并且remove=yes时,相当于执行"userdel --remove"命令
password参数:此参数用于指定用户的密码,但是这个密码不能是明文的密码,而是一个对明文密码"加密后"的字符串,相当于/etc/shadow文件中的密码字段,是一个对明文密码进行哈希后的字符串,你可以在python的命令提示符下输入如下命令,生成明文密码对应的加密字符串。
import crypt; crypt.crypt('666666')
输入上述命令后,即可得到明文密码666666对应的加密字符串。
update_password参数:此参数有两个值可选,always和on_create,当此参数的值设置为always时表示,如果password参数设置的值与用户当前的加密过的密码字符串不一致,则直接更新用户的密码,默认值即为always,但是当此参数设置为on_create时,如果password参数设置的值与用户当前的加密过的密码字符串不一致,则不会更新用户的密码字符串,保持之前的密码设定,如果是新创建的用户,即使此参数设置为on_create,也会将用户的密码设置为password参数对应的值。
generate_ssh_key参数:此参数默认值为no,如果设置为yes,表示为对应的用户生成ssh密钥对,默认在用户家目录的./ssh目录中生成名为id_rsa的私钥和名为id_rsa.pub的公钥,如果同名的密钥已经存在与对应的目录中,原同名密钥并不会被覆盖(不做任何操作),如果你对ssh密钥还不是特别了解,可以参考如下文章
ssh_key_file参数:当generate_ssh_key参数的值为yes时,使用此参数自定义生成ssh私钥的路径和名称,对应公钥会在同路径下生成,公钥名以私钥名开头,以".pub"结尾。
ssh_key_comment参数:当generate_ssh_key参数的值为yes时,在创建证书时,使用此参数设置公钥中的注释信息,但是如果同名的密钥对已经存在,则并不会修改原来的注释信息,即不做任何操作,当不指定此参数时,默认的注释信息为"ansible-generated on 远程主机的主机名"
ssh_key_passphrase参数:当generate_ssh_key参数的值为yes时,在创建证书时,使用此参数设置私钥的密码,但是如果同名的密钥对已经存在,则并不会修改原来的密码,即不做任何操作
ssh_key_type参数:当generate_ssh_key参数的值为yes时,在创建证书时,使用此参数设置密钥对的类型,默认密钥类型为rsa,但是如果同名的密钥对已经存在,并不会对同名密钥做任何操作
基础示例:
代码语言:javascript复制在test70主机上创建名为zsy的用户,如果用户已经存在,则不进行任何操作。
ansible test70 -m user -a 'name=zsy shell=/bin/csh uid=2002 comment="注释' #zsy用户使用/bin/csh作为默认shell
ansible test70 -m user -a 'name=zsy state=absent' #删除名为zsy的用户,但是不会删除zsy用户的家目录
ansible test70 -m user -a 'name=abc state=absent remove=yes' #同上,也会删除zsy用户的家目录
ansible test70 -m user -a "name=zsy group=zsythink" #zsy用户的主组为zsythink,zsythink组需要提前存在,当不使用group设置主组时,默认主组与用户名相同。
#指定test70主机上的zsy用户的附加组为zsythink组需要提前存在,当不使用groups设置附属组时,默认附加组与用户名相同
ansible test70 -m user -a "name=zsy groups=zsy,zsythink append=yes"
#指定test70主机上的zsy用户的过期时间为2018年12月31日,使用"date -d 2018-12-31 %s"命令可以获取到对应日期的unix时间戳
ansible test70 -m user -a 'name=zsy expires=1546185600'
#将test70主机上的zsy用户的密码设置为666666,首先生成666666的加密字符串
>>> import crypt; crypt.crypt('666666')
'$6$ygRbo7Fj.mMU2KY0$OEqihCCn5UfOsvMyzPNPBgx3bzAtwrOFyFvacgUmA374XOAEtUCrdjbW5Ip.Zqo491o3kD5I.HaC9nLhh6x741'
#使用生成的密码字符串设置用户密码
ansible test70 -m user -a ' name=zsy password="$6$ygRbo7Fj.mMU2KY0$OEqihCCn5UfOsvMyzPNPBgx3bzAtwrOFyFvacgUmA374XOAEtUCrdjbW5Ip.Zqo491o3kD5I.HaC9nLhh6x741" '
#设置test70主机上的zsy用户的密码,但是如果用户当前的加密字符串与命令中设置的加密字符串不一致,则不进行密码更新的操作。 (以创建的为主)
ansible test70 -m user -a 'name=zsy password="$6$a.ofrhIWn4gJGbi0$i6Xhr.F/YyhMe2UCodydwyF952bP4DOf0qYcGE8aK.EsgOR/GKU0Oy9Ov6oIH3RIJ9BnhvoVR9ozflmUJgxhL0" update_password=on_create'
#为test70上的zsy用户生成ssh密钥对,
# 默认在用户家目录的./ssh目录中生成名为id_rsa的私钥和名为id_rsa.pub的公钥,
# 密钥对生成在/opt目录下私钥名为id_rsa_zsy,公钥名为id_rsa_zsy.pub,指定公钥中的注释信息为"net",
# 同时指定私钥的密码为123456,指定密钥对的类型为dsa,
# 此参数只能在创建密钥时使用才会生效,并不能操作同名的老密钥,
# 如果已经存在同名密钥,并不会覆盖原来的密钥,即不做任何操作。
ansible test70 -m user -a 'name=zsy generate_ssh_key=yes ssh_key_file=/opt/id_rsa_zsy ssh_key_comment="www.zsythink.net" ssh_key_passphrase="123456" ssh_key_type=dsa'
group
描述:模块可以帮助我们管理远程主机上的组。
group模块的常用参数:
代码语言:javascript复制name参数:必须参数,用于指定要操作的组名称。
state参数:用于指定组的状态两个值可选,present/absent,默认为present设置为absent表示删除组。
gid参数:用于指定组的gid
基础示例:
代码语言:javascript复制#确保test70主机中存在名为zsythink的组
ansible test70 -m group -a ' name=zsythink'
#删除test70主机中存在名为zsythink的组,删除成功的前提是不能有用户把被删除的组当成主组。
ansible test70 -m group -a ' name=zsythink state=absent'
#确保test70主机中存在名为zsythink的组,并且确定zsythink组的组id为1008
ansible test70 -m group -a 'name=zsythink gid=1008'
软件包管理
yum_repository
描述:模块可以帮助我们管理远程主机上的yum仓库。
yum_repository模块的常用参数:
代码语言:javascript复制name参数:必须参数,用于指定要操作的唯一的仓库ID,也就是".repo"配置文件中每个仓库对应的"中括号"内的仓库ID
baseurl参数:此参数用于设置yum仓库的baseurl
description参数:此参数用于设置仓库的注释信息,也就是".repo"配置文件中每个仓库对应的"name字段"对应的内容。
file参数:此参数用于设置仓库的配置文件名称,即设置".repo"配置文件的文件名前缀,在不使用此参数的情况下,默认以name参数的仓库ID作为".repo"配置文件的文件名前缀,同一个'.repo'配置文件中可以存在多个yum源
enabled参数:此参数用于设置是否激活对应的yum源,此参数默认值为yes,表示启用对应的yum源,设置为no表示不启用对应的yum源。
gpgcheck参数:此参数用于设置是否开启rpm包验证功能,默认值为no,表示不启用包验证,设置为yes表示开启包验证功能。
gpgcakey参数:当gpgcheck参数设置为yes时,需要使用此参数指定验证包所需的公钥
state参数:默认值为present,当值设置为absent时,表示删除对应的yum源
示例命令如下:
代码语言:javascript复制#使用如下命令在test70主机上设置ID为aliEpel 的yum源,仓库配置文件路径为/etc/yum.repos.d/aliEpel.repo
ansible test70 -m yum_repository -a 'name=aliEpel description="alibaba EPEL" baseurl=https://mirrors.aliyun.com/epel/$releasever\Server/$basearch/'
#使用如下命令在test70主机上设置ID为aliEpel 的yum源,仓库配置文件路径为/etc/yum.repos.d/alibaba.repo
ansible test70 -m yum_repository -a 'name=aliEpel description="alibaba EPEL" baseurl=https://mirrors.aliyun.com/epel/$releasever\Server/$basearch/ file=alibaba'
#使用如下命令在test70主机上设置ID为local 的yum源,但是不启用它(local源使用系统光盘镜像作为本地yum源,以便测试举例,所以baseurl中的值以file:///开头)
ansible test70 -m yum_repository -a 'name=local baseurl=file:///media description="local cd yum" enabled=no'
#使用如下命令在test70主机上设置ID为local的yum源,开启包验证功能,并指定验证包所需的公钥位置为/media/RPM-GPG-KEY-CentOS-7
ansible test70 -m yum_repository -a 'name=local baseurl=file:///media description="local cd yum" gpgcheck=yes gpgcakey=file:///media/RPM-GPG-KEY-CentOS-7'
#删除/etc/yum.repos.d/alibaba.repo配置文件中的aliEpel源
ansible test70 -m yum_repository -a 'file=alibaba name=aliEpel state=absent'
yum
描述: 可以帮助我们在远程主机上通过yum源管理软件包。
yum模块的常用参数:
代码语言:javascript复制name参数:必须参数,用于指定需要管理的软件包,比如nginx
state参数:用于指定软件包的状态 ,默认值为present,表示确保软件包已经安装,除了present,其他可用值有installed、latest、absent、removed,其中installed与present等效,latest表示安装yum中最新的版本,absent和removed等效,表示删除对应的软件包。
disable_gpg_check参数:用于禁用对rpm包的公钥gpg验证,默认值为no,表示不禁用验证,设置为yes表示禁用验证,即不验证包,直接安装,在对应的yum源没有开启gpg验证的情况下,需要将此参数的值设置为yes,否则会报错而无法进行安装。
enablerepo参数:用于指定安装软件包时临时启用的yum源,假如你想要从A源中安装软件,但是你不确定A源是否启用了,你可以在安装软件包时将此参数的值设置为yes,即使A源的设置是未启用,也可以在安装软件包时临时启用A源。
disablerepo参数:用于指定安装软件包时临时禁用的yum源,某些场景下需要此参数,比如,当多个yum源中同时存在要安装的软件包时,你可以使用此参数临时禁用某个源,这样设置后,在安装软件包时则不会从对应的源中选择安装包。
注意事项:enablerepo参数和disablerepo参数可以同时使用
实际案例:
代码语言:javascript复制#确保test70主机上通过yum源安装了nginx(对应yum源未开启gpg验证,所以需要设置disable_gpg_check=yes),如下三条命令的效果相同
ansible test70 -m yum -a 'name=nginx disable_gpg_check=yes'
ansible test70 -m yum -a 'name=nginx state=present disable_gpg_check=yes'
ansible test70 -m yum -a 'name=nginx state=installed disable_gpg_check=yes'
#确保test70主机上安装了yum源中最新版本的nginx
ansible test70 -m yum -a 'name=nginx state=latest disable_gpg_check=yes'
#确保test70主机上通过yum源安装的nginx被卸载了
ansible test70 -m yum -a 'name=nginx state=absent'
ansible test70 -m yum -a 'name=nginx state=removed'
#在test70主机上安装telnet时不确定local源是否启用,使用enablerepo=local确保临时启用local源
ansible test70 -m yum -a 'name=telnet disable_gpg_check=yes enablerepo=local'
#在test70主机上安装telnet时,确定多个源中都有telnet,但是不想从local源中安装,所以在安装时临时禁用local源
ansible test70 -m yum -a 'name=telnet disable_gpg_check=yes disablerepo=local'
WeiyiGeek.yum模块安装示例
软件包管理
meta 模块
描述:使用meta模块来设置改变tasks任务中notify调用handlers的顺序,默认是先执行完Tasks才执行handlers;
meta模块使用参数:
代码语言:javascript复制flush_handlers #设置在执行完前面某些task以后立即执行调用对应的handler
系统信息管理
setup 模块
描述:用来进行被受管主机的信息收集以及过滤显示,返回json字符串格式:
常用参数:
代码语言:javascript复制filter #过滤显示的项目(全名匹配/通配符匹配) xxx / x*x
fact_path #远程主机的"local facts"信息存放路径设置比如/tmp/info.fact
实际案例:
代码语言:javascript复制#(1).获取主机的IP地址信息以及网卡信息;
ansible local -m setup -a "filter=ansible_default_ipv4" | more #参数项完全匹配
ansible local -m setup -a "filter=*ipv4*" | more #通配符匹配
ansible local -m setup -a "filter=ansible_local fact_path=/tmp"
#执行结果:
local | SUCCESS => {
"ansible_facts": {
"ansible_default_ipv4": {
"address": "10.10.107.222",
"alias": "ens192",
"broadcast": "10.10.107.255",
"gateway": "10.10.107.1",
"interface": "ens192",
"macaddress": "00:50:56:b3:dc:b4",
"mtu": 1500,
"netmask": "255.255.255.0",
"network": "10.10.107.0",
"type": "ether"
},
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false
}
debug 模块
描述:debug模块的作用就是帮助我们进行调试的,debug模块可以帮助我们把信息输出到ansible控制台上,以便我们能够定位问题
debug参数一览表:
代码语言:javascript复制msg: [debug信息] #设置debug显示信息即输出自定义的信息
var: [变量名称] #利用debug显示变量名称
注意事项:
- msg 与 var 参数是不兼容的自能使用一个
变量管理
set_fact 模块
描述:通过set_fact模块就能够在tasks中定义变量了,我们也可以通过set_fact将一个变量的值赋予另一个变量;
模块参数:
代码语言:javascript复制variable=value #设置变量名称与变量中也可以variable: {{cmd.stdout}} 调用其他变量
cacheable=yes #以便使用事实缓存在不同执行中保存变量。使用set_事实具有不同的优先级,具体取决于它们是缓存还是未缓存。
基础示例:
代码语言:javascript复制#示例1.采用ansible直接命令行执行(也能写入playbook之中)
ansible local -m set_fact,shell -a "demo='this is a demo' cacheable=yes echo {{demo}}"
include_var模块
描述:可以在playbook运行中动态的加载被修改了的ansible变量参数文件;
模块参数:
代码语言:javascript复制file : 指定ansbile变量文件路径(参数可以指定要包含的变量文件)
name : 把变量文件中的变量全部赋值给另外一个变量;
dir : 指定变量文件存放的目录,将里面的变量全部加载;
extensions: 指定配置文件合法后缀常常与dir联用;
depth: 控制递归的深度默认值为0表示递归到最底层的子目录,depth:1表示递归深度为1
files_matching : 借助正则表达式,匹配那些我们想要加载的变量文件
ignore_files : 明确指定需要忽略的变量文件名称(是一个列表)
register : 将载入的变量文件列表写入到自己的返回值中,这个返回值的关键字为'ansible_included_var_files'
```
实际案例:
```bash
#变量配置文件1:cat >/tmp/ansible/demo1/var.yml<<END
test1: qixi
test2: happy
END
#变量配置文件1:cat >/tmp/ansible/demo2/var.yml<<END
test3: include_varDemo
test4: WeiyiGeek
END
#playbook 脚本:
# cat >include_var.yml<<END
---
- hosts: local
remote_user: root
gather_facts: no
vars_files: #关键点
- /tmp/ansible/demo1/var.yml
tasks:
- name: "Demo1 var_files"
debug:
msg: "{{test1}} {{test2}}"
- name: "Demo2 edit var_files"
lineinfile:
path: /tmp/ansible/demo1/var.yml
line: "testvar3: Ansible Study"
- include_vars:
file: /tmp/ansible/demo1/var.yml #关键点
name: trans_var #关键点
- name: "Demo3 show dynmaic add"
debug:
msg: "{{ trans_var }} {{trans_var.testvar3}}"
- name: "Demo4 include_vars directory"
include_vars:
dir: /tmp/ansible/demo2/
depth: 1
extensions: [yaml,yml,json,varfile]
files_matching: "^var.*"
name: includeval
register: return_val #坑呀,与include平级
- name: "Demo4 show includevars dir"
debug:
msg: "{{return_val.ansible_included_var_files}} include -> {{includeval.test3}} -> {{includeval.test4}}"
END
执行结果:
代码语言:javascript复制#TASK [Demo1 var_files]
ok: [local] => {"msg": "qixi happy"}
#TASK [Demo2 edit var_files]
ok: [local]
#TASK [include_vars]
ok: [local]
TASK [Demo3 show dynmaic add]
"msg": "{u'test1': u'qixi', u'test2': u'happy', u'testvar3': u'Ansible Study'} Ansible Study"}
#TASK [Demo4 include_vars directory]
ok: [local]
#TASK [Demo4 show includevars dir]
"msg": "[u'/tmp/ansible/demo2/var.yml'] include -> include_varDemo -> WeiyiGeek"
注意事项:
- 第一:指定目录中的所有文件的文件后缀必须是 ‘.yaml’ 、’.yml’ 、’.json’中的一种,默认只有这三种后缀是合法后缀,如果目录中存在非合法后缀的文件,执行playbook时则会报错。
- 第二:如果此目录中的子目录中包含变量文件,子目录中的变量文件也会被递归的加载,而且子目录中的文件也必须遵守上述第一条规则。
- 第三:dir参数与file参数不能同时使用。
条件判断异常处理
fail模块
描述:而fail模块天生就是一个用来”执行失败”的模块,当fail模块执行后playbook就会认为有任务失败了,从而终止运行实现我们想要的中断效果
模块参数:
代码语言:javascript复制- 其他模块 #调用其他模块
msg #小写fail模块信息