Рейтинг:1

Слияние двух словарей по ключу в Ansible

Я ищу помощь в объединении двух словарей определенным образом. Буду очень благодарен за любые мысли.

У меня есть два таких словаря: 1-й дикт:

серверы:
  сервер1:
    Свойство1: А
    Свойство2: Б
    Свойство3: С
  сервер2:
    Свойство1: А
    Свойство2: Б
    Свойство3: С

2-й дикт:

управление:
  сервер1: ip1_addr
  сервер2: ip2_addr

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

серверы:
  сервер1:
    Свойство1: А
    Свойство2: Б
    Свойство3: С
    Свойство4: ip1_addr
  сервер2:
    Свойство1: А
    Свойство2: Б
    Свойство3: С
    Свойство4: ip2_addr

Или, возможно, я выбрал неправильный путь, все, что мне нужно, это перебрать два словаря за один раз, чтобы получить ip1_addr под ключом server1 и ip2_addr под ключом server2.

Рейтинг:2
флаг br

Преобразовать словарь управление первый

    - set_fact:
        mgmt: "{{ mgmt|d({})|combine({item.key: {'Property4': item.value}}) }}"
      цикл: "{{управление|dict2items}}"

дает

  управление:
    сервер1:
      Свойство4: ip1_addr
    сервер2:
      Свойство4: ip2_addr

затем комбинировать словари

    - set_fact:
        серверы: "{{ серверы|объединить(mgmt, recursive=True) }}"

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

  серверы:
    сервер1:
      Свойство1: А
      Свойство2: Б
      Свойство3: С
      Свойство4: ip1_addr
    сервер2:
      Свойство1: А
      Свойство2: Б
      Свойство3: С
      Свойство4: ip2_addr

Если вы хотите повторить результат, проще преобразовать оба словаря в списки.

    - set_fact:
        mgmt: "{{ mgmt|d([]) + [{'сервер': item.key,
                                 'Свойство4': item.value}] }}"
      цикл: "{{управление|dict2items}}"

    - set_fact:
        srvs: "{{ srvs|d([]) + [{'сервер': item.key}|combine(item.value)] }}"
      цикл: "{{серверы|dict2items}}"

дайте

  управление:
  - Свойство4: ip1_addr
    сервер: сервер1
  - Свойство4: ip2_addr
    сервер: сервер2

  срвс:
  - Свойство1: А
    Свойство2: Б
    Свойство3: С
    сервер: сервер1
  - Свойство1: А
    Свойство2: Б
    Свойство3: С
    сервер: сервер2

Затем используйте Сообщество.Общее фильтр lists_mergeby

    - отладка:
        msg: "{{ srvs|lists_mergeby(mgmt, 'сервер') }}"

дает

  сообщение:
  - Свойство1: А
    Свойство2: Б
    Свойство3: С
    Свойство4: ip1_addr
    сервер: сервер1
  - Свойство1: А
    Свойство2: Б
    Свойство3: С
    Свойство4: ip2_addr
    сервер: сервер2

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.