#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
есть ли хост в вашем инвентаре. Таким образом, вы не можете использовать это имя как переменную напрямую. Meanwilehostvars['service_a']
существует и содержит словарь всех переменных, собранных или объявленных для этого хоста. Вы говорите о списке, но вы показываете пример dict, где один элемент представляет собой список, содержащий один элемент, являющийся самим dict . Какую именно переменную вы хотите перебрать? Пожалуйста, покажите реальный пример отладки вашей задачи цикла с примером выполнения. Спасибо.4. Я снова отредактировал / перефразировал вопрос и поместил здесь примеры кода для воспроизведения. Если есть еще какие-либо вопросы, пожалуйста, дайте мне знать. Надеюсь, теперь проблема более ясна. Спасибо.