#发文福利#
一、前言
1、目标:批量修改服务器上的xml配置文件
2、原配置文件的最后一部分内容如下
[root@s40 tmp]# tail kahn.conf
<value>nginx</value>
<description>my nginx config!</description>
</property>
<property>
<name>address</name>
<value>shanghai.china</value>
</property>
</configuration>
3、要求:在倒数第二行的位置插入新的配置信息
<property1>
<name1>kahn.config</name>
<value1>hahahaha.hello world!</value>
</property1>
二、ansible-playbook的写法
---
- hosts: all
gather_facts: no
ignore_unreachable: yes
tasks:
- name: debug 1
debug:
msg: "hello , newgroup"
- name: 往xml里插入一段配置信息
blockinfile:
path: /opt/tmp/hdfs-site.xml
insertbefore: "</configuration>"
block: |
<property1>
<name1>kahn.config</name>
<value1>hahahaha.hello world!</value>
</property1>
marker: "#{mark} my marker kahn..."
state: present
notify:
- handler1
handlers:
- name: handler1
command: /bin/bash -c "/usr/bin/sed -ie 's/<\/configuration>/\n<\/configuration>/g' /opt/tmp/kahn.conf"
说明:
1、insertbefore: "</configuration>" 指定在 </configuration>一行的前面插入新配置信息
2、marker: "#{mark} my marker kahn..." 指定自定义标记,注意#是linux下的注释,{mark}是固定写法,必须写。到时候再你的配置信息上下放会有标记开始和结束的信息,如#BEGIN my marker kahn...和#END my marker kahn...。为啥要加{mark},有这个标记,才能以后使用state: absent去删除块。
3、state: present 增加块。反之是state: absent,如果要删除块state: absent的前提是在增加的时候必须有marker: "#{mark}"是必不可少的。
4、notify: - handler1 是本次的拓展,自定义动作标签,当我们修改了配置文件后,就会触发将最后一行的</configuration>替换掉为</configuration>上面增加一个空行。(注意这是个迂回的方法,没能在ansible中找到给指定行增加空白行的方法。如果我们反反复复的这样弄的话,会在最后一行</configuration>前产生多条空行)
执行结果如下:
[root@s40 tmp]# tail kahn.conf
<value>nginx</value>
<description>my nginx config!</description>
</property>
<property>
<name>address</name>
<value>shanghai.china</value>
</property>
<property1>
<name1>kahn.config</name>
<value1>hahahaha.hello world!</value>
</property1>
</configuration>