Использование Vault в плейбуках
- Запуск плейбука с Vault
- Несколько паролей Vault
- Сценарии клиентов Vault для паролей
- Один зашифрованный параметр
- Использование encrypt_string
Функция «Vault» в Ansible позволяет хранить конфиденциальные данные, такие как пароли или ключи, защищенными при хранении, вместо того, чтобы хранить их в виде открытого текста в плейбуках или ролях. Эти хранилища затем можно распространять или помещать в систему управления версиями.
Существует 2 типа защищенного содержимого, и каждое имеет свои особенности и ограничения:
| Защищенные файлы: |
|
|---|---|
| Один зашифрованный параметр: | |
| |
Предупреждение
- Vault ТОЛЬКО защищает данные «при хранении». После расшифровки авторы плейбуков и плагинов несут ответственность за предотвращение раскрытия секретов, см. no_log для получения дополнительной информации о скрытии вывода.
Для активации этой функции используется утилита командной строки ansible-vault для редактирования файлов, и используется флаг командной строки --ask-vault-pass, --vault-password-file или --vault-id. Вы также можете изменить свой ansible.cfg файл, чтобы указать расположение файла пароля или настроить Ansible на постоянное запрошение пароля. Эти параметры не требуют использования флагов командной строки.
Для получения рекомендаций по лучшим практикам обратитесь к Переменные и хранилища.
Запуск плейбука с Vault
Для запуска плейбука, содержащего файлы с зашифрованными данными Vault, необходимо предоставить пароль Vault.
Для указания пароля Vault интерактивно:
ansible-playbook site.yml --ask-vault-pass
Этот запрос затем будет использован для расшифровки (только в памяти) всех файлов, зашифрованных Vault, к которым осуществляется доступ.
В качестве альтернативы, пароли можно указать с помощью файла или скрипта (версия скрипта потребует Ansible 1.7 или более поздней версии). При использовании этого флага убедитесь, что права доступа к файлу такие, что никто другой не может получить доступ к вашему ключу, и не добавляйте свой ключ в систему управления версиями:
ansible-playbook site.yml --vault-password-file ~/.vault_pass.txt ansible-playbook site.yml --vault-password-file ~/.vault_pass.py
Пароль должен быть строкой, хранящейся в файле в одну строку.
Если вы используете скрипт вместо простого файла, убедитесь, что он отмечен как исполняемый, и что пароль выводится в стандартный вывод. Если ваш скрипт нуждается в запросе данных, запросы можно отправлять в стандартный поток ошибок.
Примечание
Вы также можете установить переменную среды ANSIBLE_VAULT_PASSWORD_FILE, например ANSIBLE_VAULT_PASSWORD_FILE=~/.vault_pass.txt, и Ansible автоматически будет искать пароль в этом файле.
Это может быть полезно при использовании Ansible из системы непрерывной интеграции, такой как Jenkins.
Опция --vault-password-file также может использоваться с командой ansible-pull, если вы этого хотите, хотя это потребует распространения ключей на ваши узлы, поэтому понимайте последствия — Vault предназначен скорее для режима push.
Несколько паролей Vault
Ansible 2.4 и более поздние версии поддерживают концепцию нескольких хранилищ, которые зашифрованы разными паролями. Разным хранилищам можно присваивать метки для их различения (обычно значения dev, prod и т.д.).
Опции --ask-vault-pass и --vault-password-file можно использовать, если нужен только один пароль для любого данного выполнения.
В качестве альтернативы, можно использовать опцию --vault-id для указания пароля и указания метки хранилища. Это может быть яснее при использовании нескольких хранилищ в одном инвентаре. Например:
Для запроса пароля «dev»:
ansible-playbook site.yml --vault-id dev@prompt
Для получения пароля «dev» из файла или скрипта:
ansible-playbook site.yml --vault-id dev@~/.vault_pass.txt ansible-playbook site.yml --vault-id dev@~/.vault_pass.py
Если для одного выполнения требуются несколько паролей Vault, необходимо использовать опцию --vault-id, так как её можно указывать несколько раз, чтобы предоставить несколько паролей. Например:
Для чтения пароля «dev» из файла и запроса пароля «prod»:
ansible-playbook site.yml --vault-id dev@~/.vault_pass.txt --vault-id prod@prompt
Опции --ask-vault-pass или --vault-password-file можно использовать для указания одного из паролей, но обычно лучше избегать смешивания их с --vault-id.
Примечание
По умолчанию метка хранилища (dev, prod и т.д.) просто подсказка. Ansible будет пытаться расшифровать каждое хранилище с каждым предоставленным паролем.
Установка параметра конфигурации DEFAULT_VAULT_ID_MATCH изменит это поведение, так что каждый пароль будет использоваться только для расшифровки данных, зашифрованных с той же меткой. См. Маркировка хранилищ для получения более подробной информации.
Сценарии клиентов Vault для паролей
Ansible 2.5 и более поздние версии поддерживают использование одного исполняемого скрипта для получения разных паролей в зависимости от метки хранилища. Эти скрипты клиентов должны иметь имя файла, которое заканчивается на -client. Например:
Для получения пароля dev из системного хранилища ключей, используя скрипт contrib/vault/vault-keyring-client.py:
ansible-playbook --vault-id dev@contrib/vault/vault-keyring-client.py
См. Сценарии клиентов Vault для паролей для полного объяснения этой темы.
Один зашифрованный параметр
Начиная с версии 2.3, Ansible теперь может использовать зашифрованную переменную, которая хранится в файле YAML в «обычном» тексте:
notsecret: myvalue
mysecret: !vault |
$ANSIBLE_VAULT;1.1;AES256
66386439653236336462626566653063336164663966303231363934653561363964363833313662
6431626536303530376336343832656537303632313433360a626438346336353331386135323734
62656361653630373231613662633962316233633936396165386439616533353965373339616234
3430613539666330390a313736323265656432366236633330313963326365653937323833366536
34623731376664623134383463316265643436343438623266623965636363326136
other_plain_text: othervalue
Для создания зашифрованной переменной используйте команду ansible-vault encrypt_string. См. Использование encrypt_string для получения подробной информации.
Эта зашифрованная переменная будет расшифрована с предоставленным секретом Vault и использована как обычная переменная. Команда ansible-vault командной строки поддерживает stdin и stdout для шифрования данных на лету, что можно использовать из вашего любимого редактора для создания этих зашифрованных переменных; вы должны убедиться, что добавили тег !vault, чтобы Ansible и YAML знали о необходимости расшифровки. Также необходимо |, так как шифрование Vault приводит к многострочной строке.
Примечание
Встроенные хранилища работают ТОЛЬКО с переменными, вы не можете напрямую использовать их в параметрах задач.
Использование encrypt_string
Эта команда выведет строку в указанном выше формате, готовую для включения в файл YAML. Строку для шифрования можно предоставить через stdin, аргументы командной строки или через интерактивный запрос.
См. Использование encrypt_string для создания зашифрованных переменных для встраивания в YAML.
© 2012–2018 Michael DeHaan
© 2018–2019 Red Hat, Inc.
Licensed under the GNU General Public License version 3.
https://docs.ansible.com/ansible/2.9/user_guide/playbooks_vault.html