Сохраните пароль в Ansbile Vault и получите этот ключ из скрипта Python, используя API
У меня есть требование, где я не должен хранить пароли в файлах скриптов в виде простого текста. Поэтому я создал файл хранилища Ansible под названием "vault.yml", который содержит имя пользователя и пароль.
Есть ли какой-то API, который я могу использовать, чтобы найти это значение из скрипта Python, который называется, например, "test.py"?
То, что я хотел бы в test.py примерно так:
username = ansible_api_get(key=username)
password = ansible_api_get(key=password)
PS - Мне не нужно использовать Ansible Vault, но это предпочтительный вариант, так как мы хотели бы использовать всю конфиденциальную информацию с Vault, и мы хотим максимально интегрировать наши сценарии.
1 ответ
Да,ansible-vault
— это библиотека Python, которую вы можете использовать для этой цели.
vault.py
#!/usr/bin/env python3
''' get secrets from ansible-vault file with gpg-encrypted password '''
import os
import sys
from subprocess import check_output
import yaml
from ansible_vault import Vault
vault_file = sys.argv[1]
if os.path.exists(vault_file):
get_vault_password = os.environ['ANSIBLE_VAULT_PASSWORD_FILE']
if os.path.exists(get_vault_password):
PASSWORD = check_output(get_vault_password).strip().decode("utf-8")
secrets = yaml.safe_load(Vault(PASSWORD).load_raw(open(vault_file, encoding='utf-8').read()))
print(secrets['username'])
print(secrets['password'])
else:
raise FileNotFoundError
Как мудро говорит user1228454 , вам все равно понадобится пароль для хранилища Ansible. Как разработчик вы, вероятно, знакомы с подписанием своих коммитов в Git, хорошая новость заключается в том, что вы можете использовать те же ключи GPG для шифрования/дешифрования файла, в котором хранится пароль, и это может работать прозрачно.
Если переменная окруженияANSIBLE_VAULT_PASSWORD_FILE
указывает на исполняемый файл, то Ansible запустит этот исполняемый файл, чтобы получить пароль, необходимый для расшифровки файла хранилища. Если это не исполняемый файл, то кто-то может хранить там секреты в виде обычного текста. Исполняемому файлу в этом примере требуется всего одна строка оболочки для расшифровки файла с именемvault_pw.gpg
. Создайте этот файл с паролем хранилища в одной строке и зашифруйте его своим ключом GPG, удалите текстовый файл.
~/.bash_profile
Я настраиваю свою оболочку для этого, а также запускаю gpg-agent (для кэширования).
export ANSIBLE_VAULT_PASSWORD_FILE=~/.ansible_vault_password_exe
gpg-agent --daemon --write-env-file "${HOME}/.gpg-agent-info"'
export GPG_TTY=$(tty)
~/.bashrc
Это гарантирует, что работает только один gpg-agent:
if [ -f "${HOME}/.gpg-agent-info" ]
then
. "${HOME}/.gpg-agent-info"
fi
~/.ansible_vault_password_exe
#!/bin/sh
exec gpg -q -d ${HOME}/vault_pw.gpg