如何用Ansible XML模块删除activemq.xml中除TCP外的连接节点?
解决Ansible修改ActiveMQ XML配置删除非TCP transportConnector节点的问题
核心问题分析
你的问题根源有两个:
- ActiveMQ的
activemq.xml默认带有命名空间,未指定命名空间的XPath无法匹配到目标节点,导致带/*的XPath执行后无任何修改。 - lxml 5.3.0与旧版community.general.xml模块存在兼容问题,无命名空间的XPath匹配空结果时触发
'module lxml.etree has no attribute _ElementStringResult'报错。
正确解决方案
方案1:带命名空间的XML模块删除节点
ActiveMQ的XML根节点通常包含命名空间http://activemq.apache.org/schema/core,必须在XPath中指定命名空间才能正确匹配节点。以下是可直接运行的Playbook任务:
- name: 删除非TCP协议的transportConnector节点 community.general.xml: path: /path/to/your/activemq.xml xpath: "//ns:transportConnectors/ns:transportConnector[not(contains(@uri, 'tcp://'))]" namespaces: ns: http://activemq.apache.org/schema/core state: absent pretty_print: yes
- XPath逻辑:
not(contains(@uri, 'tcp://'))过滤掉所有URI包含TCP协议的节点,仅保留你需要的openwire类型节点。 - pretty_print参数:确保修改后的XML格式保持整洁可读。
方案2:替代方案——用lineinfile注释节点
如果XML模块的lxml兼容问题无法解决,可以用正则匹配的方式注释掉非TCP节点,适合XML结构规范的场景:
- name: 注释非TCP的transportConnector节点 ansible.builtin.lineinfile: path: /path/to/your/activemq.xml regexp: '^\s*<transportConnector(?!.*tcp://)' line: '<!-- \0 -->' backrefs: yes
- 正则逻辑:匹配所有以
<transportConnector开头且不包含tcp://的行,用XML注释语法包裹原内容。 - backrefs参数:启用后可以用
\0引用匹配到的整行内容,实现精准注释。
验证方法
执行Playbook后,检查activemq.xml:
- 仅保留类似如下的TCP节点:
<transportConnector name="openwire" uri="tcp://0.0.0.0:61616?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/> - 其他transportConnector节点已被删除或注释。
内容的提问来源于stack exchange,提问作者Broshet
相关产品推荐
相关产品推荐

