Фон
- Мы используем Ansible для предоставления и управления инфраструктурой Azure. На данный момент мы запускаем Ansible «вручную», то есть вручную запускаем playbooks для различных автоматизированных задач. Нет инфраструктуры CI.
- Вероятно, не актуально, но мы управляем нашим запасом, используя динамический скрипт
azure_rm.py
. - Мы призваны быть максимально безопасными, т.е.
- Не храните пароли Vault
~/.vault_pass
ни в каком локальном файле - Не храните секреты Azure в
~/.azure/credentials
- Не храните ничего в безопасности
.bashrc
.
- Не храните пароли Vault
При таком сценарии у меня возникают проблемы с выработкой согласованной стратегии, обеспечивающей доступ моих книг к секретам Azure при соблюдении приведенных выше рекомендаций.
Вопрос
Как избежать хранения учетных данных Ansible Vault и Azure в файлах, при этом обеспечивая доступ к моим книгам воспроизведения?
Что я пробовал
До сих пор я придумал скрипт-обертку, который
- спрашивает пользователя пароль Vault
- Использует это для расшифровки скрипта Vapted Shell
- Оценивает сценарий, который загружает переменные среды Azure в среду;
- Запускает playbook в среде, которая была настроена таким образом.
Какие-нибудь лучшие (более изящные, менее сложные, более "Ansible") решения существуют?
ansible
ansible-vault
Вишь
источник
источник
Ответы:
Пароль хранилища
Прежде всего, вам следует ознакомиться с тем, что файл паролей хранилища может быть исполняемым скриптом. В этом случае Ansible выполняет его и ожидает получить пароль в качестве вывода.
Например, вы можете использовать
gpg-agent
или,keychain
чтобы сохранить свой действительный пароль и разблокировать его при необходимости. Подробнее читайте в этом блоге: https://benincosa.com/?p=3235Если вы немного параноик, вы можете добавить уведомление при вызове скрипта пароля, например:
Этот скрипт пароля хранилища использует в
key.gpg
качестве фактического ключа хранилища, а также показывает всплывающее уведомление (для MacOS) с именем родительского процесса при использовании сценария. Gpg-agent кеширует пароль разблокировки в течение некоторого времени, поэтому нет необходимости вводить пароль при каждом запуске playbook.Просто установите
vault_password_file = ./vault_pass.sh
в своемansible.cfg
.Окружающая обстановка
Вы сказали, что используете в
azure_rm.py
качестве динамического инвентаря скрипт. Это означает, что вы должны установить учетные данные в переменных среды, прежде чем запускать ansible-playbook, чтобы они могли их использовать.Вы можете сделать два файла:
secure_env
(зашифровано с хранилищем):set_env
(простой текст):Когда вы открываете новый терминал для выполнения ваших задач автоматизации, вы должны запустить:
В этот момент bash оценивает
set_env
иsecure_env
(расшифровывается с помощью ansible-vault). После этой команды у вас есть учетные данные Azure, определенные для текущей оболочки, поэтому вы можете выполнять playbooks как обычно:Таким образом, используя эти два подхода, вы можете хранить
key.gpg
иsecure_env
в своем хранилище; затем в новом вызове терминалаsource set_env
один раз введите пароль gpg (чтобы разблокировать использование key.gpg в будущем); затем звонитеansible-playbook
столько раз, сколько хотите, без каких-либо паролей.источник
source
таком подходе вы устанавливаете среду один раз за терминальную сессию и можете использовать весь спектр инструментов отдельно: ansible-playbooks, инвентаризационные скрипты, azure cli, без каких-либо оболочек.Пожалуйста, прочитайте https://docs.ansible.com/ansible/2.4/vault.html Начиная с Ansible 2.4 можно использовать
--vault-id @prompt
.Зашифруйте файл с помощью ansible-vault:
Запустите playbook, и это приведет к:
Существует несколько вариантов расшифровки файлов, в том числе
@prompt
:подскажет:
После ввода пароля хранилища книга воспроизведения должна быть успешной.
источник
--ask-vault-pass
опцию. И я не понимаю, как заменить его--vault-id
ответом на более важный вопрос о лучшем рабочем процессе.ansible-playbook --vault-id my-vault-password.py
. Я подумал, что, возможно, у вас есть решение об использовании скрипта на Python :) Я также немного обдумываю этот вопрос.