一、copy模块

1.1作用:

copy模块是将ansible主机上的文件拷贝到远程受控主机

1.2常用参数:

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.3实例:

1.1.1复制ansible主机 /etc/passwd 文件复制到远程主机 /tmp/passwd 目录下

# ansible test -m copy -a 'src=/etc/passwd dest=/opt/'

1.1.2在远程主机生成一个文件,并写入第一行‘aaa’,第二行‘bbb’,当使用content时,dest必须是一个文件,而不能是一个路径。

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

1.1.3将ansible主机的 /testdir/copytest 文件拷贝到远程主机的 /opt/ 目录下,如果opt下存在copytest文件,并且文件内容与ansible主机的文件内容不一致,设置force=no,则不会进行拷贝操作,/opt/copytest文件内容不会改变

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

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

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

查看 ansible-demo3 主机 /testdir 下面的文件
copytest.20579.2018-05-12@16:31:27~ 为备份的文件

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

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

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

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

1.1.7拷贝文件时,指定文件的权限。

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

二、file模块

2.1作用:

file 模块可以帮助我们完成一些对文件的基本操作。比如,创建文件或目录、删除文件或目录、修改文件权限等。

2.2常用参数:

path参数 :必须参数,用于指定要操作的文件或目录,在之前版本的ansible中,使用dest参数或者name参数指定要操作的文件或目录,为了兼容之前的版本,使用dest或name也可以。

state参数 :此参数非常灵活,其对应的值需要根据情况设定。比如,我们想要在远程主机上创建/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=0650,效果也是相同的。如果想要设置特殊权限,比如为二进制文件设置suid,则可以使用mode=4700。

recurse参数:当要操作的文件为目录,将recurse设置为yes,可以递归的修改目录中文件的属性。

2.3实例:

2.3.1.在 ansible-demo3 主机上创建一个名为 testfile1 的文件,如果 testfile1 文件已经存在,则会更新文件的时间戳,与 touch 命令的作用相同。

[root@ansible-manager ~]# ansible ansible-demo3 -m file -a "path=/testdir/testfile1 state=touch"
ansible-demo3 | SUCCESS => {
"changed": true,
"dest": "/testdir/testfile1",
"gid": ,
"group": "root",
"mode": "",
"owner": "root",
"secontext": "unconfined_u:object_r:default_t:s0",
"size": ,
"state": "file",
"uid":
}

2.3.2在 ansible-demo3 主机上创建一个名为 /testdir/testdir 的目录,如果 /testdir/testdir 目录已经存在,则不进行任何操作。

[root@ansible-manager ~]# ansible ansible-demo3 -m file -a "path=/testdir/testdir state=directory"
ansible-demo3 | SUCCESS => {
"changed": true,
"gid": ,
"group": "root",
"mode": "",
"owner": "root",
"path": "/testdir/testdir",
"secontext": "unconfined_u:object_r:default_t:s0",
"size": ,
"state": "directory",
"uid":
}

2.3.3在 ansible-demo3 上为 testfile1 文件创建软链接文件,软链接名为 linkfile1,执行下面命令的时候,testfile1 已经存在。

[root@ansible-manager ~]# ansible ansible-demo3 -m file -a "path=/testdir/linkfile1 state=link src=/testdir/testfile1"
ansible-demo3 | SUCCESS => {
"changed": true,
"dest": "/testdir/linkfile1",
"gid": ,
"group": "root",
"mode": "",
"owner": "root",
"secontext": "unconfined_u:object_r:default_t:s0",
"size": ,
"src": "/testdir/testfile1",
"state": "link",
"uid":
}

2.3.4在 ansible-demo3 上为 testfile2 文件创建硬链接文件,硬链接名为 hardfile2,执行下面命令的时候,testfile2 已经存在。

[root@ansible-manager ~]# ansible ansible-demo3 -m file -a "path=/testdir/hardfile2 state=hard src=/testdir/testfile2"
ansible-demo3 | SUCCESS => {
"changed": true,
"dest": "/testdir/hardfile2",
"gid": ,
"group": "root",
"mode": "",
"owner": "root",
"secontext": "unconfined_u:object_r:default_t:s0",
"size": ,
"src": "/testdir/testfile2",
"state": "hard",
"uid":
}

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

[root@ansible-manager ~]# ansible ansible-demo3 -m file -a "path=/testdir/linkfile3 state=link src=/testdir/sourcefile force=yes"
ansible-demo3 | SUCCESS => {
"changed": true,
"dest": "/testdir/linkfile3",
"src": "/testdir/sourcefile",
"state": "absent"
}

返回的 state 为 absent,表示源文件不存在。

2.3.6.删除远程机器上的指定文件或目录。

[root@ansible-manager ~]# ansible ansible-demo3 -m file -a "path=/testdir/testdir state=absent"
ansible-demo3 | SUCCESS => {
"changed": true,
"path": "/testdir/testdir",
"state": "absent"
}

2.3.7在创建文件或目录的时候指定属主,或者修改远程主机上的文件或目录的属主。

ansible ansible-demo3 -m file -a "path=/testdir/abc state=touch owner=ding"
ansible ansible-demo3 -m file -a "path=/testdir/abc owner=ding"
ansible ansible-demo3 -m file -a "path=/testdir/abc state=directory owner=ding"

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

ansible ansible-demo3 -m file -a "path=/testdir/abb state=touch group=ding"
ansible ansible-demo3 -m file -a "path=/testdir/abb group=ding"
ansible ansible-demo3 -m file -a "path=/testdir/abb state=directory group=ding"

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

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

2.3.10.当操作远程主机中的目录时,同时递归的将目录中的文件的属主属组都设置为ding。

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

三、blockinfile模块

3.1 作用

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

3.2 常用参数

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

3.3 示例

为了方便举例,我们将 /etc/rc.d/rc.local 文件复制到 /testdir 目录中,以做测试。 
假如,我们想要在 ansible-demo3 主机中的 /testdir/rc.local 文件尾部插入如下两行:

systemctl start mariadb
systemctl start httpd

可以使用如下命令:

[root@ansible-manager ~]# ansible ansible-demo3 -m blockinfile -a 'path=/testdir/rc.local block="systemctl start mariadb\nsystemctl start httpd"'
ansible-demo3 | SUCCESS => {
"changed": true,
"msg": "Block inserted"
}

使用 path 参数指定要操作的文件,使用 block 参数指定文本块内容,由于我们使用了 ad-hoc 命令,所以我们使用 \n 表示换行,在写 ansible playbook 时则可以直接将文本块写在多行中。当执行上述命令后,/testdir/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@ansible-manager ~]# ansible ansible-demo3 -m blockinfile -a 'path=/testdir/rc.local block="systemctl start mariadb\nsystemctl start httpd" marker="#{mark} serivce to start"'
ansible-demo3 | SUCCESS => {
"changed": true,
"msg": "Block inserted"
}

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

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

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

[root@ansible-manager ~]# ansible ansible-demo3 -m blockinfile -a 'path=/testdir/rc.local block="systemctl start mariadb" marker="#{mark} serivce to start"'
ansible-demo3 | SUCCESS => {
"changed": true,
"msg": "Block inserted"
}

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

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

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

[root@ansible-manager ~]# ansible ansible-demo3 -m blockinfile -a 'path=/testdir/rc.local block="" marker="#{mark} serivce to start"'
ansible-demo3 | SUCCESS => {
"changed": true,
"msg": "Block removed"
}

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

[root@ansible-manager ~]# ansible ansible-demo3 -m blockinfile -a 'path=/testdir/rc.local marker="#{mark} serivce to start" state=absent'
ansible-demo3 | SUCCESS => {
"changed": false,
"msg": ""
}

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

默认情况下,文本块插入在文件的尾部,我们也可以将文本块插入指定的位置,比如,插入在文件开头,或者根据正则表达式去匹配对应的行,然后将文本块插入到匹配到的行的前头或者后头。

如果想要将文本块插入到文档的开头,可以使用 insertbefore 参数,将其值设置为BOF,BOF 表示 Begin Of File:

[root@ansible-manager ~]# ansible ansible-demo3 -m blockinfile -a 'path=/testdir/rc.local block="####blockinfile test####" marker="#{mark} test" insertbefore=BOF'
ansible-demo3 | SUCCESS => {
"changed": true,
"msg": "Block inserted"
}

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

[root@ansible-manager ~]# ansible ansible-demo3 -m blockinfile -a 'path=/testdir/rc.local block="####blockinfile test####" marker="#{mark} test eof" insertafter=EOF'
ansible-demo3 | SUCCESS => {
"changed": true,
"msg": "Block inserted"
}

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

[root@ansible-manager ~]# ansible ansible-demo3 -m blockinfile -a 'path=/testdir/rc.local block="####blockinfile test####" marker="#{mark} test reg" insertafter="^#!/bin/bash"'
ansible-demo3 | SUCCESS => {
"changed": true,
"msg": "Block inserted"
}

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

[root@ansible-manager ~]# ansible ansible-demo3 -m blockinfile -a 'path=/testdir/rc.local marker="#{mark} test" state=absent backup=yes'
ansible-demo3 | SUCCESS => {
"changed": true,
"msg": "Block removed"
}

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

[root@ansible-manager ~]# ansible ansible-demo3 -m blockinfile -a 'path=/testdir/testfile3 block="test" marker="#{mark} test" create=yes'
ansible-demo3 | SUCCESS => {
"changed": true,
"msg": "File created"
}

四、lineinfile模块

4.1作用

我们可以借助 lineinfile 模块,确保”某一行文本”存在于指定的文件中,或者确保从文件中删除指定的”文本”(即确保指定的文本不存在于文件中),还可以根据正则表达式,替换”某一行文本”。

4.2常用参数

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

4.3示例

为了方便举例,我们使用 /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.

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

[root@ansible-manager ~]# ansible ansible-demo3 -m lineinfile -a 'path=/testdir/test line="test lineinfile" '
ansible-demo3 | SUCCESS => {
"backup": "",
"changed": true,
"msg": "line added"
}

因为 “test lineinfile” 不存在,所以在文件末尾插入这行文本。

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

[root@ansible-manager ~]# ansible ansible-demo3 -m lineinfile -a 'path=/testdir/test regexp="^line" line="test lineinfile" '
ansible-demo3 | SUCCESS => {
"backup": "",
"changed": true,
"msg": "line replaced"
}

上面正则表达式表示以”line”开头的行,最终匹配到了2行,但只替换了最后一个匹配的行。

[root@ansible-manager ~]# ansible ansible-demo3 -m lineinfile -a 'path=/testdir/test regexp="^line123" line="test lineinfile" '
ansible-demo3 | SUCCESS => {
"backup": "",
"changed": true,
"msg": "line added"
}

上面正则表达式表示以”line123”开头的行,没有匹配到任何一行,则内容加到文件的最后一行。

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

[root@ansible-manager ~]# ansible ansible-demo3 -m lineinfile -a 'path=/testdir/test regexp="^line" line="test lineinfile" backrefs=yes '
ansible-demo3 | SUCCESS => {
"backup": "",
"changed": true,
"msg": "line replaced"
}

上面正则表达式表示以”line”开头的行,最终匹配到了1行,则替换了所匹配的行。

[root@ansible-manager ~]# ansible ansible-demo3 -m lineinfile -a 'path=/testdir/test regexp="^line" line="test lineinfile" backrefs=yes '
ansible-demo3 | SUCCESS => {
"backup": "",
"changed": false,
"msg": ""
}

再次执行,已经没有可匹配的行,则不做任何操作。

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

[root@ansible-manager ~]# ansible ansible-demo3 -m lineinfile -a 'path=/testdir/test line="test lineinfile" state=absent'
ansible-demo3 | SUCCESS => {
"backup": "",
"changed": true,
"found": ,
"msg": "4 line(s) removed"
}

显示匹配的 4 行都被删除。

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

[root@ansible-manager ~]# ansible ansible-demo3 -m lineinfile -a 'path=/testdir/test regexp="^test" state=absent'
ansible-demo3 | SUCCESS => {
"backup": "",
"changed": false,
"found": ,
"msg": ""
}

表示没有匹配额行被删除。

默认情况下,lineinfile 模块不支持后向引用。如果将 backrefs 设置为 yes,表示开启支持后向引用。使用如下命令,可以将 test 示例文件中的 “Hello ansible,Hiiii” 替换成 “Hiiii”,如果不设置 backrefs=yes,则不支持后向引用,那么 “Hello ansible,Hiiii” 将被替换成 “\2”。

[root@ansible-manager ~]# ansible ansible-demo3 -m lineinfile -a 'path=/testdir/test regexp="(H.{4}).*(H.{4})" line="\2" backrefs=yes'
ansible-demo3 | SUCCESS => {
"backup": "",
"changed": true,
"msg": "line replaced"
}

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

Ansible笔记(2)---常用模块之文件操作的更多相关文章

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

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

  2. ansible笔记(4):常用模块之文件操作

    前文中,我们已经介绍了怎样使用模块,而且我们知道,ansible有很多模块,每个模块都有自己的功能,"模块"涉及到的方向比较多,所以对于个人来说,并没有必要了解所有的模块,我们只需 ...

  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. HTML转换PDF及SWF及图片

    一.源码特点        在一些应用场景中,出于某些目的(例如需要对文章内容进行保护,禁止用户真接复制文字内容),不能直接提供HTML的方式进行浏览,那么就需要将文章内容转换为其它的格式如PDF.图 ...

  2. 使用JS将图片转为Base64

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  3. leetcode 36有效的数独

    建立一个哈希表,每次查找,如果对应的列col,行row,小方格box中的数出现第二次,那么数独不合法: 据说还有深度优先搜索的方法,表示没有听懂:) class Solution { public: ...

  4. Parcel在binder通信readStrongBinder和writeStrongBinder

    Binder IPC通信中,Binder是通信的媒介,Parcel是通信的內容.远程调用过程中,其参数都被打包成Parcel的形式来传递. 在IPC通信的Proxy端,我们经常可以看到下面类似的代码, ...

  5. 16/7/7_PHP-面向对象关键词

    转载地址: http://blog.sina.com.cn/s/blog_5182b171010092fb.html PHP5 是一具备了大部分面向对象语言的特性的语言,比PHP4 有了很多的面向对象 ...

  6. phpmyadmin和网页上面的乱码问题

    前段时间做了个留言板,但是总是出现乱码,而且出现了无法插入的情况:发现这么个问题:在phpmyadmin里面默认的编码是瑞士的一个编码:我就郁闷了为什么这么一个通用软件的编码放着UTF-8或者是GBK ...

  7. 【MM系列】SAP MM模块-组织结构介绍

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[MM系列]SAP MM模块-组织结构介绍   ...

  8. PYTHON2.7之前需要独立安装pip

    如果python2版本是>=2.7.9, python3版本是>=3.4, pip已将一起随python安装成功了. 对于Python 2.6,你需要更旧setuptools.适用于Pyt ...

  9. 用jmeter监控服务器资源

    jmeter可以监控服务器CPU.内存等性能参数,只需要安装一些插件,比其他方法更简单  1.下载需要的jmeter插件 如图上面两个是jmeter插件,可以再下面的链接中下载: https://jm ...

  10. shutdown的几种方法和利弊

    1.shutdown normal      正常方式关闭数据库. 2.shutdown immediate      立即方式关闭数据库.      在SVRMGRL中执行shutdown imme ...