Использование 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 для указания пароля и указания метки Vault. Это может быть понятнее, когда в одной инвентаризации используются несколько хранилищ. Например:
Для запроса пароля «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 для получения дополнительной информации.
Скрипты клиентов Vault для паролей
Ansible 2.5 и более поздние версии поддерживают использование одного исполняемого скрипта для получения различных паролей в зависимости от метки Vault. Эти скрипты клиентов должны иметь имя файла, заканчивающееся на -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.8/user_guide/playbooks_vault.html