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

Ansible:从字典列表中提取每个字典的指定键值

Ansible:从字典列表中提取每个字典的指定键值

嘿,我懂你这种困扰——面对一大串结构一致的字典列表,手动循环挨个取ip值不仅麻烦,数据量大的时候效率也不高。其实Ansible里有几个现成的高效过滤器可以直接搞定这个需求,不用写循环!

方法一:用map+attribute过滤器(直观易用)

这个方法是最直接的,专门用来从列表的每个元素中提取指定属性值。针对你的数据结构,你可以这么写:

- name: 提取所有子网IP
  debug:
    msg: "{{ current | map(attribute='fvSubnet.attributes.ip') | list }}"

简单解释下:

  • map(attribute='fvSubnet.attributes.ip')会遍历current列表里的每一个字典,自动沿着fvSubnet -> attributes -> ip的路径取出对应的值
  • 最后用list把处理后的结果转换成一个标准列表,方便后续使用

方法二:用json_query过滤器(灵活强大)

如果你需要处理更复杂的嵌套结构查询,或者之后要加筛选条件,json_query会更适合,它用的是JMESPath查询语法。针对你的场景,代码如下:

- name: 用JMESPath提取IP
  debug:
    msg: "{{ current | json_query('[*].fvSubnet.attributes.ip') }}"

这里的[*]表示遍历列表中的所有元素,后面的.fvSubnet.attributes.ip就是要提取的字段路径,一行代码就能拿到所有IP。

额外小技巧

如果你的列表里有重复的IP,还可以结合unique过滤器去重:

msg: "{{ current | map(attribute='fvSubnet.attributes.ip') | list | unique }}"

要是只想提取满足特定条件的IP(比如包含某段地址),可以再加个select过滤器:

msg: "{{ current | map(attribute='fvSubnet.attributes.ip') | select('search', '114.66.*') | list }}"

这两种方法都比手动循环高效得多,Ansible的过滤器都是经过优化的,处理大列表时性能优势很明显,而且代码更简洁易读~

备注:内容来源于stack exchange,提问作者Jolan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.17 10:54:40