Сохраните пароль в 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
Другие вопросы по тегам