Ansible: добавить дополнительное поле к набору значений, уже определенных в hosts.yaml

#ansible

#ansible

Вопрос:

У меня есть следующий фрагмент кода внутри инвентаря hosts.yaml:

 ---
all:
  hosts:
    myhost:
      default_ok:
        a:
          x: default
          y: default
        b: default
        c: default
      patch_ok:
        a:
          y: patch
          z: patch
        b: patch
      default_nok:
      - a:
        - x
        - y
        c: default_c_nok
      - a:
        - x
        - y
        c: default2_c_nok
      patch_nok:
        b: patch_b_nok
 

и следующий фрагмент кода для Playbook:

 - name: test OK
  set_fact:
    default_ok: '{{ default_ok | combine(patch_ok, recursive=true) }}'
  tags: [init]

- name: debug test OK
  ansible.builtin.debug:
  loop: '{{ [default_ok] }}'
  tags: [init]

- name: test NOK
  set_fact:
    default_nok: '{{ default_nok | combine(patch_nok, recursive=true) }}'
  loop: '{{ default_nok }}'
  tags: [init]

- name: debug test NOK
  ansible.builtin.debug:
  loop: '{{ [default_nok] }}'
  tags: [init]
 

Для default_ok all выглядит хорошо:

   default_ok:
    a:
      x: default
      y: patch
      z: patch
    b: patch
    c: default
 

Журналы отладки для хорошего случая:

 TASK [sandbox : test OK] *********************************************************
ok: [myhost] => (item={'c': 'default', 'a': {'x': 'default', 'y': 'default'}, 'b': 'default'})

TASK [sandbox : debug test OK] ***************************************************
ok: [myhost] => (item={'c': 'default', 'a': {'y': 'patch', 'x': 'default', 'z': 'patch'}, 'b': 'patch'}) => {
    "msg": "Hello world!"
}
 

Для default_nok примера мы должны увидеть в debug в конце следующее:

   default_nok:
  - a:
    - x
    - y
    b: patch_b_nok
    c: default_c_nok
  - a:
    - x
    - y
    b: patch_b_nok
    c: default2_c_nok
 

НО отладка просто показывает настройку одного:

 TASK [sandbox : test NOK] *********************************************************
ok: [myhost] => (item={'c': 'default_c_nok', 'a': ['x', 'y']})
ok: [myhost] => (item={'c': 'default2_c_nok', 'a': ['x', 'y']})

TASK [sandbox : debug test NOK] ***************************************************
ok: [myhost] => (item={'c': 'default2_c_nok', 'b': 'patch_b_nok', 'a': ['x', 'y']}) => {
    "msg": "Hello world!"
}
 

Есть мысли?
Спасибо.

Комментарии:

1. Используйте combine фильтр Ansible. Смотрите, docs.ansible.com/ansible/latest/user_guide /…

2. Когда вы используете этот пример, да, это работает. Но с моими данными выше это не так. Поскольку структура отличается. Проверьте участника, а затем список пользователей ниже. Не получилось с приведенным выше примером. Примеры Ansible на docs.ansible.com работаем. Любой сокращенный код, который я мог бы попробовать?

3. Все это очень запутанно. service_a есть ли хост в вашем инвентаре. Таким образом, вы не можете использовать это имя как переменную напрямую. Meanwile hostvars['service_a'] существует и содержит словарь всех переменных, собранных или объявленных для этого хоста. Вы говорите о списке, но вы показываете пример dict, где один элемент представляет собой список, содержащий один элемент, являющийся самим dict . Какую именно переменную вы хотите перебрать? Пожалуйста, покажите реальный пример отладки вашей задачи цикла с примером выполнения. Спасибо.

4. Я снова отредактировал / перефразировал вопрос и поместил здесь примеры кода для воспроизведения. Если есть еще какие-либо вопросы, пожалуйста, дайте мне знать. Надеюсь, теперь проблема более ясна. Спасибо.