如何用单行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记录列表字段aflatten:将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
相关产品推荐
相关产品推荐

