You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Ansible XML模块删除activemq.xml中除TCP外的连接节点?

解决Ansible修改ActiveMQ XML配置删除非TCP transportConnector节点的问题

核心问题分析

你的问题根源有两个:

  1. ActiveMQ的activemq.xml默认带有命名空间,未指定命名空间的XPath无法匹配到目标节点,导致带/*的XPath执行后无任何修改。
  2. 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&amp;wireFormat.maxFrameSize=104857600"/>
    
  • 其他transportConnector节点已被删除或注释。

内容的提问来源于stack exchange,提问作者Broshet

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 05:13:21