把三份字典清单合并起来



在我的剧本中,我从多个来源收集应用程序的事实,最终得到3个(或更多)列表,每个列表都有一个dict。

有没有办法把这样的结构组合成一个字典列表。如果没有,关于我需要如何更改数据结构,有什么建议吗?

我的代码试图组合2个dict列表(即使在最终用例中也会有3个或更多)。

所有war_*列表都应该有相同数量的字典,关键字为"app_name",只是我们任意选择war_time作为迭代器,而app_name在所有中都很常见

- hosts: localhost
vars:
war_status:
- app_name: app1-SNAPSHOT
app_status: running
- app_name: app2
app_status: stopped
- app_name: app3-jsf
app_status: unknown
war_time:
- app_name: app1-SNAPSHOT
app_time: '2017-07-07 06:38:30'
- app_name: app2
app_time: '2018-07-19 09:16:57'
- app_name: app3-jsf
app_time: '2019-07-21 06:00:57'
war_proxy_status:
- app_name: app1-SNAPSHOT
app_where_found: inst1
- app_name: app2
app_where_found: inst2
- app_name: app3-jsf
app_where_found: inst3
tasks:
- set_fact:
war_combined: []
- name: combine1 war_status and war_time
set_fact:
war_combined: "{{ war_combined | default([]) + [ war_status | combine( item ) ] }}"
loop: "{{ war_time }}"
- debug:
msg: "{{ war_combined }}"

我想达到的结果是:

war_combined:
- app_name: app1-SNAPSHOT
app_status: running
app_time: '2017-07-07 06:38:30'
app_where_found: inst1
- app_name: app2
app_status: stopped
app_time: '2018-07-19 09:16:57'
app_where_found: inst2
- app_name: app3-jsf
app_status: unknown
app_time: '2019-07-21 06:00:57'
app_where_found: inst3

您应该组合单个元素,但您尝试将单个项目合并到整个列表中。

像这样:

- set_fact:
war_combined: >-
{{ war_combined | default([])
+ [item | combine(time_item) | combine(proxy_item)]
}}
vars:
time_item: >-
{{ war_time
| selectattr('app_name','equalto',item['app_name'])
| list
| first
}}
proxy_item: >-
{{ war_proxy_status
| selectattr('app_name','equalto',item['app_name'])
| list
| first
}}
loop: "{{ war_status }}"

我们在war_status上循环,并使用针对每次迭代评估的辅助变量time_itemproxy_item,从app_name与当前项的app_name匹配的列表中选择特定元素。

最新更新