如何用Ansible将字典id转为IP列表键并去除key/value字段?
需求与问题
我有如下字典列表:
"some_dict": [ { "ips": [ "10.10.11.20", "10.10.11.21" ], "id": "11111aaaaa" }, { "ips": [ "10.10.11.22", "10.10.11.23" ], "id": "22222bbbbb" }, { "ips": [ "10.10.11.25", "10.10.11.24" ], "id": "33333ccccc" }, { "ips": [ "10.10.11.26", "10.10.11.27" ], "id": "44444ddddd" } ]
需要将其重构为每个元素以id值为键、对应ips列表为值的字典,目标格式如下:
"some_dict": [ { "11111aaaaa": [ "10.10.11.20", "10.10.11.21" ] }, { "22222bbbbb": [ "10.10.11.22", "10.10.11.23" ] }, { "33333ccccc": [ "10.10.11.25", "10.10.11.24" ] }, { "44444ddddd": [ "10.10.11.26", "10.10.11.27" ] } ]
我尝试用json_query和JMESPath实现,代码如下:
- name: do something good set_fact: something_good: "{{ dict(some_dict|json_query(member_id_local_ips)) }}" vars: member_id_local_ips: > [].[member_id,local_ip|[]] - debug: var=something_good|dict2items
得到的结果包含key和value字段,不符合目标格式:
"something_good|dict2items": [ { "key": "11111aaaaa", "value": [ "10.10.11.20", "10.10.11.21" ] }, { "key": "22222bbbbb", "value": [ "10.10.11.22", "10.10.11.23" ] }, { "key": "33333ccccc", "value": [ "10.10.11.25", "10.10.11.24" ] }, { "key": "44444ddddd", "value": [ "10.10.11.26", "10.10.11.27" ] } ]
需要去掉结果中的key和value字段,得到目标格式。
解决方案
可以通过JMESPath的计算键语法直接生成目标结构,无需先转字典再处理。修改后的Playbook如下:
- name: 生成目标格式数据 set_fact: something_good: "{{ some_dict | json_query('[].{[id]: ips}') }}" - debug: var=something_good
关键说明
- JMESPath表达式
[].{[id]: ips}的作用:[]遍历原列表的所有元素{[id]: ips}使用元素的id值作为动态键,ips列表作为对应的值,这里的[id]是JMESPath的计算键语法,支持用字段值作为字典键。
- 另外你之前的表达式里用了
member_id和local_ip,但原数据字段是id和ips,这也是需要修正的错误点。
执行后得到的结果完全符合目标格式:
"something_good": [ { "11111aaaaa": [ "10.10.11.20", "10.10.11.21" ] }, { "22222bbbbb": [ "10.10.11.22", "10.10.11.23" ] }, { "33333ccccc": [ "10.10.11.25", "10.10.11.24" ] }, { "44444ddddd": [ "10.10.11.26", "10.10.11.27" ] } ]
内容的提问来源于stack exchange,提问作者piercjs
相关产品推荐
相关产品推荐

