Как передать хранилище (переменную хранилища) нескольким ролям, где сами роли имеют несколько зависимых ролей?

Я запускаю ansible 2.7.10, и у меня есть сборник пьес, в который я «включаю» разные роли в разные пьесы. Все роли, которые я называю, имеют общие зависимые роли.

Сейчас я нахожусь на том этапе, когда хочу, чтобы все роли в этой пьесе читали хранилище.

Это работает, если я передаю файл как дополнительную переменную ( -e @ )

- name: main playbook - play 1
  hosts: hosts1
  vars_files:
  - "<path_to_universal_vault>"
  tasks:
  - include_role:
      name: role1

- name: main playbook - play 2
  hosts: hosts2
  vars_files:
  - "<path_to_universal_vault>"
  tasks:
  - include_role:
      name: role2

И роль1, и роль2 имеют зависимые роли:

- role: role_a
- role: role_b
- role: role_c

Я прочитал здесь, что могу включить хранилище в "vars" для главной роли. Есть ли способ для зависимых ролей наследовать переменные (в данном случае хранилище) от основной роли?


person shackledmystic    schedule 03.07.2019    source источник


Ответы (1)


Прежде всего, мы должны начать с создания ./vault/main.yml из корня вашего проекта и добавления туда секрета:

my_vault_secret: "It works!"

Затем, вариант A, чтобы включить переменные хранилища с основной ролью, которая будет выделена во время выполнения playbook, создайте ./roles/role1/default/main.yml и добавьте свою переменную, которая будет ссылаться на секрет:

my_vault_var: "{{ my_vault_secret }}"

Затем используйте my_vault_var в role_a, role_b, role_c.

Или, вариант B, сохраните ./vault/main.yml со всеми вашими секретами, включая те, которые использовались в role_a, role_b, role_c, но вместо использования default/main.yml включите файл хранилища непосредственно в playbook вы используете для выполнения задач в role1 и role2:

- hosts: localhost
  connection: local

  vars_files:
    - "vault/main.yml"

  roles:
    - role1
    - role2
PLAY [localhost] *******************************************************************************************************************************************************************************************

TASK [role_a : debug] ****************************************************************************************************************************************************************************
ok: [localhost] => {
    "msg": "It works!"
}

Структура проекта будет выглядеть так, где defaults необходим только для варианта A:

my_ansible_repo
|-- group_vars
    |-- main.yml
|-- vault
    |-- main.yml
|-- roles
    |-- role1
        |-- defaults
            |-- main.yml
        |-- tasks
            |-- main.yml
        |-- meta  
            |-- main.yml
    |-- role_a
        |-- tasks
            |-- main.yml
|-- my_playbook.yml

Подробнее о переменных Ansible по умолчанию в официальной документации здесь и об использовании файлов переменных с плейбуками здесь.

person Cristi Dascalu    schedule 03.07.2019
comment
Добавление к комментарию выше, поскольку я не мог его отредактировать (извините, я новичок!): Я надеялся избежать добавления хранилища к каждой роли, которую я использую, и вместо этого определить его универсально. Я использую более новый синтаксис для использования ролей в соответствии с доступной документацией. Следовательно, include_role. Интересно, действительно ли это имеет значение. - person shackledmystic; 03.07.2019
comment
@shackledmystic в обеих ситуациях, которые я описал, у вас должен быть только один файл хранилища, который находится в каталоге ./vault/, а не внутри каталогов отдельных ролей. Я обновил свой ответ, чтобы сделать его более понятным. - person Cristi Dascalu; 03.07.2019