Блог "Дети ОИТа"
/поиск

Переменные и секреты в Ansible: приоритеты, Vault, SOPS и HashiCorp

Полный гайд по управлению переменными и секретами: приоритеты, ansible-vault, SOPS, HashiCorp Vault и безопасная ротация.


title: «Переменные и секреты в Ansible: приоритеты, Vault, SOPS и HashiCorp»
date: 2026-10-11T06:55:00Z
status: published
categories: [«Системное администрирование»]
tags: [«ansible», «variables», «vault», «sops», «hashicorp», «security», «lookup», «ci-cd», «secrets-management»]
excerpt: «Полный гайд по управлению переменными и секретами: приоритеты, ansible-vault, SOPS, HashiCorp Vault, lookup-помощники и безопасная ротация ключей.»
readingMinutes: 6
featuredImage: «/images/ansible-vault-secrets.png»

Переменные и секреты в Ansible: от приоритетов до HashiCorp Vault

Чёткая работа с переменными и секретами — это 90% успеха автоматизации. Ошибка в приоритете или коммит секрета в Git может стоить компании дорого. Разбираем production-ready подход.

1. Приоритеты переменных (Precedence)

От высшего к низшему (победит верхнее):

  1. --extra-vars (CLI) — самый высокий приоритет, для разовых переопределений.
  2. Play vars / vars_prompt — переменные в плейбуке или вводимые при запуске.
  3. Block vars — переменные внутри блока задач.
  4. Role vars (vars/main.yml) — жёсткие политики роли.
  5. Role defaults (defaults/main.yml) — «ручки», легко переопределить.
  6. Inventory group_vars/host_vars — настройки окружений и хостов.
  7. Facts — данные, собранные Ansible о системе.

Практика:

  • Держите «ручки» (tunable knobs) в defaults/.
  • Держите политики (hard rules) в vars/.
  • Секреты — никогда не в VCS.

2. Структура хранения

group_vars/
├── all/
│   ├── vars.yml          # Общие настройки
│   └── vault.yml         # Общие секреты (зашифровано)
├── prod/
│   ├── vars.yml
│   └── vault.yml         # Продовые секреты
├── dev/
│   ├── vars.yml
│   └── vault.yml         # Дев-секреты (другой ключ)

host_vars/
└── db01-prod/
    └── vars.yml          # Уникальные настройки БД

3. Шифрование: Ansible Vault vs SOPS

Ansible Vault (встроенный)

# Создание
ansible-vault create group_vars/prod/vault.yml

# Просмотр
ansible-vault view group_vars/prod/vault.yml

# Редактирование
ansible-vault edit group_vars/prod/vault.yml

# Ротация ключа (rekey)
ansible-vault rekey group_vars/prod/vault.yml --new-vault-id prod@new-key.txt

Минусы: Один ключ на файл, сложно управлять в команде.

SOPS (Современный стандарт)

Интеграция с KMS (AWS, GCP, Azure) или PGP.

Шифрование:

sops --encrypt --encrypted-regex '^(data|stringData)$' \
  --kms arn:aws:kms:... \
  group_vars/prod/vault.yml > group_vars/prod/vault.yml.enc

В CI/CD:
Секреты расшифровываются на раннере через IAM-роль, ключи не хранятся в репозитории.

4. HashiCorp Vault (Enterprise)

Для динамических секретов (БД, токены, сертификаты).

lookup-плагин:

- name: Get DB password from HashiCorp Vault
  ansible.builtin.set_fact:
    db_password: "{{ lookup('community.hashi_vault.hashi_vault', 'secret=data/prod/db password=password token={{ vault_token }} url={{ vault_url }}') }}"

- name: Use password
  ansible.builtin.postgresql_user:
    name: app
    password: "{{ db_password }}"

AppRole аутентификация (для CI):

- name: Authenticate to Vault
  community.hashi_vault.vault_login:
    auth_method: approle
    role_id: "{{ vault_role_id }}"
    secret_id: "{{ vault_secret_id }}"
  register: login

- name: Read secret
  community.hashi_vault.vault_read:
    path: secret/data/prod/api
    token: "{{ login.data.auth.client_token }}"

5. Lookup-помощники

  • lookup('file', ...) — вставить содержимое файла.
  • lookup('template', ...) — отрендерить шаблон на контрол-ноде.
  • lookup('env', ...) — переменные окружения CI.
  • passwordstore(...) — интеграция с pass.
  • community.general.bitwarden — интеграция с Bitwarden.

Пример:

- name: Deploy config from template string
  ansible.builtin.copy:
    content: "{{ lookup('template', 'templates/inline.conf.j2') }}"
    dest: /etc/app/inline.conf

6. Ротация ключей и секретов

Ротация ключа Vault

  1. ansible-vault rekey --new-vault-id.
  2. Обновить CI/CD секреты (новый ключ).
  3. Перешифровать файлы.
  4. Удалить старый ключ.

Ротация паролей

  1. Генерировать новый пароль на лету:
    - name: Generate new DB password
      community.general.random_string:
        length: 32
        lower: true
        upper: true
        numeric: true
        special: true
      register: new_pass
    
  2. Обновить в Vault/SOPS.
  3. Применить в БД.
  4. Обновить конфиги приложений.
  5. Уведомить мониторинг.

7. Безопасность в CI/CD

GitHub Actions (SOPS):

- name: Decrypt secrets
  uses: sergioramos/sops-action@v2
  with:
    sops_file: group_vars/prod/vault.yml.enc

- name: Run Ansible
  env:
    ANSIBLE_CONFIG: ${{ github.workspace }}/ansible.cfg
  run: ansible-playbook -i environments/prod.yml playbooks/site.yml

Маскировка логов:

- name: Deploy with secret
  ansible.builtin.template:
    src: app.conf.j2
    dest: /etc/app/app.conf
  no_log: true  # Не выводить в лог

8. Production-ready чек-лист

  • Секреты не в VCS (Vault/SOPS/HashiCorp).
  • Разные ключи для dev и prod.
  • Приоритеты проверены: CLI > Play > Role vars > defaults.
  • no_log: true для задач с секретами.
  • Ротация ключей автоматизирована.
  • CI расшифровывает через IAM/Role (ключи не в репозитории).
  • Логи маскируются (no_log или secret scanning).
  • Документация всех переменных в defaults/main.yml.
  • Использование | default() в шаблонах для fallback.

См. также