Ansible怎么使用XML模块 community.general.xml

Ansible 使用 community.general.xml 模块可读取、修改、写入 XML 文件,需先安装 community.general 集合;支持 state: query 查询和 state: edit 编辑,操作均在控制节点执行,要求 UTF-8 编码且 XPath 精准匹配。

Ansible 使用 community.general.xml 模块可以读取、修改、写入 XML 文件,适用于配置文件(如 Jenkins config.xml、Maven settings.xml)或任何需要结构化编辑的 XML 场景。该模块不是 Ansible 核心模块,需提前安装 community.general 集合。

安装 community.general 集合

确保目标控制节点(运行 Ansible 的机器)已安装集合:

  • 运行 ansible-galaxy collection install community.general
  • 推荐指定版本避免兼容问题,例如:ansible-galaxy collection install community.general:>=6.0.0
  • 确认安装成功:执行 ansible-galaxy collection list | grep community.general

基本用法:读取和查询 XML 内容

state: query 提取节点值或属性,适合校验或变量抽取:

  • path 指定本地 XML 文件路径(任务在控制节点执行,不是远程)
  • xpath 使用标准 XPath 表达式定位节点,支持 text()@attr
  • 结果保存在 a

    nsible_facts.xml_result
    中,可用 debug 查看

示例:获取 Jenkins 全局安全设置中的 useSecurity

- name: Read Jenkins security flag
  community.general.xml:
    path: /tmp/jenkins/config.xml
    xpath: /hudson/useSecurity/text()
    state: query
  register: xml_out
  • name: Show value debug: var: xml_out.xml_result

修改 XML:插入、更新、删除节点

使用 state: edit,配合 xmlstring(插入内容)、value(更新文本)、attribute(设置属性)等参数:

  • xpath 必须能唯一匹配目标节点;若无匹配,默认在根下追加(取决于操作类型)
  • 插入新节点时,xmlstring 必须是格式良好的 XML 片段(如 text
  • 更新文本用 value,更新属性用 attribute(字典格式,如 { "enabled": "true" }
  • 删除节点设 state: absent,XPath 匹配即删

示例:为 Maven settings.xml 添加一个镜像仓库

- name: Add mirror to Maven settings
  community.general.xml:
    path: ~/.m2/settings.xml
    xpath: /settings/mirrors
    xmlstring: |
      
        nexus-public
        https://nexus.example.com/repository/maven-public/
        central
      
    state: edit

注意事项与常见问题

该模块对 XML 格式敏感,实际使用中容易出错:

  • XML 文件必须编码为 UTF-8,且无 BOM;含中文或特殊字符时建议先用 iconv 或 Python 脚本预处理
  • XPath 匹配失败常因命名空间(namespace)——默认不支持带 namespace 的文档;如需处理,得先用其他工具(如 xmlstar)剥离或转换
  • 模块不自动格式化/缩进输出,修改后 XML 可能变成单行;如需可读性,后续可用 community.general.xml 配合 xsltproc 或用 shell 模块调用 xmllint --format
  • 所有操作均在控制节点进行,确保 path 是控制节点上的路径;如需操作远程文件,先用 fetchcopy 同步再处理