- https://www.kancloud.cn/louis1986/ansible/563208">https://www.kancloud.cn/louis1986/ansible/563208
- 1. ansible-常用模块
- 2.模块的使用
- 3.ansible命令应用基础
- 4.模块使用案例
- 4.1 常用模块之文件操作
- 4.1.1 fetch-模块
- 4.1.2 file-模块
- 案例1-用file创建一个软连接/etc/fstab到/tmp/fstab
- 案例2-我们需要在远程服务器上/tmp/下创建一个file文件
- 案例3-在test92主机上创建一个名为testfile的文件,如果testfile文件已经存在,则会更新文件的时间戳,与touch命令的作用相同
- 案例4-在test92主机上创建一个名为testdir的目录,如果testdir目录已经存在,则不进行任何操作
- 案例5-在test92上为testfile文件创建软链接文件,软链接名为linkfile,执行下面命令的时候,testfile已经存在
- 案例6- 在test92上为testfile文件创建硬链接文件,硬链接名为hardfile,执行下面命令的时候,testfile已经存在
- 案例7-在创建链接文件时,如果源文件不存在,或者链接文件与其他文件同名时,强制覆盖同名文件或者创建链接文件,参考上述force参数的解释
- 案例8-删除远程机器上的指定文件或目录
- 案例9-在创建文件或目录的时候指定属主,或者修改远程主机上的文件或目录的属主
- 案例10-在创建文件或目录的时候指定属组,或者修改远程主机上的文件或目录的属组
- 案例11-在创建文件或目录的时候指定权限,或者修改远程主机上的文件或目录的权限
- 案例12-当操作远程主机中的目录时,同时递归的将目录中的文件的属主属组都设置为zsy
- 4.1.3 copy模块
- 案例1-将ansible主机中/testdir/copytest文件复制到远程主机的/opt目录下,注意,如果copytest文件已经存在于远程主机的/opt目录中,并且远程主机中的copytest与ansible主机中copytest文件内容不同,那么使用如下命令时,远程主机中的copytest文件将被覆盖
- 案例2-在远程主机的/opt目录下生成文件test,test文件中有两行文本,第一行文本为aaa,第二行为bbb,当使用content指定文件内容时,dest参数对应的值必须是一个文件,而不能是一个路径。
- 案例3-将ansible主机中/testdir/copytest文件复制到远程主机的/opt目录中时,如果远程主机中已经存在/opt/copytest文件,并且文件内容与ansible主机中的copytest文件的内容不一致,则不执行拷贝操作,远程主机中的/opt/copytest文件内容不会被改变。
- 案例4-将ansible主机中/testdir/copytest文件复制到远程主机的/opt目录中时,如果远程主机中已经存在/opt/copytest文件,并且文件内容与ansible主机中的copytest文件的内容不一致,会执行拷贝操作,但是在执行拷贝操作之前,会将远程主机中的原文件重命名,以作备份,然后再进行拷贝操作。
- 案例5-拷贝文件时,指定文件的属主,需要注意,远程主机上必须存在对应的用户
- 案例6-拷贝文件时,指定文件的属组,需要注意,远程主机上必须存在对应的组
- 案例7-拷贝文件时,指定文件的权限
- 4.1.4 blockinfile模块
- 4.1.5 lineinfile模块
- 案例1 确保指定的”一行文本”存在于文件中,如果指定的文本本来就存在于文件中,则不做任何操作,如果不存在,默认在文件的末尾插入这行文本,如下命令表示确保”test lineinfile”这行文本存在于/testdir/test文件中
- 案例2 如下命令表示根据正则表达式替换”某一行”,如果不止一行能够匹配正则,那么只有最后一个匹配正则的行才会被替换,被匹配行会被替换成line参数指定的内容,但是如果指定的表达式没有匹配到任何一行,那么line中的内容会被添加到文件的最后一行
- 案例3 如下命令表示根据正则表达式替换”某一行”,如果不止一行能够匹配正则,那么只有最后一个匹配正则的行才会被替换,被匹配行会被替换成line参数指定的内容,但是如果指定的表达式没有匹配到任何一行,那么则不对文件进行任何操作。
- 案例4 根据line参数的内容删除行,如果文件中有多行都与line参数的内容相同,那么这些相同的行都会被删除。
- 案例5 根据正则表达式删除对应行,如果有多行都满足正则表达式,那么所有匹配的行都会被删除
- 案例6 如果将backrefs设置为yes,表示开启支持后向引用,使用如下命令,可以将test示例文件中的”Hello ansible,Hiiii”替换成”Hiiii”,如果不设置backrefs=yes,则不支持后向引用,那么”Hello ansible,Hiiii”将被替换成”\2″
- 4.1.6 find模块
- 案例1 在test92主机的/testdir目录中查找文件内容中包含abc字符串的文件,隐藏文件会被忽略,不会进行递归查找。
- 案例2 在test92主机的/testdir目录以及其子目录中查找文件内容中包含abc字符串的文件,隐藏文件会被忽略
- 案例3 在test92主机的/testdir目录中查找以.sh结尾的文件,包括隐藏文件,但是不包括目录或其他文件类型,不会进行递归查找。
- 案例4 在test92主机的/testdir目录中查找以.sh结尾的文件,包括隐藏文件,包括所有文件类型,比如文件、目录、或者软链接,但是不会进行递归查找
- 案例5 在test92主机的/testdir目录中查找以.sh结尾的文件,包括隐藏文件,包括所有文件类型,比如文件、目录、或者软链接,但是不会进行递归查找
- 案例6 在test92主机的/testdir目录中以及其子目录中查找mtime在4天以内的文件,不包含隐藏文件,不包含目录或软链接文件等文件类型。
- 案例7 在test92主机的/testdir目录中以及其子目录中查找atime在2星期以内的文件,不包含隐藏文件,不包含目录或软链接文件等文件类型。
- 案例8 在test92主机的/testdir目录中以及其子目录中查找大于2G的文件,不包含隐藏文件,不包含目录或软链接文件等文件类型
- 案例9 在test92主机的/testdir目录中以及其子目录中查找以.sh结尾的文件,并且返回符合条件文件的sha1校验码,包括隐藏文件
- 4.1.7 replace模块
- 4.2 常用模块之命令模块
- 4.3 常用模块之检查模块
- 4.1 常用模块之文件操作
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 [root@test-1 bin]# ansible-doc -l #查看所有模块
2 [root@test-1 bin]# ansible-doc -s MODULE_NAME #查看指定模块的详细帮助
在此之前,来配置一下主机清单:
[testA]
test90 ansible_host=10.7.11.90
test91 ansible_host=10.7.11.91
[testB]
test92 ansible_host=10.7.11.92
[test:children]
testA
testB
3.ansible命令应用基础
使用语法:
ansible [-f forks] [-m module_name] [-a args]
注释:
-f forks:启动的并发线程数
-m module_name: 要使用的模块
-a args:模块特有的参数
4.模块使用案例
4.1 常用模块之文件操作
测试主机是否通的,用法很简单,如果成功就返回的是pong。
复制代码
[root@localhost ~]# ansible node -m ping
10.7.11.90 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
10.7.11.91 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
10.7.11.92 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
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
[root@localhost ~]# ansible test92 -m file -a "src=/etc/fstab dest=/tmp/fstab state=link"
10.7.11.92 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": true,
"dest": "/tmp/fstab",
"gid": 0,
"group": "root",
"mode": "0777",
"owner": "root",
"size": 10,
"src": "/etc/fstab",
"state": "link",
"uid": 0
}
执行结果:
[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)
案例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'