Преобразовать вложенный список диктов для диктовки в Ansible - PullRequest
0 голосов
/ 06 ноября 2019

Я пытаюсь преобразовать список словаря в словарь. Мои определенные переменные:

  users:
  - name: bruce
    age: 22
    params:
      - key: "k1"
        value: "v1bruce"
      - key: "k2"
        value: "v2bruce"
  - name: alan
    age: 25
    params:
      - key: "k1"
        value: "v1alan"
      - key: "k5"
        value: "v5alan"
  - name: carl
    age: 43
    params:
      - key: "k1"
        value: "v1carl"
      - key: "k2"
        value: "v2carl"
      - key: "k5"
        value: "v5carl"

Мне нужно создать новую структуру в Ansible, начиная с предыдущего преобразования параметров в словари, как показано ниже:

  employee:
  - name: bruce
    age: 22
    params:
      "k1": "v1bruce"
      "k2": "v2bruce"
  - name: alan
    age: 25
    params:
      "k1": "v1alan"
      "k5": "v5alan"
  - name: carl
    age: 43
    params:
      "k1": "v1carl"
      "k2": "v2carl"
      "k5": "v5carl"

Ключевым моментом является то, что я надеваюНе знаю, сколько элементов составлен мой стартовый список. Является ли это возможным? Спасибо.

Ответы [ 2 ]

0 голосов
/ 06 ноября 2019

Используйте items2dict в цикле. Например

- set_fact:
    employee: "{{ employee|default([]) +
                  [{'name': item.name,
                    'age': item.age,
                    'params': item.params|items2dict}] }}"
  loop: "{{ users }}"
0 голосов
/ 06 ноября 2019

Предупреждение: уродливое решение впереди.

Основа для понимания состоит в том, что ваш params выглядит как преобразование диктата с помощью фильтра dict2items. Поэтому мы должны отменить операцию с помощью items2dict. Но поскольку он вложен в ваш список хэшей, это не так просто. Вот что я придумал:

---
- hosts: localhost
  gather_facts: False

  vars:
    users:
      - name: bruce
        age: 22
        params:
          - key: "k1"
            value: "v1bruce"
          - key: "k2"
            value: "v2bruce"
      - name: alan
        age: 25
        params:
          - key: "k1"
            value: "v1alan"
          - key: "k5"
            value: "v5alan"
      - name: carl
        age: 43
        params:
          - key: "k1"
            value: "v1carl"
          - key: "k2"
            value: "v2carl"
          - key: "k5"
            value: "v5carl"

  tasks:
    - name: Show raw
      debug:
        var: users

    - name: Transform
      set_fact:
        user_transformed: >-
          {%- set result = [] -%}
          {%- for user in users -%}
            {{
              result.append({
                 'name': user.name,
                 'age': user.age,
                 'params': user.params | items2dict
               })
            }}
          {%- endfor -%}
          {{ result | to_json | from_json }}

    - name: Show transformed
      debug:
        var: user_transformed
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...