Где хранить реквизиты стенда в Ansible playbook

«Где хранить реквизиты стенда в Ansible playbook» — вопрос из категории Ansible, который задают на 23% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В 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', ...).