Где храним реквизиты (адреса, логины, пароли) для Ansible-плейбуков?

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

Ответ

Для хранения секретов в Ansible мы используем Ansible Vault, что позволяет безопасно хранить зашифрованные данные прямо в репозитории вместе с кодом. Никогда не храним секреты в открытом виде.

Практический пример:

  1. Создаем зашифрованный файл с переменными (например, для production):
    ansible-vault create group_vars/prod/vault.yml
  2. Содержимое файла 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-----
  3. Использование секретов в плейбуке: Ссылаемся на зашифрованные переменные как на обычные.
    # 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
  4. Запуск плейбука с запросом пароля 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, чтобы динамически получать секреты во время выполнения плейбука, не храня их даже в зашифрованном виде в репозитории.