12-Ansible常用模块-lineinfile模块

简介: 12-Ansible常用模块-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/testHello 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": 4,      "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": 0,      "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模块,都是类似的。

目录
相关文章
|
11月前
|
运维 Shell Linux
Ansible自动化运维工具之常用模块使用实战(5)
Ansible自动化运维工具之常用模块使用实战(5)
212 0
|
网络协议 网络安全
Ansible模块介绍——防火墙模块
Ansible模块介绍——防火墙模块
228 0
|
1月前
|
缓存 Shell Linux
[ansible]常用内置模块
[ansible]常用内置模块
|
2月前
|
Shell 应用服务中间件 Linux
Ansible的常用模块
Ansible的常用模块
33 6
|
2月前
|
Shell 数据安全/隐私保护
Ansible Ad-hoc,命令执行模块
Ansible Ad-hoc,命令执行模块
21 1
|
2月前
|
运维 Linux 应用服务中间件
Linux之自动化运维工具ansible、ansible模块(2)
Linux之自动化运维工具ansible、ansible模块(2)
|
2月前
|
运维 Linux Shell
Linux之自动化运维工具ansible、ansible模块(1)
Linux之自动化运维工具ansible、ansible模块(1)
|
4月前
|
算法 安全 Linux
Ansible 中的copy 复制模块应用详解
Ansible 中的copy 复制模块应用详解
272 1
|
11月前
|
运维 Linux
Ansible自动化运维工具之常用模块使用实战(6)
Ansible自动化运维工具之常用模块使用实战(6)
169 0
|
10月前
|
网络安全 数据安全/隐私保护
ansible的get_url模块
ansible的get_url模块
108 1