Ansible使用xml模块提取节点名时报'dict object' has no attribute 'key'错误
问题解决方法
根因说明
nodes.matches返回的每一个元素都是单键字典,结构为
{节点名: 空字典},你之前的写法错误点如下:
item.key是尝试读取字典中名为key的键,你的字典无此键,因此报错item.keys未加括号,输出的是字典keys()方法的对象本身,而非执行方法后返回的键列表
直接修复方案
单元素循环提取
修改调试任务如下即可直接拿到节点名字符串:
- name: debugging debug: msg: "{{ item.keys() | first }}" loop: "{{ nodes.matches }}" delegate_to: localhost
批量提取为列表
如果需要把所有符合条件的节点名一次性存入列表变量,可以用set_fact批量处理:
- name: 提取所有node_type为apic的节点名 set_fact: apic_node_list: "{{ nodes.matches | map('keys') | map('first') | list }}" delegate_to: localhost
后续使用{{ apic_node_list }}即可直接得到["switch2"]格式的节点名列表。
补充说明
你当前的XPath规则/nodes/*[node_type='apic']是匹配子节点node_type值为apic的节点,按照你给出的XML示例,匹配结果应该是switch2,如果得到的是switch1请检查实际XML文件的节点值是否和示例一致。
替代方案
如果不需要使用xml模块,也可以通过shell调用xmllint命令提取,写法参考:
- name: 通过xmllint提取节点名 shell: "xmllint --xpath '/nodes/*[node_type=\"apic\"]/name()' /nodes.xml" register: shell_nodes delegate_to: localhost
执行后{{ shell_nodes.stdout_lines }}即为匹配的节点名列表。
内容的提问来源于stack exchange,提问作者MaxWasHere
相关产品推荐
相关产品推荐

