https://www.kancloud.cn/louis1986/ansible/563208

1. ansible-常用模块

根据官方的分类,将模块按功能分类为:云模块、命令模块、数据库模块、文件模块、资产模块、消息模块、监控模块、网络模块、通知模块、包管理模块、源码控制模块、系统模块、单元模块、web设施模块、windows模块

  • user:配置用户
  • group:配置用户组
  • cron:配置计划任务
  • copy:复制文件到远程主机
  • file: 用于配置文件属性
  • yum:用于安装软件包
  • service:用于管理服务
  • shell: 用于执行命令可以带 “ |”管道符号等
  • scripts:在远程主机执行控制端的脚本文件
  • setup:查看远程主机的基本信息
  • filesystem:在块设备上创建文件系统
  • mount:配置挂载点
  • synchronize:使用rsync同步文件
  • get_url:该模块主要用于从http、ftp、https服务器上下载文件(类似于wget)
  • package:使用os包管理器安装,升级和删除包
  • stat:获取远程主机文件状态信息。
  • unarchive: 用于解压文件
  • command:在远程主机上执行命令
  • raw:类似于shell模块,支持管道
  • ping:用于检测远程主机是否存活

    2.模块的使用

查看模块帮助

  1. 1 [root@test-1 bin]# ansible-doc -l #查看所有模块
  2. 2 [root@test-1 bin]# ansible-doc -s MODULE_NAME         #查看指定模块的详细帮助

在此之前,来配置一下主机清单:

  1. [testA]
  2. test90 ansible_host=10.7.11.90
  3. test91 ansible_host=10.7.11.91
  4. [testB]
  5. test92 ansible_host=10.7.11.92
  6. [test:children]
  7. testA
  8. testB

3.ansible命令应用基础

使用语法:

  1. ansible [-f forks] [-m module_name] [-a args]

注释:

-f forks:启动的并发线程数
-m module_name: 要使用的模块
-a args:模块特有的参数

4.模块使用案例

4.1 常用模块之文件操作

测试主机是否通的,用法很简单,如果成功就返回的是pong。

复制代码

  1. [root@localhost ~]# ansible node -m ping
  2. 10.7.11.90 | SUCCESS => {
  3. "ansible_facts": {
  4. "discovered_interpreter_python": "/usr/bin/python"
  5. },
  6. "changed": false,
  7. "ping": "pong"
  8. }
  9. 10.7.11.91 | SUCCESS => {
  10. "ansible_facts": {
  11. "discovered_interpreter_python": "/usr/bin/python"
  12. },
  13. "changed": false,
  14. "ping": "pong"
  15. }
  16. 10.7.11.92 | SUCCESS => {
  17. "ansible_facts": {
  18. "discovered_interpreter_python": "/usr/bin/python"
  19. },
  20. "changed": false,
  21. "ping": "pong"
  22. }

4.1.1 fetch-模块

fetch模块将远程主机上的文件拉取到ansible主机

4.1.2 file-模块

file模块主要用于远程主机上的文件操作,file模块包含如下选项:

force:需要在两种情况下强制创建软连接。
• 一种是源文件不存在但之后会创建的情况下;
• 另一种是目标软链接已存在,需要先取消之前的软链,然后创建新的软链,有两个选项:yes|no
group:定义文件/目录的属组
owner:定义文件/目录的属主
mode:定义文件/目录的权限
path:必选项,定义文件/目录的路径
recurse:递归设置文件的属性,只对目录有效
src:要被链接的源文件的路径,只应用于state=link的情况
dest:被链接到的路径,只应用于state=link的情况
state:定义文件状态
• directory:如果目录不存在,创建目录
• file:即使文件不存在,也不会被创建
• link:创建软链接
• hard:创建硬链接
• touch:如果文件不存在,则会创建一个新的文件,如果文件或目录已存在,则更新其最后修改时间
• absent:删除目录、文件或者取消链接文件
复制代码

案例1-用file创建一个软连接/etc/fstab到/tmp/fstab

  1. [root@localhost ~]# ansible test92 -m file -a "src=/etc/fstab dest=/tmp/fstab state=link"
  2. 10.7.11.92 | CHANGED => {
  3. "ansible_facts": {
  4. "discovered_interpreter_python": "/usr/bin/python"
  5. },
  6. "changed": true,
  7. "dest": "/tmp/fstab",
  8. "gid": 0,
  9. "group": "root",
  10. "mode": "0777",
  11. "owner": "root",
  12. "size": 10,
  13. "src": "/etc/fstab",
  14. "state": "link",
  15. "uid": 0
  16. }

执行结果:

[root@localhost ~]# ansible test92 -m shell -a "ls -ll /tmp/fstab"
10.7.11.90 | CHANGED | rc=0 >>
lrwxrwxrwx 1 root root 10 6月   2 10:04 /tmp/fstab -> /etc/fstab
10.7.11.91 | CHANGED | rc=0 >>
lrwxrwxrwx 1 root root 10 6月   2 10:04 /tmp/fstab -> /etc/fstab
10.7.11.68 | CHANGED | rc=0 >>
lrwxrwxrwx 1 root root 10 6月   2 10:04 /tmp/fstab -> /etc/fstab

案例2-我们需要在远程服务器上/tmp/下创建一个file文件

[root@localhost ~]# ansible test92 -m file -a 'path=/tmp/file state=touch'
10.7.11.92 | CHANGED => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": true, 
    "dest": "/tmp/file", 
    "gid": 0, 
    "group": "root", 
    "mode": "0644", 
    "owner": "root", 
    "size": 0, 
    "state": "file", 
    "uid": 0
}

执行结果:

[root@localhost ~]# ansible test92 -m shell -a "ls -ll /tmp"
10.7.11.92 | CHANGED | rc=0 >>
总用量 0
drwx------  2 root root 41 6月   2 10:14 ansible_command_payload_4R6rlq
-rw-r--r--  1 root root  0 6月   2 10:11 file
lrwxrwxrwx  1 root root 10 6月   2 10:04 fstab -> /etc/fstab
drwxr-xr-x. 2 es   es   19 5月  18 15:13 hsperfdata_es
drwxr-xr-x  2 root root 32 5月  27 17:31 hsperfdata_root
drwxr-xr-x  2 root root  6 5月  27 10:32 kafka-logs01
drwx------  3 root root 17 5月  18 09:05 systemd-private-5687a2d73e3346bd9e96278f9b864d1f-chronyd.service-O0Dqay

案例3-在test92主机上创建一个名为testfile的文件,如果testfile文件已经存在,则会更新文件的时间戳,与touch命令的作用相同

ansible test92 -m file -a "path=/testdir/testfile state=touch"

案例4-在test92主机上创建一个名为testdir的目录,如果testdir目录已经存在,则不进行任何操作

ansible test92 -m file -a "path=/testdir/testdir  state=directory"

案例5-在test92上为testfile文件创建软链接文件,软链接名为linkfile,执行下面命令的时候,testfile已经存在

ansible test92 -m file -a "path=/testdir/linkfile state=link src=/testdir/testfile"

案例6- 在test92上为testfile文件创建硬链接文件,硬链接名为hardfile,执行下面命令的时候,testfile已经存在

ansible test92 -m file -a "path=/testdir/hardfile state=hard src=/testdir/testfile"

案例7-在创建链接文件时,如果源文件不存在,或者链接文件与其他文件同名时,强制覆盖同名文件或者创建链接文件,参考上述force参数的解释

ansible test92 -m file -a "path=/testdir/linkfile state=link src=sourcefile force=yes"

案例8-删除远程机器上的指定文件或目录

ansible test92 -m file -a "path=/testdir/testdir state=absent"

案例9-在创建文件或目录的时候指定属主,或者修改远程主机上的文件或目录的属主

ansible test92 -m file -a "path=/testdir/abc state=touch owner=zsy"
ansible test92 -m file -a "path=/testdir/abc owner=zsy"
ansible test92 -m file -a "path=/testdir/abc state=directory owner=zsy"

案例10-在创建文件或目录的时候指定属组,或者修改远程主机上的文件或目录的属组

ansible test92 -m file -a "path=/testdir/abb state=touch group=zsy"
ansible test92 -m file -a "path=/testdir/abb group=zsy"
ansible test92 -m file -a "path=/testdir/abb state=directory group=zsy"

案例11-在创建文件或目录的时候指定权限,或者修改远程主机上的文件或目录的权限

ansible test92 -m file -a "path=/testdir/abb state=touch mode=0644"
ansible test92 -m file -a "path=/testdir/abb mode=0644"
ansible test92 -m file -a "path=/testdir/binfile mode=4700"
ansible test92 -m file -a "path=/testdir/abb state=directory mode=0644"

案例12-当操作远程主机中的目录时,同时递归的将目录中的文件的属主属组都设置为zsy

ansible test70 -m file -a "path=/testdir/abd state=directory owner=zsy group=zsy recurse=yes"

4.1.3 copy模块

copy模块的作用就是拷贝文件,它与之前介绍的fetch模块类似,不过,fetch模块是从远程主机中拉取文件到ansible主机,而copy模块是将ansible主机上的文件拷贝到远程主机中。
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表示。


案例1-将ansible主机中/testdir/copytest文件复制到远程主机的/opt目录下,注意,如果copytest文件已经存在于远程主机的/opt目录中,并且远程主机中的copytest与ansible主机中copytest文件内容不同,那么使用如下命令时,远程主机中的copytest文件将被覆盖

ansible test92 -m copy -a "src=/testdir/copytest dest=/opt/"

案例2-在远程主机的/opt目录下生成文件test,test文件中有两行文本,第一行文本为aaa,第二行为bbb,当使用content指定文件内容时,dest参数对应的值必须是一个文件,而不能是一个路径。

ansible test92 -m copy -a 'content="aaa\nbbb\n" dest=/opt/test'

案例3-将ansible主机中/testdir/copytest文件复制到远程主机的/opt目录中时,如果远程主机中已经存在/opt/copytest文件,并且文件内容与ansible主机中的copytest文件的内容不一致,则不执行拷贝操作,远程主机中的/opt/copytest文件内容不会被改变。

ansible test92 -m copy -a "src=/testdir/copytest dest=/opt/ force=no"

案例4-将ansible主机中/testdir/copytest文件复制到远程主机的/opt目录中时,如果远程主机中已经存在/opt/copytest文件,并且文件内容与ansible主机中的copytest文件的内容不一致,会执行拷贝操作,但是在执行拷贝操作之前,会将远程主机中的原文件重命名,以作备份,然后再进行拷贝操作。

ansible test92 -m copy -a "src=/testdir/copytest dest=/opt/ backup=yes"

案例5-拷贝文件时,指定文件的属主,需要注意,远程主机上必须存在对应的用户

ansible test92 -m copy -a "src=/testdir/copytest dest=/opt/ owner=zsy"

案例6-拷贝文件时,指定文件的属组,需要注意,远程主机上必须存在对应的组

ansible test92 -m copy -a "src=/testdir/copytest dest=/opt/ group=zsy"

案例7-拷贝文件时,指定文件的权限

ansible test92 -m copy -a "src=/testdir/copytest dest=/opt/ mode=0640"

4.1.4 blockinfile模块

blockinfile模块可以帮助我们在指定的文件中插入”一段文本”,这段文本是被标记过的,换句话说就是,我们在这段文本上做了记号,以便在以后的操作中可以通过”标记”找到这段文本,然后修改或者删除它,单单这样描述不是特别容易理解,结合下面的小例子动手做做立马就能够明白了。

  • path参数 :必须参数,指定要操作的文件。
  • block参数 :此参数用于指定我们想要操作的那”一段文本”,此参数有一个别名叫”content”,使用content或block的作用是相同的。
  • marker参数 :假如我们想要在指定文件中插入一段文本,ansible会自动为这段文本添加两个标记,一个开始标记,一个结束标记,默认情况下,开始标记为# BEGIN ANSIBLE MANAGED BLOCK,结束标记为# END ANSIBLE MANAGED BLOCK,我们可以使用marker参数自定义”标记”,比如,marker=#{mark}test ,这样设置以后,开始标记变成了# BEGIN test,结束标记变成了# END test,没错,{mark}会自动被替换成开始标记和结束标记中的BEGIN和END,我们也可以插入很多段文本,为不同的段落添加不同的标记,下次通过对应的标记即可找到对应的段落。
  • state参数 : state参数有两个可选值,present与absent,默认情况下,我们会将指定的一段文本”插入”到文件中,如果对应的文件中已经存在对应标记的文本,默认会更新对应段落,在执行插入操作或更新操作时,state的值为present,默认值就是present,如果对应的文件中已经存在对应标记的文本并且将state的值设置为absent,则表示从文件中删除对应标记的段落。
  • insertafter参数 :在插入一段文本时,默认会在文件的末尾插入文本,如果你想要将文本插入在某一行的后面,可以使用此参数指定对应的行,也可以使用正则表达式(python正则),表示将文本插入在符合正则表达式的行的后面,如果有多行文本都能够匹配对应的正则表达式,则以最后一个满足正则的行为准,此参数的值还可以设置为EOF,表示将文本插入到文档末尾。
  • insertbefore参数 :在插入一段文本时,默认会在文件的末尾插入文本,如果你想要将文本插入在某一行的前面,可以使用此参数指定对应的行,也可以使用正则表达式(python正则),表示将文本插入在符合正则表达式的行的前面,如果有多行文本都能够匹配对应的正则表达式,则以最后一个满足正则的行为准,此参数的值还可以设置为BOF,表示将文本插入到文档开头。
  • backup参数 :是否在修改文件之前对文件进行备份。
  • create参数 :当要操作的文件并不存在时,是否创建对应的文件 (yes|no)

对应上述参数的ad-hoc示例命令如下:

案例1

为了方便举例,我们将/etc/rc.d/rc.local文件复制到/testdir目录中,以做测试
假如,我们想要在test92主机中的/testdir/rc.local文件尾部插入如下两行
systemctl start mariadb
systemctl start httpd
可以使用如下命令:

ansible test92 -m blockinfile -a 'path=/testdir/rc.local block="systemctl start mariadb\nsystemctl start httpd" '

使用path参数指定要操作的文件,使用block参数指定文本块内容,由于我们使用了ad-hoc命令,所以我们使用\n表示换行,在写ansible剧本时则可以直接将文本块写在多行中,但是我们还没有介绍剧本的编写,所以此处不用在意,当执行上述命令后,/testdir/rc.local的文件尾部会多出如下文本块

# BEGIN ANSIBLE MANAGED BLOCK
systemctl start mariadb
systemctl start httpd
# END ANSIBLE MANAGED BLOCK

案例2

正如之前所说,blockinfile模块的作用就是在文件中添加、更新、或者删除”被标记的文本块”,而上述被标记的文本块就是我们添加进文件的,# BEGIN ANSIBLE MANAGED BLOCK 和 # END ANSIBLE MANAGED BLOCK 就是blockinfile模块自动为我们添加的文本块标记,一个是开始标记,一个是结束标记

我们也可以自定义标记,但是自定义的标记仍然要”成对出现”,需要有开始标记和结束标记,示例如下

ansible test92 -m blockinfile -a 'path=/testdir/rc.local block="systemctl start mariadb\nsystemctl start httpd" marker="#{mark} serivce to start" '

使用marker可以自定义文本块的标记, 上例中的”{mark}” 会自动被替换成开始标记中的”BEGIN” 和结束标记中的 “END”,如果文件中不存在同名标记的文本块,那么文件的末尾将会出现如下文本块。

#BEGIN serivce to start
systemctl start mariadb
systemctl start httpd
#END serivce to start

案例3

在执行完上述命令的基础上,执行如下命令:

ansible test72 -m blockinfile -a 'path=/testdir/rc.local block="systemctl start mariadb" marker="#{mark} serivce to start" '

因为在执行此命令时,”#{mark} serivce to start”标记对应的文本块已经存在于文件中,而同时,block参数对应的内容又与之前文本块的内容不同,所以,这种情况下,对应文本块中的内容会被更新,而不会再一次插入新的文本块,这种用法相当于更新原来文本块中的内容,执行上述命令后,文本块的内容被更新为如下文本。

#BEGIN serivce to start
systemctl start mariadb
#END serivce to start

案例4

在执行完上述命令的基础上,执行如下命令:

ansible test92 -m blockinfile -a 'path=/testdir/rc.local block="" marker="#{mark} serivce to start" '

因为在执行此命令时,”#{mark} serivce to start”标记对应的文本块已经存在于文件中,而同时,block参数对应的内容为空,这时,blockinfile模块会删除对应标记的文本块,我们还可以使用如下命令删除对应的文本块,它们的效果是相同的。

案例5

ansible test92 -m blockinfile -a 'path=/testdir/rc.local  marker="#{mark} serivce to start" state=absent'

是的,使用将state的值设置为absent,表示删除对应标记的文本块

案例6

默认情况下,文本块插入在文件的尾部,我们也可以将文本块插入指定的位置,比如,插入在文件开头,或者根据正则表达式去匹配对应的行,然后将文本块插入到匹配到的行的前头或者后头,示例如下
如果想要将文本块插入到文档的开头,可以使用insertbefore参数,将其值设置为BOF,BOF表示Begin Of File

ansible test92 -m blockinfile -a 'path=/testdir/rc.local block="####blockinfile test####"  marker="#{mark} test" insertbefore=BOF'

案例 7

如果使用如下命令,表示将文本块插入到文档的结尾,与默认操作相同,将insertafter参数设置为EOF表示End Of File

ansible test92 -m blockinfile -a 'path=/testdir/rc.local block="####blockinfile test####"  marker="#{mark} test" insertafter=EOF'

案例8

使用如下命令表示使用正则表达式匹配行,将文本块插入到 “以#!/bin/bash开头的行” 之后

ansible test92 -m blockinfile -a 'path=/testdir/rc.local block="####blockinfile test####"  marker="#{mark} test reg" insertafter="^#!/bin/bash" '

案例9

使用backup参数,可以在操作修改文件之前,对文件进行备份,备份的文件会在原文件名的基础上添加时间戳

ansible test92 -m blockinfile -a 'path=/testdir/rc.local marker="#{mark} test" state=absent backup=yes'

案例10

使用create参数,如果指定的文件不存在,则创建它,示例如下

ansible test92 -m blockinfile -a 'path=/testdir/test block="test" marker="#{mark} test" create=yes'

4.1.5 lineinfile模块

我们可以借助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参数 :当要操作的文件并不存在时,是否创建对应的文件。

为了方便举例,我们使用/testdir/test文件作为被操作的文件,test文件内容如下

# 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.

案例1 确保指定的”一行文本”存在于文件中,如果指定的文本本来就存在于文件中,则不做任何操作,如果不存在,默认在文件的末尾插入这行文本,如下命令表示确保”test lineinfile”这行文本存在于/testdir/test文件中

ansible test92 -m lineinfile -a 'path=/testdir/test line="test text"'

案例2 如下命令表示根据正则表达式替换”某一行”,如果不止一行能够匹配正则,那么只有最后一个匹配正则的行才会被替换,被匹配行会被替换成line参数指定的内容,但是如果指定的表达式没有匹配到任何一行,那么line中的内容会被添加到文件的最后一行

ansible test92 -m lineinfile -a 'path=/testdir/test regexp="^line" line="test text" '

案例3 如下命令表示根据正则表达式替换”某一行”,如果不止一行能够匹配正则,那么只有最后一个匹配正则的行才会被替换,被匹配行会被替换成line参数指定的内容,但是如果指定的表达式没有匹配到任何一行,那么则不对文件进行任何操作。

ansible test92 -m lineinfile -a 'path=/testdir/test regexp="^line" line="test text" backrefs=yes '

案例4 根据line参数的内容删除行,如果文件中有多行都与line参数的内容相同,那么这些相同的行都会被删除。

ansible test92 -m lineinfile -a 'path=/testdir/test line="lineinfile -" state=absent'

案例5 根据正则表达式删除对应行,如果有多行都满足正则表达式,那么所有匹配的行都会被删除

ansible test92 -m lineinfile -a 'path=/testdir/test regexp="^lineinfile" state=absent'

默认情况下,lineinfile模块不支持后向引用

案例6 如果将backrefs设置为yes,表示开启支持后向引用,使用如下命令,可以将test示例文件中的”Hello ansible,Hiiii”替换成”Hiiii”,如果不设置backrefs=yes,则不支持后向引用,那么”Hello ansible,Hiiii”将被替换成”\2″

ansible test92 -m lineinfile -a 'path=/testdir/test regexp="(H.{4}).*(H.{4})" line="\2" backrefs=yes'

insertafter、insertbefore、backup、create等参数就不再举例赘述了,可参考blockinfile模块,都是类似的

4.1.6 find模块

find模块可以帮助我们在远程主机中查找符合条件的文件,就像find命令一样。
此处我们介绍一些find模块的常用参数,你可以先对这些参数有一个大概了解,然后再看小示例。

paths参数 :必须参数,指定在哪个目录中查找文件,可以指定多个路径,路径间用逗号隔开,此参数有别名,使用别名path或者别名name可以代替paths。
recurse参数 : 默认情况下,只会在指定的目录中查找文件,也就是说,如果目录中还包含目录,ansible并不会递归的进入子目录查找对应文件,如果想要递归的查找文件,需要使用recurse参数,当recurse参数设置为yes时,表示在指定目录中递归的查找文件。
hidden参数 :默认情况下,隐藏文件会被忽略,当hidden参数的值设置为yes时,才会查找隐藏文件。
file_type参数 : 默认情况下,ansible只会根据条件查找”文件”,并不会查找”目录”或”软链接”等文件类型,如果想要指定查找的文件类型,可以通过file_type指定文件类型,可指定的文件类型有any、directory、file、link 四种。
patterns参数 : 使用此参数指定需要查找的文件名称,支持使用shell(比如通配符)或者正则表达式去匹配文件名称,默认情况下,使用shell匹配对应的文件名,如果想要使用python的正则去匹配文件名,需要将use_regex参数的值设置为yes。
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校验码,如果要查找的文件比较大,那么生成校验码的时间会比较长。

案例1 在test92主机的/testdir目录中查找文件内容中包含abc字符串的文件,隐藏文件会被忽略,不会进行递归查找。

ansible test92 -m find -a 'paths=/testdir contains=".*abc.*" '

案例2 在test92主机的/testdir目录以及其子目录中查找文件内容中包含abc字符串的文件,隐藏文件会被忽略

ansible test92 -m find -a 'paths=/testdir contains=".*abc.*" recurse=yes '

案例3 在test92主机的/testdir目录中查找以.sh结尾的文件,包括隐藏文件,但是不包括目录或其他文件类型,不会进行递归查找。

ansible test92 -m find -a 'paths=/testdir patterns="*.sh" hidden=yes'

案例4 在test92主机的/testdir目录中查找以.sh结尾的文件,包括隐藏文件,包括所有文件类型,比如文件、目录、或者软链接,但是不会进行递归查找

ansible test92 -m find -a 'paths=/testdir patterns="*.sh" file_type=any hidden=yes'

案例5 在test92主机的/testdir目录中查找以.sh结尾的文件,包括隐藏文件,包括所有文件类型,比如文件、目录、或者软链接,但是不会进行递归查找

ansible test92 -m find -a 'paths=/testdir patterns="*.sh" file_type=any hidden=yes'

案例6 在test92主机的/testdir目录中以及其子目录中查找mtime在4天以内的文件,不包含隐藏文件,不包含目录或软链接文件等文件类型。

ansible test92 -m find -a "path=/testdir age=-4d recurse=yes"

案例7 在test92主机的/testdir目录中以及其子目录中查找atime在2星期以内的文件,不包含隐藏文件,不包含目录或软链接文件等文件类型。

ansible test92 -m find -a "path=/testdir age=-2w age_stamp=atime recurse=yes"

案例8 在test92主机的/testdir目录中以及其子目录中查找大于2G的文件,不包含隐藏文件,不包含目录或软链接文件等文件类型

ansible test92 -m find -a "paths=/testdir size=2g recurse=yes"

案例9 在test92主机的/testdir目录中以及其子目录中查找以.sh结尾的文件,并且返回符合条件文件的sha1校验码,包括隐藏文件

ansible test92 -m find -a "paths=/testdir patterns=*.sh get_checksum=yes  hidden=yes recurse=yes"

4.1.7 replace模块

replace模块可以根据我们指定的正则表达式替换文件中的字符串,文件中所有被正则匹配到的字符串都会被替换。

此处我们介绍一些replace模块的常用参数,你可以先对这些参数有一个大概了解,然后再看小示例。
path参数 :必须参数,指定要操作的文件,2.3版本之前,只能使用dest, destfile, name指定要操作的文件,2.4版本中,仍然可以使用这些参数名,这些参数名作为path参数的别名使用。
regexp参数 : 必须参数,指定一个python正则表达式,文件中与正则匹配的字符串将会被替换。
replace参数 : 指定最终要替换成的字符串。
backup参数 :是否在修改文件之前对文件进行备份,最好设置为yes。

案例1:把test92主机中的/testdir/test文件中的所有ASM替换成asm

ansible test92 -m replace -a 'path=/testdir/test regexp="ASM" replace=asm'

案例2: 把test92主机中的/testdir/test文件中的所有ASM替换成asm,但是在操作文件之前进行备份

ansible test92 -m replace -a 'path=/testdir/test regexp="ASM" replace=asm backup=yes'

4.2 常用模块之命令模块

4.2.1 command模块

free_form参数 :必须参数,指定需要远程执行的命令,需要说明一点,free_form参数与其他参数并不相同,在之前的模块示例中,如果想要使用一个参数,那么则需要为这个参数赋值,举个例子,之前的示例模块中,大多都有path参数,当我们需要指定要操作的文件时,通常需要对path参数赋值,比如,path=/testdir/test,表示我们想要操作/testdir/test文件,但是free_form参数则不同,”free_form”并不是一个”实际存在”的参数名,比如,当我们想要在远程主机上执行ls命令时,我们并不需要写成”free_form=ls” ,这样写反而是错误的,因为并没有任何参数的名字是free_form,当我们想要在远程主机中执行ls命令时,直接写成ls即可,这就是free_form参数的含义,因为command模块的作用是执行命令,所以,任何一个可以在远程主机上执行的命令都可以被称为free_form,如果你还是不明白,看下面的小示例就行了。
chdir参数 : 此参数的作用就是指定一个目录,在执行对应的命令之前,会先进入到chdir参数指定的目录中。
creates参数 :看到creates,你可能会从字面上理解这个参数,但是使用这个参数并不会帮助我们创建文件,它的作用是当指定的文件存在时,就不执行对应命令,比如,如果/testdir/test文件存在,就不执行我们指定的命令。
removes参数 :与creates参数的作用正好相反,它的作用是当指定的文件不存在时,就不执行对应命令,比如,如果/testdir/tests文件不存在,就不执行我们指定的命令,此参数并不会帮助我们删除文件

案例1:使用如下命令,表示在test92主机上执行ls命令,因为我使用的是root用户,所以默认情况下,ls出的结果是test92主机中root用户家目录中的文件列表

ansible test92 -m command -a "ls"

案例2: chdir参数表示执行命令之前,会先进入到指定的目录中,所以如下命令表示查看test92主机上/testdir目录中的文件列表

ansible test92 -m command -a "chdir=/testdir ls"

案例3 如下命令表示/testdir/test文件如果存在于远程主机中,则不执行对应命令,如果不存在,才执行”echo test”命令

ansible test92 -m command -a "creates=/testdir/test echo test"

案例4 如下命令表示/testdir/test文件如果不存在于远程主机中,则不执行对应命令,如果存在,才执行”echo test”命令

ansible test92 -m command -a "removes=/testdir/test echo test"

4.2.2 shell模块

shell模块可以帮助我们在远程主机上执行命令,与command模块不同的是,shell模块在远程主机中执行命令时,会经过远程主机上的/bin/sh程序处理。

学习此模块之前,请先参考本文中的command模块。
此处我们介绍一些shell模块的常用参数。
free_form参数 :必须参数,指定需要远程执行的命令,但是并没有具体的一个参数名叫free_form,具体解释参考command模块。
chdir参数 : 此参数的作用就是指定一个目录,在执行对应的命令之前,会先进入到chdir参数指定的目录中。
creates参数 :使用此参数指定一个文件,当指定的文件存在时,就不执行对应命令,可参考command模块中的解释。
removes参数 :使用此参数指定一个文件,当指定的文件不存在时,就不执行对应命令,可参考command模块中的解释。
executable参数:默认情况下,shell模块会调用远程主机中的/bin/sh去执行对应的命令,通常情况下,远程主机中的默认shell都是bash,如果你想要使用其他类型的shell执行命令,则可以使用此参数指定某种类型的shell去执行对应的命令,指定shell文件时,需要使用绝对路径。

shell模块中chdir、creates、removes参数的作用与command模块中的作用都是相同的,此处不再举例。

案例1: 使用shell模块可以在远程服务器上执行命令,它支持管道与重定向等符号

ansible test92 -m shell -a "chdir=/testdir echo test > test"

案例2: 如果你想要执行的命令需要csh解析,那么可以指定使用csh在远程主机上执行对应的命令,比如在如下示例中,我们使用csh的语法定义了一个数字类型的变量TestNum,然后将TestNum变量的值重定向到了/testdir/TestNumFile,在bash中,@符号不能用于定义变量,所以,可以使用executable指定需要的shell类型。

ansible test92 -m shell -a 'executable=/bin/csh @ TestNum=666 ; echo $TestNum > /testdir/TestNumFile'

4.2.3 script模块

script模块可以帮助我们在远程主机上执行ansible主机上的脚本,也就是说,脚本一直存在于ansible主机本地,不需要手动拷贝到远程主机后再执行。

学习此模块之前,请先参考本文中的command模块。
此处我们介绍一些script模块的常用参数,你可以先对这些参数有一个大概了解,然后再看小示例。

free_form参数 :必须参数,指定需要执行的脚本,脚本位于ansible主机本地,并没有具体的一个参数名叫free_form,具体解释参考command模块。
chdir参数 : 此参数的作用就是指定一个远程主机中的目录,在执行对应的脚本之前,会先进入到chdir参数指定的目录中。
creates参数 :使用此参数指定一个远程主机中的文件,当指定的文件存在时,就不执行对应脚本,可参考command模块中的解释。
removes参数 :使用此参数指定一个远程主机中的文件,当指定的文件不存在时,就不执行对应脚本,可参考command模块中的解释。

案例1:如下命令表示ansible主机中的/testdir/atest.sh脚本将在test92主机中执行,执行此脚本之前,会先进入到test92主机中的/opt目录

ansible test92 -m script -a "chdir=/opt /testdir/atest.sh"

案例2 : 如下命令表示,如果test92主机中的/opt/testfile文件已经存在,ansible主机中的/testdir/atest.sh脚本将不会在test92主机中执行,反之则执行

ansible test92 -m script -a "creates=/opt/testfile /testdir/atest.sh"

案例3: 如下命令表示,如果test92主机中的/opt/testfile文件不存在,ansible主机中的/testdir/atest.sh脚本将不会在test92主机中执行,反之则执行。

ansible test92 -m script -a "removes=/opt/testfile /testdir/atest.sh"

4.2.4 cron模块

cron模块可以帮助我们管理远程主机中的计划任务,功能相当于crontab命令。
在了解cron模块的参数之前,先写出一些计划任务的示例,示例:
#示例1
5 1 echo test
#示例2
1 1
/3 echo test
#示例3
@reboot echo test
#示例4
@hourly echo test
上述示例1表示每天的1点5分输出test字符
上述示例2表示每3天执行一次计划任务,于当天的1点1分执行,具体任务为输出test字符
上述示例3表示每次系统启动后需要执行一次计划任务,具体任务为输出test字符
上述示例4表示每小时执行一次计划任务,具体任务 为输出test字符
根据上述示例,可以更好的了解cron模块的参数

cron模块通常使用的参数如下,你可以先大概的了解一下这些参数,然后再结合后面的示例去理解:
minute参数:此参数用于设置计划任务中分钟设定位的值,比如,上述示例1中分钟设定位的值为5,即minute=5,当不使用此参数时,分钟设定位的值默认为”
hour参数:此参数用于设置计划任务中小时设定位的值,比如,上述示例1中小时设定位的值为1,即hour=1,当不使用此参数时,小时设定位的值默认为”

day参数:此参数用于设置计划任务中日设定位的值,当不使用此参数时,日设定位的值默认为”
month参数:此参数用于设置计划任务中月设定位的值,当不使用此参数时,月设定位的值默认为”

weekday参数:此参数用于设置计划任务中周几设定位的值,当不使用此参数时,周几设定位的值默认为”
special_time参数:在上述示例3与示例4中,计划任务的时间设定格式为@reboot或者@hourly,@reboot表示重启时执行,@hourly表示每小时执行一次,相当于设置成”0
*” ,这种@开头的时间设定格式则需要使用special_time参数进行设置,special_time参数的可用值有reboot(重启后)、yearly(每年)、annually(每年,与yearly相同)、monthly(每月)、weekly(每周)、daily(每天)、hourly(每时)。

注意:当上述时间单位设定参数都未指定时,计划任务的时间设定默认会被设定为” *”,这样表示每分钟都会执行一次计划任务,所以,在使用cron模块时,我们应该确定对应的时间参数设置正确。

user参数:此参数用于设置当前计划任务属于哪个用户,当不使用此参数时,默认为管理员用户
job参数:此参数用于指定计划的任务中需要实际执行的命令或者脚本,比如上例中的”echo test”命令。
name参数:此参数用于设置计划任务的名称,计划任务的名称会在注释中显示,当不指定计划任务的名称时,ansible会默认为计划任务加入注释,注释的内容为#Ansible: None,假设指定计划任务的名称为test,那么注释的内容为#Ansible: test,在一台机器中,计划任务的名称应该具有唯一性,方便我们以后根据名称修改或删除计划任务。
state参数:当计划任务有名称时,我们可以根据名称修改或删除对应的任务,当删除计划任务时,需要将state的值设置为absent
disabled参数:当计划任务有名称时,我们可以根据名称使对应的任务”失效”(注释掉对应的任务),注意,使用此参数时,除了需要指定任务的名称,还需要同时指定任务的job以及任务的时间设定,而且任务的时间设定必须和对应任务完全相同,否则在注释任务的同时,任务的时间设定会被修改,除非你确定这样做,如果你不明白这段话的意思,可以参考下文中的示例。
backup参数:如果此参数的值设置为yes,那么当修改或者删除对应的计划任务时,会先对计划任务进行备份,然后再对计划任务进行修改或者删除,cron模块会在远程主机的/tmp目录下创建备份文件,以crontab开头并且随机加入一些字符,具体的备份文件名称会在返回信息的backup_file字段中看到,推荐将此此参数设置为yes。

cron模块的ad-hoc示例命令如下:
在test70主机上创建计划任务,任务名称为”test crontab”,任务于每天1点5分执行,任务内容为输出test字符

ansible test70 -m cron -a " name='test crontab' minute=5 hour=1 job='echo test' "

执行上述命令后,在test70主机中root用户下会有如下计划任务被创建
#Ansible: test crontab
5 1 * echo test
在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' "

执行上述命令后,在test70主机中root用户下会有如下计划任务被创建
#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
在test70主机上创建计划任务,任务名称为”test special time”,任务将在重启时执行,任务内容为输出test字符

ansible test70 -m cron -a " name='test special time' special_time=reboot job='echo test' "

4.2.5 yum模块

用来管理yum工具

  • name:指定管理的软件包
  • state=present|installed|latest|absent|removed:依次对应 安装|安装|安装最新版本|删除|删除
  • disable_gpg_check=no|yes:禁用对rpm包的公钥验证,默认no;
  • enablerepo=:在不确定某源是否启用的情况下,可以临时使用该源
  • disablerepo=:临时禁用某源

案例1: 安装nginx

ansible all -m yum -a 'name=nginx state=latest'

案例2 : 卸载nginx

ansible all -m yum -a 'name=nginx state=latest'

案例3: 安装ansible 确保使用 alicloud.repo源

ansible all -m yum -a 'name=ansible state=latest enablerepo=Alicloud'

4.3 常用模块之检查模块

4.3.1 wait_for

https://blog.csdn.net/weixin_30615767/article/details/95518893?spm=1001.2101.3001.6650.1&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-1.pc_relevant_default&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-1.pc_relevant_default&utm_relevant_index=2

https://blog.csdn.net/can40271050892/article/details/100966800?spm=1001.2101.3001.6650.1&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-1.pc_relevant_antiscan&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-1.pc_relevant_antiscan&utm_relevant_index=2