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>
相关推荐
东方小月6 小时前
从零开发一个 Coding Agent(七):实现纯文本 Agent Loop
前端·人工智能
大家的林语冰6 小时前
👉 尤雨溪再次成立新公司,同时官宣 Pinia 4 正式发布!
前端·javascript·vue.js
浮生望6 小时前
React useRef 深度解析:从DOM操作到Web Worker多线程协作
前端
浮生望6 小时前
React Router v7 实战全景:路由配置、嵌套路由、鉴权守卫与懒加载完整指南
前端
用户938515635076 小时前
从零在浏览器里跑 DeepSeek-R1:WebGPU + Transformer.js 全链路实战(二)
前端·javascript·typescript
雪隐6 小时前
个人电脑玩AI-16让5060 Ti给你打工——MiniMax H3 提速实录:从"泡杯茶等视频"到"视频等你",一张 5060 Ti 的自我修养
前端·人工智能·后端
FungLeo6 小时前
Flutter Web 中文字体困境与渲染器选择:CanvasKit vs HTML renderer 实战
前端·flutter·html
敲代码的玉米C7 小时前
我修的那个 bug,制造了另一个 bug
前端·人工智能·架构
gis开发之家7 小时前
《Vue3 从入门到大神50篇》Vue3 源码详解(二十):生命周期钩子源码解析 —— onMounted / onUpdated 如何实现?
前端·javascript·前端框架·vue3·vue3源码
Narrastory7 小时前
我用 Claude Code 写代码不到 2 小时,却花了 3 天做完这个软件—Vibe Coding 的正确姿势,是设计不是生成
前端·人工智能·github