ansible下使用blockinfile添加配置信息到xml

#发文福利#

一、前言

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>
相关推荐
lichong9519 分钟前
《postman、apipost、smartApi 等使用与特点 3 天路线图(可打印 PDF+互动脑图)》
前端·测试工具·macos·pdf·postman·大前端·大前端++
怪我冷i11 分钟前
es6与es5的模块区别
前端·ecmascript·es6·ai写作
一 乐13 分钟前
助农服务系统|基于SprinBoot+vue的助农服务系统(源码+数据库+文档)
前端·数据库·vue.js
by__csdn15 分钟前
Vue 2 与 Vue 3:深度解析与对比
前端·javascript·vue.js·typescript·vue·css3·html5
s***353018 分钟前
怎么下载安装yarn
android·前端·后端
q***649718 分钟前
Spring boot整合quartz方法
java·前端·spring boot
行走的陀螺仪20 分钟前
Vue3远程加载阿里巴巴字体图标实时更新方案
前端·icon·字体图标·阿里巴巴图标库
q***783721 分钟前
Spring Boot项目接收前端参数的11种方式
前端·spring boot·后端
z***948423 分钟前
使用rustDesk搭建私有远程桌面
android·前端·后端
❆VE❆31 分钟前
【技术分享】前端跨窗口/标签页面通信:掌握以下几种方法,提升用户体验(附带常用场景以及典例)
前端·javascript·性能优化·vue·跨标签通信