Ответ
Для хранения секретов в Ansible мы используем Ansible Vault, что позволяет безопасно хранить зашифрованные данные прямо в репозитории вместе с кодом. Никогда не храним секреты в открытом виде.
Практический пример:
- Создаем зашифрованный файл с переменными (например, для production):
ansible-vault create group_vars/prod/vault.yml - Содержимое файла
vault.yml(вводится в редакторе):# group_vars/prod/vault.yml db_admin_password: "S3cr3tP@ss!" api_token: "xyz123abc" ssh_private_key: | -----BEGIN RSA PRIVATE KEY----- ... -----END RSA PRIVATE KEY----- - Использование секретов в плейбуке: Ссылаемся на зашифрованные переменные как на обычные.
# playbook.yml - name: Configure database server hosts: db_servers vars_files: - group_vars/prod/vault.yml # Ansible запросит пароль от vault tasks: - name: Ensure database user exists community.mysql.mysql_user: name: app_user password: "{{ db_admin_password }}" priv: "app_db.*:ALL" state: present - Запуск плейбука с запросом пароля Vault:
ansible-playbook playbook.yml --ask-vault-passИли с использованием пароля из файла:
ansible-playbook playbook.yml --vault-password-file ~/.ansible/vault_pass.txt
Best practices, которые мы соблюдаем:
- Используем разные vault-пароли для разных окружений (dev, stage, prod).
- Храним пароли от vault в защищенных системах (например, в менеджере секретов CI/CD), а не в коде.
- Для очень высоких требований безопасности интегрируем Ansible с HashiCorp Vault через модуль
community.hashi_vault, чтобы динамически получать секреты во время выполнения плейбука, не храня их даже в зашифрованном виде в репозитории.