Переменные и секреты в 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)
От высшего к низшему (победит верхнее):
--extra-vars(CLI) — самый высокий приоритет, для разовых переопределений.- Play vars / vars_prompt — переменные в плейбуке или вводимые при запуске.
- Block vars — переменные внутри блока задач.
- Role vars (
vars/main.yml) — жёсткие политики роли. - Role defaults (
defaults/main.yml) — «ручки», легко переопределить. - Inventory group_vars/host_vars — настройки окружений и хостов.
- 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
ansible-vault rekey --new-vault-id.- Обновить CI/CD секреты (новый ключ).
- Перешифровать файлы.
- Удалить старый ключ.
Ротация паролей
- Генерировать новый пароль на лету:
- name: Generate new DB password community.general.random_string: length: 32 lower: true upper: true numeric: true special: true register: new_pass - Обновить в Vault/SOPS.
- Применить в БД.
- Обновить конфиги приложений.
- Уведомить мониторинг.
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.