Ответ
В инфраструктурных плейбуках я управляю секретами (пароли, ключи, токены) через Ansible Vault, интегрируя его в CI/CD пайплайн.
1. Шифрование переменных и файлов:
- Шифрую чувствительные переменные прямо в
group_vars/илиhost_vars/:# Создаю зашифрованную переменную для пароля БД ansible-vault encrypt_string 'S3cr3tP@ssw0rd!' --name 'postgresql_password' - Полученный вывод вставляю в файл переменных:
database: password: !vault | $ANSIBLE_VAULT;1.1;AES256 663864396532363364626265666530633361646239663064383834... - Шифрую целые файлы (например,
secrets.yml):ansible-vault encrypt secrets.yml
2. Интеграция в пайплайн развертывания:
- В CI/CD (GitLab CI, GitHub Actions) передаю пароль от vault через защищенную переменную окружения:
# .gitlab-ci.yml deploy: script: - echo "$ANSIBLE_VAULT_PASSWORD" > .vault_pass - ansible-playbook deploy.yml --vault-password-file .vault_pass - Никогда не коммичу пароль в репозиторий.
3. Работа с внешними хранилищами:
-
Для сложных сценариев интегрируюсь с HashiCorp Vault через модуль
community.hashi_vault: -
name: Get database password from HashiCorp Vault community.hashi_vault.hashi_vault: url: https://vault.example.com:8200 token: "{{ lookup('env', 'VAULT_TOKEN') }}" path: secret/data/database register: vault_secret
-
name: Use the secret debug: msg: "Password is {{ vault_secret.data.data.password }}"
4. Разграничение доступа:
- Использую разные vault-файлы для разных окружений (prod, staging).
- Настраиваю динамическое формирование инвентаря с подтягиванием секретов только для нужных хостов.