Управление секретами (Ansible Vault)

TL;DR: ansible-vault encrypt secrets.yml — шифрование. Файл хранится в Git зашифрованным. --vault-password-file — для CI/CD. Шифровать только секреты, не весь файл.

Ansible Vault шифрует конфиденциальные данные (пароли, ключи, токены) для безопасного хранения в Git.

Основные команды

# Создать зашифрованный файл
ansible-vault create group_vars/all/vault.yml
 
# Редактировать (расшифрует → откроет $EDITOR → зашифрует)
ansible-vault edit group_vars/all/vault.yml
 
# Зашифровать существующий файл
ansible-vault encrypt secrets.yml
 
# Расшифровать файл
ansible-vault decrypt secrets.yml
 
# Просмотреть содержимое (не расшифровывая файл на диске)
ansible-vault view secrets.yml
 
# Сменить пароль
ansible-vault rekey secrets.yml
 
# Зашифровать одну строку (для вставки в YAML)
ansible-vault encrypt_string 'SuperSecret123' --name 'db_password'

Рекомендуемая структура

group_vars/
├── all/
│   ├── vars.yml           # обычные переменные (открытые)
│   └── vault.yml          # зашифрованные секреты
├── production/
│   ├── vars.yml
│   └── vault.yml
└── staging/
    ├── vars.yml
    └── vault.yml

vars.yml — ссылается на vault-переменные:

# group_vars/all/vars.yml
db_host: postgres.example.com
db_user: app
db_password: "{{ vault_db_password }}"      # ← ссылка на vault
api_key: "{{ vault_api_key }}"

vault.yml — содержит зашифрованные значения:

# group_vars/all/vault.yml (зашифрован)
vault_db_password: "SuperSecret123"
vault_api_key: "sk-abc123def456"

Конвенция: vault-переменные с префиксом vault_. Это сразу видно, откуда значение.

Использование в Playbook

- hosts: all
  tasks:
    - name: Configure database
      ansible.builtin.template:
        src: db.conf.j2
        dest: /etc/app/db.conf
      # db_password автоматически подставится из vault

Запуск с Vault

# Интерактивно (запросит пароль)
ansible-playbook site.yml --ask-vault-pass
 
# Из файла (для CI/CD)
echo "MyVaultPassword" > .vault_pass
chmod 600 .vault_pass
ansible-playbook site.yml --vault-password-file .vault_pass
 
# Через переменную окружения
export ANSIBLE_VAULT_PASSWORD_FILE=.vault_pass
ansible-playbook site.yml
 
# В ansible.cfg
# [defaults]
# vault_password_file = .vault_pass

Важно: .vault_pass — в .gitignore. Никогда не коммитить пароль от vault.

Шифрование отдельных строк

Вместо шифрования целого файла — шифруется одна переменная внутри обычного YAML:

ansible-vault encrypt_string 'SuperSecret123' --name 'db_password'

Вывод (вставить в YAML):

db_password: !vault |
  $ANSIBLE_VAULT;1.1;AES256
  62313365396662343061393464336163...

Типичные ошибки

ОшибкаСимптомРешение
Шифрование всего файла с переменнымиНе видно какие переменные есть без расшифровкиРазделять: vars.yml (открытый) + vault.yml (шифрованный)
.vault_pass в GitПароль утёкДобавить в .gitignore, использовать chmod 600
Разные пароли для разных окружений--ask-vault-pass запрашивает один пароль--vault-id prod@prompt --vault-id dev@.vault_pass_dev
ansible-vault edit без $EDITORОткрывается vi, непонятно как выйтиexport EDITOR=nano или export EDITOR="code --wait"