Назад | Перейти на главную страницу

Перебрать продукт из двух списков словарей (Ansible / Jinja2)

У меня есть два списка словарей, и я хотел бы просмотреть декартово произведение как один. Как мне это сделать.

образец данных:

environments: [
                {title: outdoors, climate: variable},
                {title: indoors, climate: steady}
              ],
colorscheme:  [
                {top: blue, bottom: red},
                {top: pink, bottom: green}
              ]

желаемый результат:

item: [
        {title: outdoors, climate: variable, top: blue, bottom: red},
        {title: indoors, climate: steady, top: blue, bottom: red},
        {title: outdoors, climate: variable, top: pink, bottom: green},
        {title: indoors, climate: steady, top: pink, bottom: green}
      ]

Я пробовал выражение "{{ environments|product(colorscheme)|list }}" что приближает меня, но не совсем то, что я хочу.

Результаты выражения:

item: [
        [
          {title: outdoors, climate: variable}, 
          {top: blue, bottom: red}
        ],
        [
          {title: indoors, climate: steady},
          {top: blue, bottom: red}
        ],
        [
           {title: outdoors, climate: variable},
           {top: pink, bottom: green}
        ],
        [
           {title: indoors, climate: steady},
           {top: pink, bottom: green}
        ]
      ]

Вот один из способов сделать это. Не уверен, что это лучший eway.

- hosts: localhost
  gather_facts: no
  vars:
    envs:
    - title: outdoors
      climate: variable
    - title: indoors
      climate: steady
    colorscheme:
    - top: blue
      bottom: red
    - top: pink
      bottom: green
  tasks:
  - debug:
      msg: >
        [
        {% for e in envs %}
        {% for c in colorscheme %}
        {{ e | combine (c) }},
        {% endfor %}
        {% endfor %}
        ]


# TASK [debug] **************************************************************************************************[3/1813$
# ok: [localhost] => {
#     "msg": [
#         {
#             "bottom": "red",
#             "climate": "variable",
#             "title": "outdoors",
#             "top": "blue"
#         },
#         {
#             "bottom": "green",
#             "climate": "variable",
#             "title": "outdoors",
#             "top": "pink"
#         },
#         {
#             "bottom": "red",
#             "climate": "steady",
#             "title": "indoors",
#             "top": "blue"
#         },
#         {
#             "bottom": "green",
#             "climate": "steady",
#             "title": "indoors",
#             "top": "pink"
#         }
#     ]
# }
#