ansible的blockinfile模块

ansible的blockinfile模块

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

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

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

参数说明:

  • path:必须参数,指定要操作的文件;
  • block:此参数用于指定我们想要操作的那一段文本,此参数有一个别名叫 content,使用 contentblock 的作用是相同的;
  • marker:假如我们想要在指定文件中插入一段文本,ansible 会自动为这段文本添加两个标记,一个开始标记,一个结束标记,默认情况下,开始标记为 # BEGIN ANSIBLE MANAGED BLOCK,结束标记为 # END ANSIBLE MANAGED BLOCK,我们可以使用 marker 参数自定义标记,比如,marker=#{mark}test,这样设置以后,开始标记变成了 # BEGIN test,结束标记变成了 # END test,没错,{mark} 会自动被替换成开始标记和结束标记中的 BEGINEND,我们也可以插入很多段文本,为不同的段落添加不同的标记,下次通过对应的标记即可找到对应的段落;
  • statestate 参数有两个可选值,presentabsent,默认情况下,我们会将指定的一段文本插入到文件中,如果对应的文件中已经存在对应标记的文本,默认会更新对应段落,在执行插入操作或更新操作时,state 的值为 present,默认值就是 present,如果对应的文件中已经存在对应标记的文本并且将 state 的值设置为 absent,则表示从文件中删除对应标记的段落;
  • insertafter:在插入一段文本时,默认会在文件的末尾插入文本,如果你想要将文本插入在某一行的后面,可以使用此参数指定对应的行,也可以使用正则表达式(python 正则),表示将文本插入在符合正则表达式的行的后面,如果有多行文本都能够匹配对应的正则表达式,则以最后一个满足正则的行为准,此参数的值还可以设置为 EOF,表示将文本插入到文档末尾;
  • insertbefore:在插入一段文本时,默认会在文件的末尾插入文本,如果你想要将文本插入在某一行的前面,可以使用此参数指定对应的行,也可以使用正则表达式(python 正则),表示将文本插入在符合正则表达式的行的前面,如果有多行文本都能够匹配对应的正则表达式,则以最后一个满足正则的行为准,此参数的值还可以设置为 BOF,表示将文本插入到文档开头;
  • backup:是否在修改文件之前对文件进行备份;
  • create:当要操作的文件并不存在时,是否创建对应的文件;

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

systemctl start mariadb
systemctl start httpd

可以使用如下命令:

$ ansible all -m blockinfile -a 'path=/testdir/rc.local block="systemctl start mariadb\nsystemctl start httpd" '

当执行上述命令后,/testdir/rc.local 的文件尾部会多出如下文本块:

# BEGIN ANSIBLE MANAGED BLOCK
systemctl start mariadb
systemctl start httpd
# END ANSIBLE MANAGED BLOCK

例 2:我们也可以自定义标记,但是自定义的标记仍然要成对出现,需要有开始标记和结束标记,示例如下:

$ ansible all -m blockinfile -a 'path=/testdir/rc.local block="systemctl start mariad\nsystemctl start httpd" marker="#{mark} service to start" '

文本末尾将会出现如下文本块:

#BEGIN service to start
systemctl start mariad
systemctl start httpd
#END service to start

例 3:修改文本块:

ansible test70 -m blockinfile -a 'path=/testdir/rc.local block="systemctl start mariadb" marker="#{mark} serivce to start" '
$ ansible all -m blockinfile -a 'path=/testdir/rc.local block="systemctl start mariadb" marker="#{mark} service to start"'

原来 service to start 文本块中内容会变成如下:

#BEGIN service to start
systemctl start mariadb
#END service to start

例 4:删除「例 1」中创建的文本块。

$ ansible all -m blockinfile -a 'path=/testdir/rc.local block=""'

例 5:删除「例 2」中创建的文本块。

$ ansible all -m blockinfile -a 'path=/testdir/rc.local state=absent marker="#{mark} service to start"'

例 6:插入文本块到文档开头。

$ ansible all -m blockinfile -a 'path=/testdir/rc.local block="test block" insertbefore=BOF marker="#{mark} test"'

例 7:插入文本块到文档结尾。

$ ansible all -m blockinfile -a 'path=/testdir/rc.local block="test block 2" marker="#{mark} test" insertafter=EOF'

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

$ ansible all -m blockinfile -a 'path=/testdir/rc.local block="# test insert with regex" marker="#{mark} test reg" insertafter="^#!/bin/bash"'

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

$ ansible all -m blockinfile -a 'path=/testdir/rc.local state=absent backup=yes marker="#{mark} test reg"'

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

$ ansible all -m blockinfile -a 'path=/testdir/rc.local1 create=yes block="test create" marker="#{mark} test reg"'

Copyright: 采用 知识共享署名4.0 国际许可协议进行许可

Links: https://www.zze.xyz/archives/ansible-module-blockinfile.html

Buy me a cup of coffee ☕.