Ansible——lineinfile模块

lineinfile 模块在指定的文件中查找替换一行文本。

一、常用参数

path:required,指定要操作的文件。
line: 指定查找的行文本内容。
regexp:使用正则表达式匹配对应的行
state:absent或present,默认值为present。
backrefs:backrefs=yes开启后向引用,这样,line参数中就能对regexp参数中的分组进行后向引用了,这样说不太容易明白,可以参考后面的示例命令理解。默认情况下,当使用正则表达式替换对应行时,如果正则没有匹配到任何的行,那么line对应的内容会被插入到文本的末尾,如果使用了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:当要操作的文件并不存在时,是否创建对应的文件。

二、示例

样例文件
[root@master ~]# 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

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

因为 “test lineinfile” 不存在,所以在文件末尾插入这行文本。
如下命令表示根据正则表达式替换”某一行”,如果不止一行能够匹配正则,那么只有最后一个匹配正则的行才会被替换,被匹配行会被替换成 line 参数指定的内容,但是如果指定的表达式没有匹配到任何一行,那么 line 中的内容会被添加到文件的最后一行。
示例2

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

上面正则表达式表示以”line”开头的行,最终匹配到了2行,但只替换了最后一个匹配的行。
这里写图片描述
示例3

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

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

上面正则表达式表示以”line”开头的行,最终匹配到了1行,则替换了所匹配的行。
[root@ansible-manager ~]# ansible host1 -m lineinfile -a 'path=/testdir/test regexp="^line" line=“test lineinfile” backrefs=yes ’
host1 | SUCCESS => {
“backup”: “”,
“changed”: false,
“msg”: “”
}
再次执行,已经没有可匹配的行,则不做任何操作。
根据 line 参数的内容删除行,如果文件中有多行都与 line 参数的内容相同,那么这些相同的行都会被删除。
示例5

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

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

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

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

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

————Blueicex 2020/2/2 17:29 [email protected]

发布了55 篇原创文章 · 获赞 0 · 访问量 2013

猜你喜欢

转载自blog.csdn.net/blueicex2017/article/details/104146792