ansible的xml模块基于python内置elementtree,支持读写xml配置,但不支持命名空间和高级xpath;修改属性需用state: present+attribute,添加节点用xpath定位父节点并设attribute/content,删除用state: absent,操作前应备份。

Ansible 的 xml 模块可用于读取、修改、添加或删除 XML 配置文件中的节点和属性,适合处理如 Tomcat、Maven、Jenkins 等工具的 XML 配置。它不依赖外部解析器(如 lxml),而是使用 Python 内置的 xml.etree.ElementTree,因此轻量但功能有限——不支持命名空间、XPath 表达式较基础,且不能格式化输出(缩进/换行会丢失)。
确认目标 XML 文件结构
使用 xml 模块前,先用 cat 或 ansible.builtin.debug 查看原始内容,明确要操作的标签层级、属性名和文本值。例如:
Tomcat 的 server.xml 中一个 Connector 节点:
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443"/>
若需把 port 改为 8081,就要定位到该 Connector 元素,并修改其 port 属性。
修改 XML 属性值
用 state: present + attribute 参数更新属性。必须指定唯一标识路径(path)和匹配条件(attribute 或 content)。
-
只改 port 属性(按现有属性匹配):
xml:<br> path: /opt/tomcat/conf/server.xml<br> xpath: /Server/Service/Connector[@port='8080']<br> attribute: port<br> value: '8081'<br> state: present
-
多个条件匹配更稳妥(比如同时看 protocol 和 port):
xpath: /Server/Service/Connector[@protocol='HTTP/1.1' and @port='8080'] -
注意:
xpath必须写全路径;属性值带单引号时,YAML 中要用双引号包裹整个 xpath 字符串,避免解析错误。
添加或替换 XML 节点内容
通过 state: present 设置 content 可写入文本内容;设置 attribute 可写入属性值;两者可同时用。
-
给某个
Context添加reloadable="true"属性:
xpath: /Server/Service/Engine/Host/Context[@docBase='myapp']<br>attribute: reloadable<br>value: 'true'
-
向
<valve></valve>标签内插入文本(如日志路径):
xpath: /Server/Service/Engine/Host/Valve[@className='org.apache.catalina.valves.AccessLogValve']<br>content: '/var/log/tomcat/access.log'<br>state: present
-
新增一个完整子节点(需确保父节点存在):
xpath: /Server/Service/Engine/Host<br>name: Context<br>attribute: {'docBase': 'newapp', 'path': '/new'}<br>state: present
删除节点或属性
用 state: absent 删除匹配到的节点或属性。
-
删掉某个 Connector:
xpath: /Server/Service/Connector[@port='8009']<br>state: absent
-
只删某个属性(如删掉 redirectPort):
xpath: /Server/Service/Connector[@port='8080']<br>attribute: redirectPort<br>state: absent
-
注意: 删除操作不可逆,建议配合
backup: yes自动备份原文件。










