Ansible中如何将JSON查询结果转换为以node_name为顶层键的对象
Ansible实现节点列表转目标字典结构方案
两种实现方式,均不需要安装额外自定义插件:
适配现有json_query用法的简洁写法
你已经在使用json_query过滤器,可以直接在数据处理阶段调整输出结构,配合items2dict过滤器一步生成结果,不需要循环:
set_fact: # 先把每个节点转成key为节点名、value为剩余属性的结构,再直接转字典 my_nodes_dict: "{{ my_nodes | map('json_query', '{"key": node_name, "value": {"node_id": node_id, "pod_id": pod_id}}') | items2dict }}"
这种写法适配Ansible 2.10及以上版本,逻辑清晰,和你现有代码的使用习惯一致。
全版本兼容的循环合并写法
如果你的Ansible版本低于2.10,或者更习惯用combine过滤器,可以通过循环逐次合并字典,这也是你之前使用combine时没有写对的正确用法:
set_fact: my_nodes_dict: "{{ my_nodes_dict | default({}) | combine({ item.node_name: { 'node_id': item.node_id, 'pod_id': item.pod_id } }) }}" loop: "{{ my_nodes }}"
之前combine没达到预期,是因为直接把整个列表传入了过滤器,combine的作用是合并多个字典,需要逐次传入单个节点对应的单键值对,才能累加出目标结构。
执行任意一种写法后,得到的my_nodes_dict结构完全匹配你的预期:
{ "node01": { "node_id": "1", "pod_id": "1" }, "node02": { "node_id": "2", "pod_id": "1" }, "node03": { "node_id": "3", "pod_id": "1" } }
内容的提问来源于stack exchange,提问作者O.K.
相关产品推荐
相关产品推荐

