Ansible Playbook中使用parse_xml解析XML数据无返回结果的问题求助
问题原因分析及解决方法
你遇到的核心问题是**XML命名空间(XML Namespaces)**没有被正确处理,导致parse_xml模块无法匹配到目标节点,所以返回空的result数组。
具体原因拆解
你的XML数据包含两个关键的命名空间:
- 根节点
<data>的默认命名空间:urn:ietf:params:xml:ns:netconf:base:1.0 <ntp>节点及其子节点的专属命名空间:http://cisco.com/ns/yang/Cisco-IOS-XR-ip-ntp-oper
parse_xml模块的路径匹配不会自动识别命名空间,你之前的spec文件直接用data/ntp/nodes/node/associations这种无前缀路径,相当于在无命名空间的XML里查找节点,自然找不到任何匹配结果。
解决方法:在spec文件中添加命名空间映射
修改你的iosxr_ntp.yaml spec文件,添加命名空间定义,并在所有路径前加上对应的前缀:
--- # 新增命名空间映射,给不同的命名空间定义简短前缀 namespaces: nc: urn:ietf:params:xml:ns:netconf:base:1.0 ntp: http://cisco.com/ns/yang/Cisco-IOS-XR-ip-ntp-oper vars: ntp_peers: address: "{{ item.address }}" reachability: "{{ item.reachability}}" keys: result: value: "{{ ntp_peers }}" # 所有节点路径都加上对应命名空间前缀 top: nc:data/ntp:ntp/ntp:nodes/ntp:node/ntp:associations items: address: ntp:peer-summary-info/ntp:peer-info-common/ntp:address reachability: ntp:peer-summary-info/ntp:peer-info-common/ntp:reachability
关键修改点说明
namespaces块:给两个命名空间分别定义了nc(对应netconf基础命名空间)和ntp(对应Cisco XR的ntp操作命名空间)两个前缀,方便在路径中引用。top路径:nc:data指定根节点属于netconf命名空间,后续的ntp:ntp、ntp:nodes等节点都属于Cisco的ntp命名空间,必须加上前缀才能匹配。items路径:所有子节点(比如peer-summary-info、address)都属于ntp命名空间,所以也要加上ntp:前缀。
验证效果
修改完成后重新运行playbook,parsed_ntp_data.result应该会返回包含两个NTP peer的数组,每个元素包含address和reachability字段,类似下面的结构:
"parsed_ntp_data": { "result": [ { "address": "10.1.1.1", "reachability": "0" }, { "address": "172.16.252.29", "reachability": "255" } ] }
内容的提问来源于stack exchange,提问作者rev_it_up




