前文中,我们已经介绍了怎样使用模块,而且我们知道,ansible有很多模块,每个模块都有自己的功能,"模块"涉及到的方向比较多,所以对于个人来说,并没有必要了解所有的模块,我们只需要根据实际的业务场景了解相应的模块即可,而且ansible比较贴心,ansible根据模块的功能对这些模块进行了大致的分类,比如,如果某些模块都是操作文件的,就把它们分类到文件类模块中,如果某些模块都是操作数据库的,就把他们分类到数据库类模块中,那么,ansible把模块分为了哪些类呢?你可以参考官方手册,找到答案,模块的分类目录如下

.4版本中模块分类:
https://docs.ansible.com/ansible/2.4/modules_by_category.html 上述链接不仅对模块进行了分类,还给出了每个模块的使用示例,不过这些示例都是编写"剧本(playbook)"的示例,我们还没有介绍过怎样编写剧本,所以暂时不会参考这些示例,前文的示例中,我们一直以命令的方式运行ansible,通过命令的方式调用模块,这种直接在命令行中运行的ansible命令被称作为"ad-hoc命令",我们可以通过"ad-hoc命令"的方式,快速的了解一个模块。 在前文的示例中,我们已经了解了ping模块与fetch模块,那么这篇文章中,我们来了解一些新的模块,这些模块都是常用的操作文件的模块 copy模块
见名知义,copy模块的作用就是拷贝文件,它与之前介绍的fetch模块类似,不过,fetch模块是从远程主机中拉取文件到ansible
主机,而copy模块是将ansible主机上的文件拷贝到远程主机中。 此处我们介绍一些copy模块的常用参数,然后再给出对应示例。 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表示。 对应上述参数的ad-hoc示例命令如下: 将ansible主机中/data/zabbix/etc/zabbix_agent.conf文件复制到远程主机的/opt目录下,注意,如果zabbix_agent.conf文件已经存在于远程主机的/opt目录中,并且远程主机中的zabbix_agent.conf 与ansible主机中zabbix_agent.conf 文件内容不同,那么使用如下命令时,远程主机中的zabbix_agent.conf 文件将被覆盖。 [root@node1 etc]# cat /data/zabbix/etc/zabbix_agent.conf
server=10.11.0.210
timeout= [root@node1 etc]# ansible test211 -m copy -a "src=/data/zabbix/etc/zabbix_agent.conf dest=/opt/"
test211 | SUCCESS => {
"changed": true,
"checksum": "51a15ddb0de69bcdfcc92e2461fcc749bfc79984",
"dest": "/opt/zabbix_agent.conf",
"gid": ,
"group": "root",
"md5sum": "1c50ec4b1749e9da8cbcae4010a97cf7",
"mode": "",
"owner": "root",
"size": ,
"src": "/root/.ansible/tmp/ansible-tmp-1530156470.57-213943297741497/source",
"state": "file",
"uid":
} 在远程主机的/opt目录下生成文件test.txt,test.txt文件中有两行文本,第一行文本为aaa,第二行为bbb,当使用content指定文件内容时,dest参数对应的值必须是一个文件,而不能是一个路径。 [root@node1 etc]# ansible test215 -m copy -a 'content="aaa\nbbb\n" dest=/opt/test.txt'
test215 | SUCCESS => {
"changed": true,
"checksum": "90c206af0bfefa95541d3e724efe1dbc1ed3877f",
"dest": "/opt/test.txt",
"gid": ,
"group": "root",
"md5sum": "8b652b8c79f357694a04bd793f533c96",
"mode": "",
"owner": "root",
"size": ,
"src": "/root/.ansible/tmp/ansible-tmp-1530156646.81-14380613072539/source",
"state": "file",
"uid":
} 将ansible主机中/data/zabbix/etc/zabbix_agent.conf文件复制到远程主机的/opt目录中时,如果远程主机中已经存在/opt/zabbix_agent.conf文件,并且文件内容与ansible主机中的zabbix_agent.conf文件的内容不一致,则不执行拷贝操作,远程主机中的/opt/zabbix_agent.conf文件内容不会被改变。 [root@node1 etc]# ansible test211 -m copy -a "src=/data/zabbix/etc/zabbix_agent.conf dest=/opt/ force=no"
test211 | SUCCESS => {
"changed": false,
"dest": "/opt/",
"src": "/data/zabbix/etc/zabbix_agent.conf"
} 将ansible主机中/data/zabbix/etc/zabbix_agent.conf文件复制到远程主机的/opt目录中时,如果远程主机中已经存在/opt/zabbix_agent.conf文件,并且文件内容与ansible主机中的zabbix_agent.conf文件的内容不一致,会执行拷贝操作,但是在执行拷贝操作之前,会将远程主机中的原文件重命名,以作备份,然后再进行拷贝操作。 [root@node1 etc]# ansible test211 -m copy -a "src=/data/zabbix/etc/zabbix_agent.conf dest=/opt/ backup=yes"
test211 | SUCCESS => {
"backup_file": "/opt/zabbix_agent.conf.24678.2018-06-28@11:36:01~",
"changed": true,
"checksum": "c0a588b1444d9c719f9248fd8a5151f89c81b3b0",
"dest": "/opt/zabbix_agent.conf",
"gid": ,
"group": "root",
"md5sum": "4c554a99859d70ce57d2530fcd6a3479",
"mode": "",
"owner": "root",
"size": ,
"src": "/root/.ansible/tmp/ansible-tmp-1530156960.61-227506552864719/source",
"state": "file",
"uid":
}
拷贝文件时,指定文件的属主,需要注意,远程主机上必须存在对应的用户 [root@node1 etc]# ansible test211 -m copy -a "src=/data/zabbix/etc/zabbix_agent.conf dest=/opt/ owner=apache"
test211 | SUCCESS => {
"changed": true,
"checksum": "c0a588b1444d9c719f9248fd8a5151f89c81b3b0",
"dest": "/opt/zabbix_agent.conf",
"gid": ,
"group": "root",
"mode": "",
"owner": "apache",
"path": "/opt/zabbix_agent.conf",
"size": ,
"state": "file",
"uid":
} 拷贝文件时,指定文件的属组,需要注意,远程主机上必须存在对应的组。 [root@node1 etc]# ansible test211 -m copy -a "src=/data/zabbix/etc/zabbix_agent.conf dest=/opt/ group=apache"
test211 | SUCCESS => {
"changed": true,
"checksum": "c0a588b1444d9c719f9248fd8a5151f89c81b3b0",
"dest": "/opt/zabbix_agent.conf",
"gid": ,
"group": "apache",
"mode": "",
"owner": "apache",
"path": "/opt/zabbix_agent.conf",
"size": ,
"state": "file",
"uid":
} 拷贝文件时,指定文件的权限 [root@node1 etc]# ansible test211 -m copy -a "src=/data/zabbix/etc/zabbix_agent.conf dest=/opt/ mode=0640"
test211 | SUCCESS => {
"changed": true,
"checksum": "c0a588b1444d9c719f9248fd8a5151f89c81b3b0",
"dest": "/opt/zabbix_agent.conf",
"gid": ,
"group": "apache",
"mode": "",
"owner": "apache",
"path": "/opt/zabbix_agent.conf",
"size": ,
"state": "file",
"uid":
} file模块
file模块可以帮助我们完成一些对文件的基本操作,比如,创建文件或目录、删除文件或目录、修改文件权限等 此处我们介绍一些file模块的常用参数,然后再给出对应示例。 path参数 :必须参数,用于指定要操作的文件或目录,在之前版本的ansible中,使用dest参数或者name参数指定要操作的文件或目录,为了兼容之前的版本,使用dest或name也可以。 state参数 :此参数非常灵活,此参数对应的值需要根据情况设定,比如,当我们需要在远程主机中创建一个目录的时候,我们需要使用path参数指定对应的目录路径,假设,我想要在远程主机上创建/testdir/a/b目录,那么我则需要设置path=/testdir/a/b,但是,我们无法从"/testdir/a/b"这个路径看出b是一个文件还是一个目录,ansible也同样无法单单从一个字符串就知道你要创建文件还是目录,所以,我们需要通过state参数进行说明,当我们想要创建的/testdir/a/b是一个目录时,需要将state的值设置为directory,"directory"为目录之意,当它与path结合,ansible就能知道我们要操作的目标是一个目录,同理,当我们想要操作的/testdir/a/b是一个文件时,则需要将state的值设置为touch,当我们想要创建软链接文件时,需将state设置为link,想要创建硬链接文件时,需要将state设置为hard,当我们想要删除一个文件时(删除时不用区分目标是文件、目录、还是链接),则需要将state的值设置为absent,"absent"为缺席之意,当我们想让操作的目标"缺席"时,就表示我们想要删除目标。 src参数 :当state设置为link或者hard时,表示我们想要创建一个软链或者硬链,所以,我们必须指明软链或硬链链接的哪个文件,通过src参数即可指定链接源。 force参数 : 当state=link的时候,可配合此参数强制创建链接文件,当force=yes时,表示强制创建链接文件,不过强制创建链接文件分为两种情况,情况一:当你要创建的链接文件指向的源文件并不存在时,使用此参数,可以先强制创建出链接文件。情况二:当你要创建链接文件的目录中已经存在与链接文件同名的文件时,将force设置为yes,回将同名文件覆盖为链接文件,相当于删除同名文件,创建链接文件。情况三:当你要创建链接文件的目录中已经存在与链接文件同名的文件,并且链接文件指向的源文件也不存在,这时会强制替换同名文件为链接文件。 owner参数 :用于指定被操作文件的属主,属主对应的用户必须在远程主机中存在,否则会报错。 group参数 :用于指定被操作文件的属组,属组对应的组必须在远程主机中存在,否则会报错。 mode参数:用于指定被操作文件的权限,比如,如果想要将文件权限设置为"rw-r-x---",则可以使用mode=650进行设置,或者使用mode=,效果也是相同的,如果你想要设置特殊权限,比如为二进制文件设置suid,则可以使用mode=,很方便吧。 recurse参数:当要操作的文件为目录,将recurse设置为yes,可以递归的修改目录中文件的属性。 对应上述参数的ad-hoc示例命令如下: 在test211主机上创建一个名为index.html 的文件,如果index.html 文件已经存在,则会更新文件的时间戳,与touch命令的作用相同 [root@node1 data]# ansible test211 -m file -a "path=/data/index.html state=touch"
test211 | SUCCESS => {
"changed": true,
"dest": "/data/index.html",
"gid": ,
"group": "root",
"mode": "",
"owner": "root",
"size": ,
"state": "file",
"uid":
} 在test211主机上创建一个名为testdir的目录,如果testdir目录已经存在,则不进行任何操作
[root@node1 data]# ansible test211 -m file -a "path=/data/zabbix state=directory"
test211 | SUCCESS => {
"changed": true,
"gid": ,
"group": "root",
"mode": "",
"owner": "root",
"path": "/data/zabbix",
"size": ,
"state": "directory",
"uid":
} 在test211上为php文件创建软链接文件,软链接名为linkphp,执行下面命令的时候,/data/php 已经存在。 [root@node1 data]# ansible test211 -m file -a "path=/data/linkphp state=link src=/data/php"
test211 | SUCCESS => {
"changed": true,
"dest": "/data/linkphp",
"gid": ,
"group": "root",
"mode": "",
"owner": "root",
"size": ,
"src": "/data/php",
"state": "link",
"uid":
} 在test211上为php文件创建硬链接文件,硬链接名为hardphp,执行下面命令的时候,php已经存在 [root@node1 data]# ansible test211 -m file -a "path=/data/hardphp state=hard src=/data/php"
test211 | SUCCESS => {
"changed": true,
"dest": "/data/hardphp",
"gid": ,
"group": "root",
"mode": "",
"owner": "root",
"size": ,
"src": "/data/php",
"state": "hard",
"uid":
} 在创建链接文件时,如果源文件不存在,或者链接文件与其他文件同名时,强制覆盖同名文件或者创建链接文件,参考上述force参数的解释。 [root@node1 data]# ansible test211 -m file -a "path=/data/jack state=link src=/data/sourcefile force=yes"
[WARNING]: Cannot set fs attributes on a non-existent symlink target. follow should be set to False to avoid this. test211 | SUCCESS => {
"changed": true,
"dest": "/data/jack",
"src": "/data/sourcefile",
"state": "absent"
} 删除远程机器上的指定文件或目录 [root@node1 data]# ansible test211 -m file -a "path=/data/jack state=absent"
test211 | SUCCESS => {
"changed": true,
"path": "/data/jack",
"state": "absent"
} 在创建文件或目录的时候指定属主,或者修改远程主机上的文件或目录的属主。
[root@node1 data]# ansible test211 -m file -a "path=/data/aaa state=touch owner=apache"
test211 | SUCCESS => {
"changed": true,
"dest": "/data/aaa",
"gid": ,
"group": "root",
"mode": "",
"owner": "apache",
"size": ,
"state": "file",
"uid":
} [root@node1 data]# ansible test211 -m file -a "path=/data/aaa owner=apache"
test211 | SUCCESS => {
"changed": false,
"gid": ,
"group": "root",
"mode": "",
"owner": "apache",
"path": "/data/aaa",
"size": ,
"state": "file",
"uid":
} [root@node1 data]# ansible test211 -m file -a "path=/data/abc state=directory owner=apache"
test211 | SUCCESS => {
"changed": true,
"gid": ,
"group": "root",
"mode": "",
"owner": "apache",
"path": "/data/abc",
"size": ,
"state": "directory",
"uid":
} 在创建文件或目录的时候指定属组,或者修改远程主机上的文件或目录的属组 [root@node1 data]# ansible test211 -m file -a "path=/data/httpd state=touch group=apache"
[root@node1 data]# ansible test211 -m file -a "path=/data/httpd group=apache"
[root@node1 data]# ansible test211 -m file -a "path=/data/httpda state=directory group=apache" 在创建文件或目录的时候指定权限,或者修改远程主机上的文件或目录的权限。 [root@node1 data]# ansible test211 -m file -a "path=/data/index.html state=touch mode=0644"
[root@node1 data]# ansible test211 -m file -a "path=/data/index.html mode=0755"
[root@node1 data]# ansible test211 -m file -a "path=/data/index.html mode=4700"
[root@node1 data]# ansible test211 -m file -a "path=/data/httpd state=directory mode=0644" 当操作远程主机中的目录时,同时递归的将目录中的文件的属主属组都设置为apache [root@node1 data]# ansible test211 -m file -a "path=/data/httpd state=directory owner=apache group=apache recurse=yes" blockinfile模块
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参数 :当要操作的文件并不存在时,是否创建对应的文件。 对应上述参数的ad-hoc示例命令如下: 为了方便举例,我们将/etc/rc.d/rc.local文件复制到/data目录中,以做测试 假如,我们想要在test211主机中的/data/rc.local文件尾部插入如下两行 systemctl start mariadb systemctl start httpd 可以使用如下命令 [root@node1 data]# ansible test211 -m copy -a "src=/etc/rc.d/rc.local dest=/data/"
[root@node1 data]# ansible test211 -m blockinfile -a 'path=/data/rc.local block="systemctl start mariadb\n systemctl start httpd"'
test211 | SUCCESS => {
"changed": true,
"msg": "Block inserted"
} 使用path参数指定要操作的文件,使用block参数指定文本块内容,由于我们使用了ad-hoc命令,所以我们使用\n表示换行,在写ansible剧本时则可以直接将文本块写在多行中,但是我们还没有介绍剧本的编写,所以此处不用在意,当执行上述命令后,/data/rc.local的文件尾部会多出如下文本块 # BEGIN ANSIBLE MANAGED BLOCK
systemctl start mariadb
systemctl start httpd
# END ANSIBLE MANAGED BLOCK 正如之前所说,blockinfile模块的作用就是在文件中添加、更新、或者删除"被标记的文本块",而上述被标记的文本块就是我们添加进文件的,# BEGIN ANSIBLE MANAGED BLOCK 和 # END ANSIBLE MANAGED BLOCK 就是blockinfile模块自动为我们添加的文本块标记,一个是开始标记,一个是结束标记。 我们也可以自定义标记,但是自定义的标记仍然要"成对出现",需要有开始标记和结束标记,示例如下
[root@node1 data]# ansible test211 -m blockinfile -a 'path=/data/rc.local block="systemctl start mariadb\nsystemctl start httpd" marker="#{mark} service to start"'
test211 | SUCCESS => {
"changed": true,
"msg": "Block inserted"
}
因为在执行此命令时,"#{mark} serivce to start"标记对应的文本块已经存在于文件中,而同时,block参数对应的内容又与之前文本块的内容不同,所以,这种情况下,对应文本块中的内容会被更新,而不会再一次插入新的文本块,这种用法相当于更新原来文本块中的内容,执行上述命令后,文本块的内容被更新为如下文本。 #BEGIN service to start
systemctl start mariadb
systemctl start httpd
#END service to start 在执行完上述命令的基础上,执行如下命令
[root@node1 data]# ansible test211 -m blockinfile -a 'path=/data/rc.local block="" marker="#{mark} service to start"' 因为在执行此命令时,"#{mark} serivce to start"标记对应的文本块已经存在于文件中,而同时,block参数对应的内容为空,这时,blockinfile模块会删除对应标记的文本块,我们还可以使用如下命令删除对应的文本块,它们的效果是相同的
[root@node1 data]# ansible test211 -m blockinfile -a 'path=/data/rc.local marker="#{mark} service to start" state=absent' ansible test70 -m blockinfile -a 'path=/testdir/rc.local marker="#{mark} serivce to start" state=absent'
是的,使用将state的值设置为absent,表示删除对应标记的文本块 默认情况下,文本块插入在文件的尾部,我们也可以将文本块插入指定的位置,比如,插入在文件开头,或者根据正则表达式去匹配对应的行,然后将文本块插入到匹配到的行的前头或者后头,示例如下 如果想要将文本块插入到文档的开头,可以使用insertbefore参数,将其值设置为BOF,BOF表示Begin Of File [root@node1 data]# ansible test211 -m blockinfile -a 'path=/data/rc.local block="####blockinfile test####" marker="#{mark} test" insertbefore=BOF' 如果使用如下命令,表示将文本块插入到文档的结尾,与默认操作相同,将insertafter参数设置为EOF表示End Of File [root@node1 data]# ansible test211 -m blockinfile -a 'path=/data/rc.local block="####blockinfile test####" marker="#{mark} test" insertafter=EOF' 使用如下命令表示使用正则表达式匹配行,将文本块插入到 "以#!/bin/bash开头的行" 之后 [root@node1 data]# ansible test211 -m blockinfile -a 'path=/data/rc.local block="####blockinfile test####" marker="#{mark} test reg" insertafter="^#!/bin/bash"' 使用backup参数,可以在操作修改文件之前,对文件进行备份,备份的文件会在原文件名的基础上添加时间戳 [root@node1 data]# ansible test211 -m blockinfile -a 'path=/data/rc.local block="###block test###" marker="#{mark} test" backup=yes' 使用create参数,如果指定的文件不存在,则创建它,示例如下
[root@node1 data]# ansible test211 -m blockinfile -a 'path=/data/rc.local block="### block test ###" marker="#{mark} test" create=yes' lineinfile模块
我们可以借助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参数 :当要操作的文件并不存在时,是否创建对应的文件。 对应上述参数的ad-hoc示例命令如下: 为了方便举例,我们使用/data/test.txt文件作为被操作的文件,test.txt文件内容如下 [root@node5 data]# cat /data/test.txt
Hello ansible,Hiiii
lineinfile -
Ensure a particular line is in a file,
lineinfile -
or replace an existing line using a back-referenced regular expression. 确保指定的"一行文本"存在于文件中,如果指定的文本本来就存在于文件中,则不做任何操作,如果不存在,默认在文件的末尾插入这行文本,如下命令表示确保"test text hello"这行文本存在于/data/test.txt文件中。 [root@node1 data]# ansible test211 -m lineinfile -a 'path=/data/test.txt line="test text hello"' 如下命令表示根据正则表达式替换"某一行",如果不止一行能够匹配正则,那么只有最后一个匹配正则的行才会被替换,被匹配行会被替换成line参数指定的内容,但是如果指定的表达式没有匹配到任何一行,那么line中的内容会被添加到文件的最后一行。
[root@node1 data]# ansible test211 -m lineinfile -a 'path=/data/test.txt regexp="^line" line="test test" 如下命令表示根据正则表达式替换"某一行",如果不止一行能够匹配正则,那么只有最后一个匹配正则的行才会被替换,被匹配行会被替换成line参数指定的内容,但是如果指定的表达式没有匹配到任何一行,那么则不对文件进行任何操作。
[root@node1 data]# ansible test211 -m lineinfile -a 'path=/data/test.txt regexp="^line" line="test text" backrefs=yes' 根据line参数的内容删除行,如果文件中有多行都与line参数的内容相同,那么这些相同的行都会被删除。 [root@node1 data]# ansible test211 -m lineinfile -a 'path=/data/test.txt line="lineinfile -" state=absent' 根据正则表达式删除对应行,如果有多行都满足正则表达式,那么所有匹配的行都会被删除 [root@node1 data]# ansible test211 -m lineinfile -a 'path=/data/test.txt regexp="^line" state=absent' 默认情况下,lineinfile模块不支持后向引用 如果将backrefs设置为yes,表示开启支持后向引用,使用如下命令,可以将test示例文件中的"Hello ansible,Hiiii"替换成"Hiiii",如果不设置backrefs=yes,则不支持后向引用,那么"Hello ansible,Hiiii"将被替换成"\2" [root@node1 data]# ansible test211 -m lineinfile -a 'path=/data/test.txt regexp="(H.{4}).*(H.{4})" line="\2" backrefs=yes'

ansible笔记(4):常用模块之文件操作的更多相关文章

  1. ansible笔记(5):常用模块之文件操作(二)

    ansible笔记():常用模块之文件操作(二) 文件操作类模块 find模块 find模块可以帮助我们在远程主机中查找符合条件的文件,就像find命令一样. 此处我们介绍一些find模块的常用参数, ...

  2. Ansible笔记(2)---常用模块之文件操作

    一.copy模块 1.1作用: copy模块是将ansible主机上的文件拷贝到远程受控主机 1.2常用参数: src参数 :用于指定需要copy的文件或目录. dest参数 :用于指定文件将被拷贝到 ...

  3. 02-Node.js学习笔记-系统模块fs文件操作

    2.1.什么是系统模块 Node 运行环境提供的API,因为这些API都是以模块化的方式进行开发的,所有我们又称Node运行环境提供的API为系统模块 3.1系统模块fs文件操作 //f :file ...

  4. python笔记之常用模块用法分析

    python笔记之常用模块用法分析 内置模块(不用import就可以直接使用) 常用内置函数 help(obj) 在线帮助, obj可是任何类型 callable(obj) 查看一个obj是不是可以像 ...

  5. [C#] 常用工具类——文件操作类

    /// <para> FilesUpload:工具方法:ASP.NET上传文件的方法</para> /// <para> FileExists:返回文件是否存在&l ...

  6. python学习笔记之常用模块(第五天)

    参考老师的博客: 金角:http://www.cnblogs.com/alex3714/articles/5161349.html 银角:http://www.cnblogs.com/wupeiqi/ ...

  7. Ansible简介及常用模块

    一.基础介绍 1.简介 ansible是新出现的自动化运维工具,基于Python开发,集合了众多运维工具(puppet.cfengine.chef.func.fabric)的优点,实现了批量系统配置. ...

  8. Ansible 入门指南 - 常用模块

    介绍 module 文档: 官宣-模块分类的索引 官宣-全部模块的索引 在playbook脚本中,tasks 中的每一个 action都是对 module的一次调用.在每个 action中: 冒号前面 ...

  9. Ansible指令和常用模块使用

    这里文章记录一下ansible的指令选项和常用的模块使用 ansible指令选项 -m:要执行的模块,默认为command -a:模块的参数 -u:ssh连接的用户名,默认用root,ansible. ...

随机推荐

  1. springBoot整合mybatis、jsp 或 HTML

    springBoot整合mybatis.jsp Spring Boot的主要优点: 1:  为所有Spring开发者更快的入门: 2:  开箱即用,提供各种默认配置来简化项目配置: 3:  内嵌式容器 ...

  2. functools学习记录

    装饰器demo def wrapper(func): print('装饰器工作了') def inner(*args,**kwargs): return func(*args,**kwargs) re ...

  3. Reshaper安装后vs快捷键不起作用

    做如上设置

  4. DevExpress Winform 常用控件

    Ø  前言 DevExpress 控件的功能比较强大,是全球知名控件开发公司,对于开发 B/S 或 C/S 都非常出色,可以实现很炫且功能强大的效果. DevExpress Winform 常用控件是 ...

  5. 在window上使用 linux shell 删除文件夹递归地

    目的 在windows环境下, 整理代码,代码中含有 .svn 文件夹, 此文件夹在所有受控目录下都存在, 需要统一删除. 但是对windows的shell不熟悉,想用linux rm来删除, 如何实 ...

  6. FILE SIGNATURES TABLE

    FILE SIGNATURES TABLE 16 December 2017 This table of file signatures (aka "magic numbers") ...

  7. 【bzoj 3524】[Poi2014]Couriers

    Description 给一个长度为n的序列a.1≤a[i]≤n.m组询问,每次询问一个区间[l,r],是否存在一个数在[l,r]中出现的次数大于(r-l+1)/2.如果存在,输出这个数,否则输出0. ...

  8. 20155324 2016-2017-2 《Java程序设计》第4周学习总结

    20155324 2016-2017-2 <Java程序设计>第4周学习总结 教材学习内容总结 继承 面对对象中,子类继承父类,避免重复定义行为就使用继承.在Java中,继承时使用exte ...

  9. ubuntu安装matplotlib一些坑

    ubuntu16.04,python2.7 安装matplotlib, 1.在root权限下执行命令 pip install matplotlib==1.5.1 这里有个困扰我一个星期的问题,系统都被 ...

  10. python之MD5加密

    一. MD5加密import hashlib #Python3里的引用#import md5 #Python2里的引用 1. md5是不可逆的,不能解密2. 所有语言生成的md5串都是一样的 3. 不 ...