Как работать с секретами в Ansible?

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

Ответ

В инфраструктурных плейбуках я управляю секретами (пароли, ключи, токены) через 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).
  • Настраиваю динамическое формирование инвентаря с подтягиванием секретов только для нужных хостов.