Ответ
В Ansible я строго разделяю переменные и секреты, следуя принципу Infrastructure as Code (IaC).
Структура хранения:
-
Несекретные переменные (hostnames, порты, пути) хранятся в обычных YAML-файлах внутри
group_vars/илиhost_vars/.# group_vars/prod/vars.yml app_version: "2.5.0" db_host: "postgresql.prod.internal" -
Секреты (пароли, токены, приватные ключи) хранятся в отдельных файлах, зашифрованных с помощью Ansible Vault. Эти файлы коммитятся в репозиторий.
# group_vars/prod/vault.yml (зашифрован) db_password: "{{ vault_db_password }}" api_token: "{{ vault_api_token }}"Шифрование/дешифрование выполняется по паролю или ключу, который хранится в CI/CD-секретах.
# Расшифровка в пайплайне ansible-playbook site.yml --ask-vault-pass # Или с помощью файла с паролем ansible-playbook site.yml --vault-password-file .vault_pass
Для динамических сред (например, облачных) вместо статических файлов vault.yml я использую плагины инвентаризации (AWS EC2, Azure) и получаю секреты напрямую из облачного KMS или HashiCorp Vault через lookup('hashi_vault', ...).