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

如何使用Ansible XML模块设置命名空间及命名空间元素

问题:用Ansible正确修改Libvirt网络XML,添加dnsmasq命名空间元素

原XML内容

<network>
  <name>docker-machines</name>
  <uuid>ea91ff7c-aa2b-4fa9-b59d-d1fae70285ad</uuid>
  ...
</network>

目标XML内容

<network xmlns:dnsmasq='http://libvirt.org/schemas/network/dnsmasq/1.0'>
  <name>docker-machines</name>
  <uuid>ea91ff7c-aa2b-4fa9-b59d-d1fae70285ad</uuid>
  ...
  <dns>
    <forwarder addr='5.1.66.255'/>
  </dns>
  <dnsmasq:options>
    <dnsmasq:option value='dhcp-option=option:ntp-server,10.10.14.1'/>
  </dnsmasq:options>
</network>

已成功的配置(添加DNS转发)

我已经通过以下Ansible任务成功配置了<dns><forwarder>元素:

- name: Set resolver for docker-machines network
  xml:
    path: /etc/libvirt/qemu/networks/docker-machines.xml
    xpath: /network/dns
    set_children:
      - forwarder:
          addr: 8.8.8.8

失败的尝试(添加dnsmasq命名空间元素)

但在创建带命名空间的元素时遇到问题,尝试了以下配置,不仅没能在<network>上正确设置命名空间,还生成了奇怪的<ns0:>元素:

- name: Set ntp server for docker-machines network dhcp
  xml:
    path: /etc/libvirt/qemu/networks/docker-machines.xml
    xpath: /network/dnsmasq:options/dnsmasq:option
    namespaces:
      dnsmasq: http://libvirt.org/schemas/network/dnsmasq/1.0
    attribute: value
    value: "dhcp-option=option:ntp-server,10.10.14.1"

请问该如何正确实现需求?


解决方案

要正确添加dnsmasq命名空间和对应的元素,需要分两步操作:先给<network>根节点添加命名空间声明,再创建带命名空间的子元素。

步骤1:添加dnsmasq命名空间到节点

- name: Add dnsmasq namespace to docker-machines network
  xml:
    path: /etc/libvirt/qemu/networks/docker-machines.xml
    xpath: /network
    add_children:
      - "#namespace":
          prefix: dnsmasq
          uri: "http://libvirt.org/schemas/network/dnsmasq/1.0"

步骤2:创建dnsmasq:options和dnsmasq:option元素

- name: Add dnsmasq options for NTP server
  xml:
    path: /etc/libvirt/qemu/networks/docker-machines.xml
    xpath: /network
    set_children:
      - dnsmasq:options:
          dnsmasq:option:
            value: "dhcp-option=option:ntp-server,10.10.14.1"
    namespaces:
      dnsmasq: http://libvirt.org/schemas/network/dnsmasq/1.0

关键说明

  • 第一步用#namespace特殊语法给根节点添加命名空间前缀和URI,确保<network>节点正确带上xmlns:dnsmasq属性。
  • 第二步必须指定namespaces映射,让Ansible识别dnsmasq前缀对应的命名空间URI,这样生成的元素会使用指定前缀,而非自动生成的ns0:。
  • set_children默认会合并现有子元素,不会覆盖已配置的<dns>或其他节点内容。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 22:13:14