此文章为「ansible笔记(2)之常用模块」的子文章。
blockinfile 模块可以帮助我们在指定的文件中插入一段文本,这段文本是被标记过的,换句话说就是,我们在这段文本上做了记号,以便在以后的操作中可以通过标记找到这段文本,然后修改或者删除它,单单这样描述不是特别容易理解,结合下面的小例子动手做做立马就能够明白了。
参数说明:
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
:当要操作的文件并不存在时,是否创建对应的文件;
为了方便举例,我们将客户机的 /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"'
评论区