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

如何用单行Ansible过滤器从嵌套字典列表提取指定WAF IP

单行实现从指定DNS Zone中提取waf的IP地址(Ansible)

Hey,针对你想要把分步的Ansible任务改成单行实现的需求,这里有两种简洁的方案,都能直接从你的YAML输入里提取到指定Zone中name为waf的IP地址,不需要遍历列表或者分步设置fact:

方式一:使用selectattr+map链式过滤

把原来的两步逻辑合并成一条链式处理语句,直接拿到结果:

- debug:
    var: myzone.dns_records | selectattr('zone', 'equalto', 'site9.poc.acd.xyz.in.') | map(attribute='a') | flatten | selectattr('name', 'equalto', 'waf') | map(attribute='ip') | first

逐段解释:

  • selectattr('zone', 'equalto', 'site9.poc.acd.xyz.in.'):先从dns_records列表里筛选出目标Zone对应的条目
  • map(attribute='a'):提取该条目下的A记录列表字段a
  • flatten:将map返回的嵌套列表展开成一维,方便后续筛选
  • selectattr('name', 'equalto', 'waf'):在A记录列表中筛选出名称为waf的条目
  • map(attribute='ip'):提取该条目的IP地址字段
  • first:取出唯一的结果值

方式二:使用json_query(更紧凑的路径表达式)

如果你的Ansible环境已经安装了jmespath库(支持json_query过滤器),可以用更简洁的JMESPath路径来实现:

- debug:
    var: myzone | json_query('dns_records[?zone==`site9.poc.acd.xyz.in.`].a[?name==`waf`].ip | [0][0]')

路径解释:

  • dns_records[?zone==site9.poc.acd.xyz.in.]:定位到Zone匹配的DNS记录条目
  • .a[?name==waf].ip:从该条目的A记录中筛选出name为waf的项,并提取其ip值
  • | [0][0]:由于查询结果是嵌套列表格式([[172.13.12.11]]),通过这一步取出最内层的单个IP字符串

两种方案运行后都会输出你需要的结果:172.13.12.11,和你原来的分步方案效果完全一致,但代码更简洁紧凑。

内容的提问来源于stack exchange,提问作者user12813780

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 12:27:52