Ответ
Безопасная работа с учетными данными — основа любой инфраструктурной автоматизации. В Ansible я использую комбинацию ansible-vault для шифрования и практики безопасного хранения.
Структура роли с секретами:
my-ansible-role/
├── defaults/
│ └── main.yml # Несекретные значения по умолчанию
├── vars/
│ └── secrets.yml # ЗАШИФРОВАННЫЙ файл (в .gitignore)
├── tasks/
│ └── main.yml # Основные задачи
└── README.md # Инструкция по работе с vault
1. Создание и шифрование секретов:
# Создаем файл с секретами в plain-text (временно)
echo 'db_admin_password: "P@ssw0rd!123"' > vars/secrets.yml
echo 'api_token: "xyz789"' >> vars/secrets.yml
# Шифруем его с помощью ansible-vault
ansible-vault encrypt vars/secrets.yml
# Будет запрошен пароль для шифрования
Теперь файл secrets.yml можно безопасно коммитить в Git.
2. Использование в роли (tasks/main.yml):
- name: Include encrypted secrets
ansible.builtin.include_vars:
file: vars/secrets.yml
no_log: true # КРИТИЧЕСКИ ВАЖНО: предотвращает вывод секретов в консоль
- name: Configure database connection
ansible.builtin.template:
src: database.conf.j2
dest: /etc/app/database.conf
owner: root
group: root
mode: '0600'
vars:
db_password: "{{ db_admin_password }}" # Переменная из зашифрованного файла
3. Запуск плейбука с ролями:
# Способ 1: Запрос пароля у пользователя
ansible-playbook site.yml --ask-vault-pass
# Способ 2: Использование файла с паролем (права доступа 600)
ansible-playbook site.yml --vault-password-file ~/.ansible/vault_pass.txt
# Способ 3 (для CI/CD): Пароль из переменной окружения
ansible-playbook site.yml --vault-password-file <(echo "$ANSIBLE_VAULT_PASSWORD")
Продвинутые практики для production:
- Хранение пароля vault: Пароль от vault сам по себе является секретом. В CI/CD (например, GitLab CI) он хранится в защищенных переменных (Secrets). Для локальной разработки можно использовать менеджер паролей.
- Динамические секреты: Для доступа к облачным ресурсам (AWS, GCP) вместо статических ключей в vault использую динамические IAM-роли для инстансов или OIDC-интеграцию в CI/CD.
- Интеграция с внешними хранилищами: Для сложных сценариев можно использовать плагины для HashiCorp Vault (
community.hashi_vault), чтобы получать секреты напрямую во время выполнения плейбука, минуя статические файлы.