如何使用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
相关产品推荐
相关产品推荐

