Как использовать существующие файлы Vault в Ansible Tower?
Я хочу импортировать существующие запасы, которые я ранее использовал с Ansible (автономно), включая group_vars и файлы хранилища, в Ansible Tower (3.2.0).
Тем не менее, это не работает, когда файлы Vault вступают в игру. После того, как я настроил учетные данные файла пароля Vault и создал инвентаризацию, используя тип источника "Источник из проекта", я не могу выбрать учетные данные Vault в разделе "Сведения об источнике".
Когда я вставляю его вручную и сохраняю источник, синхронизация завершается с ошибкой:
1.735 INFO Updating inventory 10: TEST
1.753 DEBUG Using system install of ansible-inventory CLI: /usr/bin/ansible-inventory
1.753 INFO Reading Ansible inventory source: /var/lib/awx/projects/_6__ansible_master/inventories/test/hosts
1.754 DEBUG Using private credential data in '/tmp/awx_123_LXUj9p'.
1.755 DEBUG Using fresh temporary directory '/tmp/awx_proot_ZURWmR' for isolation.
1.755 DEBUG Running from `/var/lib/awx/projects/_6__ansible_master/inventories/test` working directory.
Traceback (most recent call last):
File "/usr/bin/awx-manage", line 9, in <module>
load_entry_point('awx==3.2.0', 'console_scripts', 'awx-manage')()
File "/lib/python2.7/site-packages/awx/__init__.py", line 107, in manage
File "/var/lib/awx/venv/awx/lib/python2.7/site-packages/django/core/management/__init__.py", line 354, in execute_from_command_line
utility.execute()
File "/var/lib/awx/venv/awx/lib/python2.7/site-packages/django/core/management/__init__.py", line 346, in execute
self.fetch_command(subcommand).run_from_argv(self.argv)
File "/var/lib/awx/venv/awx/lib/python2.7/site-packages/django/core/management/base.py", line 394, in run_from_argv
self.execute(*args, **cmd_options)
File "/var/lib/awx/venv/awx/lib/python2.7/site-packages/django/core/management/base.py", line 445, in execute
output = self.handle(*args, **options)
File "/var/lib/awx/venv/awx/lib/python2.7/site-packages/django/core/management/base.py", line 661, in handle
return self.handle_noargs(**options)
File "/lib/python2.7/site-packages/awx/main/management/commands/inventory_import.py", line 1000, in handle_noargs
File "/lib/python2.7/site-packages/awx/main/management/commands/inventory_import.py", line 243, in load_inventory_source
File "/lib/python2.7/site-packages/awx/main/management/commands/inventory_import.py", line 179, in load
File "/lib/python2.7/site-packages/awx/main/management/commands/inventory_import.py", line 163, in command_to_json
RuntimeError: ansible-inventory failed (rc=4) with stdout:
stderr:
ERROR! Attempting to decrypt but no vault secrets found
Я также попытался создать файл ansible_vault и указать на него переменную vault_password_file - но это тоже не сработает (жалуясь, что не может найти файл пароля хранилища).
Кто-нибудь сталкивался с этим раньше?
3 ответа
Так что, похоже, это было скорее вопросом реализации. Согласно RedHat, не рекомендуется хранить файлы хранилища с инвентаризацией - это будет означать, что он расшифровывает файл каждый раз, когда выполняется синхронизация инвентаризации.
Я решил это сейчас, используя "vars_files" в playbook. Это выглядит так:
# Secrets
vars_files:
- '../../secrets/{{ tower_env }}/vault.yml'
В Tower я передаю переменную tower_env, например, "dev" или "qa", которая затем расшифровывает соответствующий файл хранилища при запуске playbook, а не при синхронизации инвентаризаций.
Есть две вещи, которые вы пытаетесь сделать, которые (по крайней мере, на данный момент) не поддерживаются:
- расшифровывать свои секреты во время импорта инвентаря
- с помощью
ansible-vault
шифровать весь файл, в отличие от переменных
Терминология здесь немного скудна, но посмотрите в этих документах раздел "Одна зашифрованная переменная", я иногда называю эти встроенные переменные.
https://docs.ansible.com/ansible/latest/user_guide/playbooks_vault.html
Ansible теперь поддерживает перемещение этих встроенных переменных в процессе анализа инвентаризации. Этот формат также не менее безопасен, это тот же алгоритм под капотом. Имя зашифрованных переменных будет доступно людям, имеющим доступ к вашему управлению источниками (что, вероятно, разумно), но ваше значение будет зашифровано.
Теперь сохраните значения с этим синтаксисом в .yml
переменные файлы в group_vars/
или же host_vars/
папки. Вы должны обнаружить, что синхронизация инвентаризации внутри Tower прошла успешно (без использования учетных данных хранилища), и когда вы переходите к группе или хосту, вы видите зашифрованную форму переменной.
Когда вы запустите playbook (шаблон задания в Tower), тогда приложите учетные данные хранилища в это время. Это задерживает шифрование до контекста времени выполнения, когда это действительно необходимо.
Пример структуры файла инвентаризации:
https://github.com/AlanCoding/Ansible-inventory-file-examples/tree/master/vault/single_var_file
Кроме того, как отмечается в другом комментарии, вы можете поместить зашифрованные переменные как целого файла, так и встроенные зашифрованные переменные в структуру папок в системе управления исходным кодом, где находится ваша книга воспроизведения, и она будет считываться Ansible и расшифровываться с помощью прикрепленных учетных данных хранилища к шаблону работы.
Хорошо - после расследования я могу признать, что в настоящее время нет способа сделать это в версии 2.6.5 по следующей причине:
- вполне возможно зашифровать переменные, где вы хотите, в host_vars или group_vars
- Vault-пароль-фраза принимается исключительно путем:
- vault-password-file
параметр
- ask-vault-pass
который был заменен --vault-id=@prompt
согласно коду, указанному здесь из строки 220
Нам потребуется еще одна возможность предоставить парольную фразу хранилища, например, с помощью групповой переменной, что в настоящее время невозможно.
А это значит, что Bugreport на Github не решается / не заменяется чем-то другим. ИМХО, он все еще открыт для всех остальных тем. Я продолжу эту тему с ошибками в github.