如何使用 Ansible 模块 community.general 编辑 XML 文件.xml

How do you edit XML file with Ansible module community.general.xml

提问人:Gullah Geechee 提问时间:7/17/2022 最后编辑:β.εηοιτ.βεGullah Geechee 更新时间:11/13/2023 访问量:696

问:

使用 Ansible 模块 ,我正在尝试将子节点添加到以下 XML 数据:(保存到 namespace-test.xmlcommunity.general.xml)

<configuration xmlns="urn:activemq" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xi="http://www.w3.org/2001/XInclude" xsi:schemaLocation="urn:activemq /schema/artemis-configuration.xsd">
  <core xmlns="urn:activemq:core" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="urn:activemq:core ">
  </core>
</configuration>

我想在节点下添加的数据是:core

<xi:include href="/conf/xmlconfig-to-include.xml"/>

我正在运行的 Ansible 任务是:

- name: include modular XML configuration file
  community.general.xml:
    path: namespace-test.xml
    xpath: /conf:configuration/core:core
    input_type: xml
    add_children:
      - '<xi:include href="/conf/xmlconfig-to-include.xml"/>'
    namespaces:
      conf: urn:activemq
      core: urn:activemq:core
      xi: "http://www.w3.org/2001/XInclude"
    pretty_print: yes

我期待得到这个结果:

<configuration xmlns="urn:activemq" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xi="http://www.w3.org/2001/XInclude" xsi:schemaLocation="urn:activemq /schema/artemis-configuration.xsd">
  <core xmlns="urn:activemq:core" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="urn:activemq:core ">
    <xi:include href="/conf/xmlconfig-to-include.xml"/>
  </core>
</configuration>

但是我收到以下错误消息:

解析子元素时出错:未定义包含上的命名空间前缀 习


在 β.εηοιτ.βε 建议的非常有用的选项之后的更多信息。

幂等选项不满足我需要在 XML 块中包含多个附加要求(最初未指定)。

这确实是我的目标:

<configuration xmlns="urn:activemq" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xi="http://www.w3.org/2001/XInclude" xsi:schemaLocation="urn:activemq /schema/artemis-configuration.xsd">
  <core xmlns="urn:activemq:core" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="urn:activemq:core ">
    <xi:include href="/conf/addresses.xml"/>
    <xi:include href="/conf/address-settings.xml"/>
    <xi:include href="/conf/security-settings.xml"/>
  </core>
</configuration>
XML Ansible 命名空间

评论


答:

2赞 β.εηοιτ.βε 7/18/2022 #1

对于您手头的问题,实际上有两种方法:

  1. 强烈推荐的:使用您期望的节点构建 — — 并添加所需的属性。xpath/conf:configuration/core:core/xi:include
  2. 与您的实际试用一致,使用 ,但采用 YAML 形式,因为 XML 形式似乎不能很好地处理命名空间引用add_children

为什么强烈推荐第一个?因为它使你的任务是幂等的,所以,重新运行你的 playbook 不会一遍又一遍地添加同一个节点,如果它已经存在正确的属性。

所以,这里是幂等任务:

- name: include modular XML configuration file
  community.general.xml:
    path: namespace-test.xml
    xpath: /conf:configuration/core:core/xi:include
    attribute: href
    value: /conf/xmlconfig-to-include.xml
    namespaces:
      conf: urn:activemq
      core: urn:activemq:core
      xi: "http://www.w3.org/2001/XInclude"
    pretty_print: yes

这将提供您期望的 XML。


关于你确实需要多个include的事实,诀窍是进一步专业化你的xpath表达式,例如:

/conf:configuration
  /core:core
    /xi:include[@href='/conf/xmlconfig-to-include.xml']

因此,添加三个包含节点的任务可能会陷入循环:

- name: include modular XML configuration file
  community.general.xml:
    path: namespace-test.xml
    xpath: /conf:configuration/core:core/xi:include[@href='{{ item }}']
    namespaces:
      conf: urn:activemq
      core: urn:activemq:core
      xi: "http://www.w3.org/2001/XInclude"
    pretty_print: yes
  loop:
    - /conf/addresses.xml
    - /conf/address-settings.xml
    - /conf/security-settings.xml

如果你真的想要非幂等选项,这里是:

- name: include modular XML configuration file
  community.general.xml:
    path: namespace-test.xml
    xpath: /conf:configuration/core:core
    add_children:
      - "{http://www.w3.org/2001/XInclude}include":
          href: /conf/xmlconfig-to-include.xml
    namespaces:
      conf: urn:activemq
      core: urn:activemq:core
      xi: "http://www.w3.org/2001/XInclude"
    pretty_print: yes

评论

0赞 Gullah Geechee 7/18/2022
非常感谢您的帮助。这两种选择都非常有效。但是我现在选择使用非幂等选项,因为它产生的结果更接近我正在寻找的结果。我已经在原始帖子中添加了我打算生成的 XML 文件结构的一部分。
0赞 β.εηοιτ.βε 7/18/2022
@GullahGeechee这仍然可能以幂等方式实现,请参阅上面的更新。
0赞 Gullah Geechee 7/18/2022
完美的解决方案!这是一个xpath大师班,我选择使用你的最后一个建议。幂等性是绝对的要走的路。非常感谢您抽出宝贵时间!