Объединение переменных в Ansible с ролями

Объединение переменных в Ansible с ролями

Я настраиваю свою среду следующим образом:

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

Примечание: Чтобы объединить списки, см.решение.

Связанный контент