Я настраиваю свою среду следующим образом:
inventory.yml
all:
children:
production:
1.2.3.4
staging:
1.2.3.5
В group_vars/all.yml я настраиваю хэш пользователей, которые будут добавлены в плейбук. Я хотел бы иметь возможность добавлять пользователей специально в group_vars/staging.yml, которые будут объединены с той же настройкой в моем group_vars/all.yml.
Есть ли в этом случае правильный способ объединить хэш или объявить наследование?
решение1
ВидетьDEFAULT_HASH_BEHAVIOUR. Цитата
«Эта настройка управляет тем, как переменные объединяются в Ansible. По умолчанию Ansible переопределяет переменные в определенном порядке приоритета, как описано в разделе Переменные. Когда переменная с более высоким приоритетом побеждает, она заменяет другое значение. Некоторые пользователи предпочитают, чтобы переменные, которые являются хэшами (т. е. «словарями» в терминах Python), объединялись. Эта настройка называется «слияние». ...»
Например, учитывая инвентарь иgroup_vars
shell> cat hosts
all:
children:
production:
hosts:
1.2.3.4
staging:
hosts:
1.2.3.5
shell> cat group_vars/all.yml
users:
admin:
shell: /bin/bash
ansible:
shell: /bin/sh
shell> cat group_vars/production/users.yml
users:
dealer:
shell: /usr/sbin/nologin
shell> cat group_vars/staging/users.yml
users:
tester:
shell: /bin/bash
Пособие
shell> cat pb.yml
- hosts: all
tasks:
- debug:
var: users
по умолчанию переопределяет словари. Дает (сокращенно)
shell> ansible-playbook pb.yml
TASK [debug] ****
ok: [1.2.3.4] =>
users:
dealer:
shell: /usr/sbin/nologin
ok: [1.2.3.5] =>
users:
tester:
shell: /bin/bash
КогдаANSIBLE_HASH_BEHAVIOURнастроен на объединение словарей, которые дает руководство (сокращенно)
shell> ANSIBLE_HASH_BEHAVIOUR=merge ansible-playbook pb.yml
TASK [debug] ****
ok: [1.2.3.4] =>
users:
admin:
shell: /bin/bash
ansible:
shell: /bin/sh
dealer:
shell: /usr/sbin/nologin
ok: [1.2.3.5] =>
users:
admin:
shell: /bin/bash
ansible:
shell: /bin/sh
tester:
shell: /bin/bash
Эта настройка будетустаревшийв 2.13.
ЦитируяУстаревшая деталь
«Эта функция хрупкая и непереносимая, что приводит к постоянной путанице и неправильному использованию»
ЦитируяУстаревшие альтернативы
"объединить фильтр явно"
Например, переименуйте общий словарь пользователей впользователи_все
shell> cat group_vars/all.yml
users_all:
admin:
shell: /bin/bash
ansible:
shell: /bin/sh
Затем фильтробъединитьобъединяет словари
shell> cat pb.yml
- hosts: all
tasks:
- debug:
var: users_all|combine(users)
дает (сокращенно)
shell> ansible-playbook pb.yml
TASK [debug] ****
ok: [1.2.3.4] =>
users_all|combine(users):
admin:
shell: /bin/bash
ansible:
shell: /bin/sh
dealer:
shell: /usr/sbin/nologin
ok: [1.2.3.5] =>
users_all|combine(users):
admin:
shell: /bin/bash
ansible:
shell: /bin/sh
tester:
shell: /bin/bash
Примечание: Чтобы объединить списки, см.решение.