ansible - 组合三个字典列表

Mar*_*n P 1 dictionary ansible

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

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

我的代码试图组合2 个字典列表(即使在最终用例中也会有 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 }}"
Run Code Online (Sandbox Code Playgroud)

我想达到的结果是:

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
Run Code Online (Sandbox Code Playgroud)

Kon*_*rov 7

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

像这样:

- 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 }}"
Run Code Online (Sandbox Code Playgroud)

我们循环war_status并使用辅助变量,time_itemproxy_item为每次迭代评估这些变量,从列表中选择与app_name当前项目匹配的app_name.