Как работать с credentials в Ansible role?

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

Ответ

Безопасная работа с учетными данными — основа любой инфраструктурной автоматизации. В Ansible я использую комбинацию ansible-vault для шифрования и практики безопасного хранения.

Структура роли с секретами:

my-ansible-role/
├── defaults/
│   └── main.yml          # Несекретные значения по умолчанию
├── vars/
│   └── secrets.yml       # ЗАШИФРОВАННЫЙ файл (в .gitignore)
├── tasks/
│   └── main.yml          # Основные задачи
└── README.md             # Инструкция по работе с vault

1. Создание и шифрование секретов:

# Создаем файл с секретами в plain-text (временно)
echo 'db_admin_password: "P@ssw0rd!123"' > vars/secrets.yml
echo 'api_token: "xyz789"' >> vars/secrets.yml

# Шифруем его с помощью ansible-vault
ansible-vault encrypt vars/secrets.yml
# Будет запрошен пароль для шифрования

Теперь файл secrets.yml можно безопасно коммитить в Git.

2. Использование в роли (tasks/main.yml):

- name: Include encrypted secrets
  ansible.builtin.include_vars:
    file: vars/secrets.yml
  no_log: true  # КРИТИЧЕСКИ ВАЖНО: предотвращает вывод секретов в консоль

- name: Configure database connection
  ansible.builtin.template:
    src: database.conf.j2
    dest: /etc/app/database.conf
    owner: root
    group: root
    mode: '0600'
  vars:
    db_password: "{{ db_admin_password }}"  # Переменная из зашифрованного файла

3. Запуск плейбука с ролями:

# Способ 1: Запрос пароля у пользователя
ansible-playbook site.yml --ask-vault-pass

# Способ 2: Использование файла с паролем (права доступа 600)
ansible-playbook site.yml --vault-password-file ~/.ansible/vault_pass.txt

# Способ 3 (для CI/CD): Пароль из переменной окружения
ansible-playbook site.yml --vault-password-file <(echo "$ANSIBLE_VAULT_PASSWORD")

Продвинутые практики для production:

  • Хранение пароля vault: Пароль от vault сам по себе является секретом. В CI/CD (например, GitLab CI) он хранится в защищенных переменных (Secrets). Для локальной разработки можно использовать менеджер паролей.
  • Динамические секреты: Для доступа к облачным ресурсам (AWS, GCP) вместо статических ключей в vault использую динамические IAM-роли для инстансов или OIDC-интеграцию в CI/CD.
  • Интеграция с внешними хранилищами: Для сложных сценариев можно использовать плагины для HashiCorp Vault (community.hashi_vault), чтобы получать секреты напрямую во время выполнения плейбука, минуя статические файлы.