Как передать в Ansible переменную, которая в себе содержит переменную?

  • 22 августа 2023 г. 18:26
Ответы на вопрос 3
В данном случае вы используете модуль `include_role` для включения роли `db` и передачи переменных. Однако, вам также необходимо передать переменные из файла `vars/main.yml`, чтобы роль `db` имела к ним доступ. 

Чтобы решить эту проблему, вы можете использовать модуль `include_vars`, который позволяет включить переменные из файла в текущий контекст выполнения. 

Вот как вы можете изменить ваш код:

```yaml
- name: Включить переменные
  include_vars:
    file: vars/main.yml

- name: Создать базу данных
  include_role:
    name: db
  vars:
    db_name: "{{ db_name }}"
```

Здесь мы сначала используем модуль `include_vars` для включения переменных из файла `vars/main.yml` в текущий контекст выполнения. Затем мы использовали модуль `include_role` для включения роли `db`, передавая переменную `db_name`, которую мы определили из включенного файла `vars/main.yml`.

Теперь роль `db` будет иметь доступ к этой переменной и сможет использовать ее при создании базы данных.
У Ansible есть приоритет переменных, и в данном случае вы пытаетесь вынести переменную ниже, чем roles/role_name/vars/main.yml. Самое вероятно, что вы пытаетесь вынести эту переменную в host_vars или group_vars, что имеет смысл, но недостаточно, поскольку файл roles/role_name/vars/main.yml имеет более высокий приоритет. Решение этой проблемы может быть следующим: измените название каталога в роли с vars на defaults, или переместите только эту переменную в файл defaults, поскольку у него наименьший приоритет и он будет переопределен, если переменная объявлена в любом другом месте.
У Ansible есть приоритет переменных. Если вы хотите вынести переменную, то учтите, что она будет иметь меньший приоритет, чем переменные, определенные в файле roles/role_name/vars/main.yml. Возможно, вы пытаетесь вынести переменную в host_vars или group_vars, что логично, но это может быть недостаточно, потому что переменная в файле roles/role_name/vars/main.yml будет иметь больший приоритет. Для решения этой проблемы, я рекомендую использовать файл roles/role_name/defaults/main.yml, так как он имеет наименьший приоритет, и переменная будет переопределена, если она определена где-либо еще. В вашем случае, просто переименуйте каталог с vars на defaults или переместите только эту переменную в defaults.
Похожие вопросы