本站文章除注明转载/出处外,均为本站原创或翻译,转载前请务必署名原文链接~~~

ansible的lineinfile模块

微信搜索 zze_coding 或扫描 👉 二维码关注我的微信公众号获取更多资源推送:


此文章为「ansible笔记(2)之常用模块」的子文章。

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

参数说明:

  • path:必须参数,指定要操作的文件;
  • line:指定文本内容;
  • regexp:使用正则表达式匹配对应的行,当替换文本时,如果有多行文本都能被匹配,则只有最后面被匹配到的那行文本才会被替换,当删除文本时,如果有多行文本都能被匹配,这么这些行都会被删除;
  • state:当想要删除对应的文本时,需要将 state 参数的值设置为 absentabsent 为缺席之意,表示删除,state 的默认值为 present
  • backrefs:默认情况下,当根据正则替换文本时,即使 regexp 参数中的正则存在分组,在 line 参数中也不能对正则中的分组进行引用,除非将 backrefs 参数的值设置为 yesbackrefs=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 文件作为被操作的文件,文件内容如下:

$ cat 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:确保指定的一行文本存在于文件中,如果指定的文本本来就存在于文件中,则不做任何操作,如果不存在,默认在文件的末尾插入这行文本,如下命令表示确保 test lineinfile 这行文本存在于 /testdir/test 文件中。

$ ansible all -m lineinfile -a 'path=/testdir/test line="test text"'

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

$ ansible all -m lineinfile -a 'path=/testdir/test regexp="^line" line="test text"'

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

$ ansible all -m lineinfile -a 'path=/testdir/test regexp="^line" line="test text" backrefs=yes'

例 4:如果将 backrefs 设置为 yes,表示开启支持后向引用,使用如下命令,可以将 test 示例文件中的 Hello ansible,Hiiii 替换成 Hiiii,如果不设置 backrefs=yes,则不支持后向引用,那么 Hello ansible,Hiiii 将被替换成 \2

$ ansible all -m lineinfile -a 'path=/testdir/test regexp="(H.{4}.*(H.{4}))" line="\2" backrefs=yes'

insertafterinsertbeforebackupcreate 等参数就不再举例赘述了,可参考 blockinfile 模块,都是类似的。


如果这篇文章对您有帮助,可点击下方链接分享给你的朋友们😋,如果遇到问题欢迎评论、留言~~~😇

评论

公众号:zze_coding

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×