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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 10:48:03