Использование переменной из одного файла Ansible var во втором файле var

При использовании Ansible я пытаюсь использовать сводный файл vars для хранения частных переменных, а затем использовать их в другом файле vars в той же роли. (Идея «псевдолистового шифрования Vault» здесь .)

например У меня есть один стандартный файл vars, roles/myrole/vars/main.yml:

---
my_variable: '{{ my_variable_vaulted }}'

а затем тот, который зашифрован, roles/myrole/vars/vaulted_vars.yml:

---
my_variable_vaulted: 'SECRET!'

Но когда я запускаю playbook, я всегда получаю «ERROR! ERROR! My_variable_vaaled» is undefined ».

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


person Phil Gyford    schedule 18.02.2016    source источник


Ответы (2)


Причина, по которой my_variable_vaulted недоступна, заключалась в том, что я не включил файл переменных. Я предполагал, что все файлы в каталоге vars/ роли выбираются автоматически, но я думаю, что это только в случае с vars/main.yml.

Итак, чтобы сделать переменные из хранилища доступными для всех задач внутри роли, в roles/myrole/tasks/main.yml я добавил это перед всеми задачами:

- include_vars: vars/vaulted_vars.yml
person Phil Gyford    schedule 18.02.2016
comment
Да это правда. Только main.yml загружается для всех типов папок ролей: переменных, значений по умолчанию, задач, мета, обработчиков. - person udondan; 19.02.2016

Это не лучший способ работать с хранилищем в анзиблях. Намного лучший подход описан в документации по хранилищу для ansible. Итак, вы должны создать свою базовую переменную для среды в group_vars/all.yml следующим образом:

my_variable: {{ vault_my_variable }}

А затем в своем inventories/main вы решаете, какие хосты должны загружать, какой файл хранилища удовлетворяет этой переменной. Например, вы можете использовать это в своем inventories/main:

[production:children]
myhost1

[development:children]
myhost2

[production_vault:children]
production

[development_vault:children]
development

Затем ansible будет автоматически извлекать production_vault.yml или development_vault.yml соответственно из group_vars в зависимости от того, к какой среде принадлежит ящик. И затем вы можете использовать my_variable в своих ролях / сценариях, как и раньше, не беспокоясь о том, чтобы получить его из нужного места.

person Tymoteusz Paul    schedule 18.02.2016
comment
Это похоже на то, что я делаю, за исключением того, что файлы находятся в group_vars/, а не в роли. В настоящее время у меня нет групп, поэтому я постараюсь решить, как это изменить. - person Phil Gyford; 18.02.2016
comment
Группы @PhilGyford - отличный способ организовать ваши переменные, так как затем для изменения значений вам нужно перейти в одно место и безопасно повторно использовать их для разных ролей / сценариев. И затем он освобождает вашу роль vars и defaults для вещей, которые относятся только к этой области и ни к чему другому. - person Tymoteusz Paul; 18.02.2016
comment
Спасибо. Эти вары определенно используются только в одной роли, поэтому я поместил их туда. - person Phil Gyford; 18.02.2016
comment
Странно ... Понятия не имею, почему перемещение двух файлов var из roles/myrole/vars/ в group_vars/webservers/ заставляет все работать, но это работает! Это не кажется лучшим местом для моей установки, но если работает, значит, работает. - person Phil Gyford; 18.02.2016
comment
Возможно, я сказал слишком рано ... Я не думаю, что задачи роли сейчас учитывают какие-либо из этих переменных. Я собираюсь вернуться к этому через пару дней. - person Phil Gyford; 18.02.2016
comment
@PhilGyford, вы должны поместить их как файлы в group_vars, поэтому, следуя моему примеру, у вас будут group_vars/production_vault.yml и group_vars/production.yml - person Tymoteusz Paul; 19.02.2016
comment
Я действительно не понимаю, почему ... эти вары одинаковы для каждой группы и используются только в одной роли. Почему бы мне не поместить их в роль? - person Phil Gyford; 19.02.2016
comment
Большое спасибо! У меня возникла проблема, когда один и тот же хост был включен в две разные группы, поэтому он загружал переменные из двух разных хранилищ. Поскольку в хранилищах были одни и те же переменные, второе загруженное хранилище перезаписывало первое. Ваш ответ заставил меня осознать это, дай бог! - person Bubzsan; 14.01.2020