一、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. 企业级技术解决方案:hbase+es

    1:需求: 解决海量数据的存储,并且能够实现海量数据的秒级查询 Hbase是典型的nosql,是一种构建在HDFS之上的分布式.面向列的存储系统,在需要的时候可以进行实时的大规模数据集的读写操作:但是 ...

  2. cmd开启3389

    如何用CMD开启3389与查看3389端口 开启 REG ADD HKLM\SYSTEM\CurrentControlSet\Control\Terminal" "Server / ...

  3. 大数据笔记(五)——HDFS的高级特性

    一.HDFS的回收站: recyclebin 1.HDFS的回收站默认是关闭的 2.启用回收站:去core-site.xml配置 路径:/root/training/hadoop-2.7.3/etc/ ...

  4. 冲刺周—The First Day

    一.FirstDay照片 二.项目分工 三.今日份燃尽图 四.项目进展 码云团队协同环境构建完毕 利用Leangoo制作任务分工及生成燃尽图 完成AES加解密部分代码 五.问题与困难 1.AES加解密 ...

  5. SpringMVC开发中遇到的异常1:No primary or default constructor found for interface java.util.List

    Request processing failed; nested exception is java.lang.IllegalStateException: No primary or defaul ...

  6. How to call javascript function on page load in asp.net

    How to call javascript function on page load in asp.net 解答1,使用RegisterStartupScript来运行 需要注意的是,下面的dem ...

  7. Uncaught TypeError: Cannot read property 'length' of null错误怎么处理?

    Uncaught TypeError: Cannot read property 'length' of null 错误怎么处理? 1.可能是返回的datagrid数据格式有问题,比如{"t ...

  8. qbzt day3 下午(好难)

    内容提要 有关数据结构的例题 求逆序对数 统计每个数前面有多少比他大的数 开数组表示这个数之前0~9这些数出现了几次 动态将某个点加一,动态求前缀和 用树状数组 如果数太大了怎么办? 离散化 步骤:先 ...

  9. 查看磁盘和文件的使用情况df和du

    df, du: disk filesystem, disk usage. df : 查看一级目录的使用情况, df -h du: 则是可以查看目录或者某个文件的占用磁盘空间的情况, du -h: 使用 ...

  10. CSS - 初始值、指定值、计算值、应用值、实际值

    初始值:未提供指定值且未从父元素指定值继承的 CSS 属性的值. 指定值:通过直接声明或 CSS 属性的值. 计算值:通过需要计算得到的值,如,继承和相对的尺寸.(注意:有些计算要等到布局确定才能进行 ...