Ansible如何用xml模块提取node_type为apic的节点及全部属性?
问题根源
- 你使用的XPath规则
//*会匹配XML文件内所有层级的节点,包括根节点、各子属性节点,所以返回结果是零散的单个节点集合,不是按<node123>这类父节点分组的结构 - 循环对象调用错误,xml模块的匹配结果固定存储在注册变量的
matches字段内,不能直接循环注册变量本身
正确实现方案
直接在XPath阶段完成过滤,一步拿到所有符合要求的节点:
- name: 提取所有node_type为apic的节点 xml: path: "{{ playbook_dir }}/nnmconf_nnm.xml" # 该XPath规则直接匹配nodes下所有子节点中,node_type值为apic的节点 xpath: /nodes/*[node_type/text()='apic'] content: text register: apic_nodes - name: 输出符合要求的节点信息 debug: msg: 节点名称: "{{ item.keys() | first }}" 节点全部属性: "{{ item.values() | first }}" loop: "{{ apic_nodes.matches }}"
可选方案:先全量读取再过滤
如果你需要先拿到所有节点再做判断,也可以用如下写法:
- name: 读取nodes下所有子节点 xml: path: "{{ playbook_dir }}/nnmconf_nnm.xml" xpath: /nodes/* content: text register: all_nodes - name: 仅输出apic类型的节点 debug: msg: 节点名称: "{{ item.keys() | first }}" 节点全部属性: "{{ item.values() | first }}" loop: "{{ all_nodes.matches }}" # when条件不需要加{{ }},直接读取变量即可 when: (item.values() | first).node_type == 'apic'
内容的提问来源于stack exchange,提问作者MaxWasHere
相关产品推荐
相关产品推荐

