Ansible Vault: шифрование паролей и секретов

Рейтинг: 72.2% · 10 голосов
Подробный курс по Ansible с прицелом на экзамен RHCE EX294: установка и инвентарь, плейбуки, переменные и факты, Vault, циклы и условия, шаблоны Jinja2, роли и коллекции, Execution Environments и ansible-navigator, управление системами (диски, LVM, cron, SELinux, firewalld). Примеры на RHEL/Fedora. Актуально на 2026.
Ответить
Аватара пользователя
Maksim_DevOps
Сообщения: 47
Зарегистрирован: 11 май 2026, 05:31

Ansible Vault: шифрование паролей и секретов

Сообщение Maksim_DevOps »

Оглавление курса (47)
  1. Что такое Ansible и зачем он нужен: автоматизация без агентов
  2. Сертификация RHCE и экзамен EX294: что внутри и как готовиться
  3. Архитектура Ansible: control node, узлы, модули и плагины
  4. Установка Ansible на control node: dnf, pip и версии ansible-core
  5. Подготовка управляемых узлов: SSH, пользователь и sudo
  6. Инвентарь Ansible: hosts, группы и переменные
  7. Настройка Ansible: файл ansible.cfg и приоритеты конфигурации
  8. Host patterns и инструменты командной строки Ansible
  9. Ad hoc команды Ansible: быстрые задачи без плейбука
  10. Ansible playbook: что это такое и как устроен
  11. Структура плейбука: play, task, модули и переменные
  12. Запуск плейбуков: проверка, теги, ограничения и отладка
  13. Параллелизм и порядок выполнения: forks, serial, strategy
  14. Факты Ansible: сбор информации об узлах
  15. Переменные Ansible: типы, объявление и приоритет
  16. Регистрация результатов и специальные переменные
  17. Ansible Vault: шифрование паролей и секретов (вы здесь)
  18. Организация инвентаря: group_vars, host_vars и вложенные группы
  19. Динамический инвентарь и инвентарные плагины
  20. Циклы в Ansible: loop, списки и словари
  21. Повтор задачи до условия: until, retries и delay
  22. Условия в Ansible: директива when и логика
  23. Jinja2 в Ansible: выражения, фильтры и подстановки
  24. Обработчики Ansible: handlers, notify и flush_handlers
  25. Обработка ошибок: failed_when, changed_when и ignore_errors
  26. Блоки в Ansible: block, rescue и always
  27. Управление файлами: модули file, copy, fetch и stat
  28. Архивы и сборка файлов: archive, unarchive, assemble
  29. Точечное редактирование файлов: lineinfile и blockinfile
  30. Шаблоны Jinja2: модуль template и динамические конфиги
  31. Jinja2 продвинуто: фильтры, циклы, макросы и lookup
  32. Модули Ansible: ansible-doc и поиск нужного модуля
  33. Разработка собственного модуля Ansible на Python
  34. Роли Ansible и Ansible Galaxy: переиспользование
  35. Разработка роли Ansible: создание с нуля
  36. Зависимости ролей и requirements.yml
  37. Коллекции Ansible: ansible.posix, community и своя коллекция
  38. Execution Environments: контейнеры для запуска Ansible
  39. Сборка Execution Environment с ansible-builder
  40. ansible-navigator: запуск плейбуков в Execution Environment
  41. Управление SSH-ключами через Ansible: authorized_key
  42. Управление дисками: filesystem, mount и parted
  43. LVM через Ansible: тома, группы и расширение
  44. Планировщик задач: cron и systemd timers через Ansible
  45. Безопасность: hardening SSH и репозитории dnf/yum
  46. SELinux через Ansible: булевы, контексты и порты
  47. Сквозной проект и подготовка к экзамену EX294
Рано или поздно ты упрёшься в неприятный вопрос: куда девать пароли. Плейбук создаёт пользователя БД, монтирует NFS, ходит в API по токену - и всё это требует секретов. Самый простой путь - вписать пароль прямо в group_vars и закоммитить в git. Так делают тысячи людей, а потом их пароли всплывают в публичных репозиториях, в истории коммитов, в логах CI. Откатить это нельзя: то, что попало в git, остаётся в git навсегда.

Ansible решает проблему встроенным инструментом - Ansible Vault. Идея простая: чувствительные данные лежат в репозитории, но в зашифрованном виде. Без пароля это бесполезный блок base64, а в момент запуска плейбука Ansible расшифровывает их в памяти. Ты коммитишь секреты спокойно, а ключ держишь отдельно. На экзамене EX294 этот навык спрашивают почти гарантированно, так что разберём его руками и до конца.

Что такое шифрование в Ansible и как устроен Vault

Vault - это не отдельный сервис и не демон, как HashiCorp Vault (их часто путают). Это утилита ansible-vault и поддержка шифрованных файлов внутри самого Ansible. Под капотом - симметричное шифрование AES256: один пароль и шифрует, и расшифровывает. Зашифрованный файл начинается со строки-заголовка вида

Код: Выделить всё

$ANSIBLE_VAULT;1.1;AES256
а дальше идёт hex-блок. Ansible по этому заголовку понимает, что файл надо расшифровать перед чтением.

Шифровать можно две вещи:
  • целый файл переменных (например group_vars/db/vault.yml) - удобно, когда секретов много;
  • отдельную переменную внутри обычного YAML через encrypt_string - удобно, когда секрет один-два, а остальное хочется видеть в открытом виде.
Базовый набор команд ansible-vault короткий, и его стоит довести до автоматизма:
  • create - создать новый шифрованный файл и сразу открыть редактор;
  • edit - редактировать существующий, расшифровка и обратное шифрование происходят прозрачно;
  • view - посмотреть содержимое, не редактируя;
  • encrypt - зашифровать уже существующий открытый файл;
  • decrypt - расшифровать обратно в открытый текст (осторожно, потом не закоммить случайно);
  • rekey - сменить пароль шифрования, не трогая содержимое.
Изображение

Ansible Vault на практике: пример с файлом и с encrypt_string

Начнём с самого частого сценария - шифрование ansible-переменных целым файлом. Лучшая практика, которую ждут и на проде, и на экзамене: держать секреты в отдельном файле group_vars/<группа>/vault.yml, а открытые переменные - рядом в vars.yml. Так в открытом файле ты видишь осмысленные имена, а значения подтягиваются из шифрованного.

Код: Выделить всё

# создаём шифрованный файл секретов для группы webservers
ansible-vault create group_vars/webservers/vault.yml
Откроется редактор (по умолчанию vi, можно задать через переменную окружения EDITOR). Внутри пишем обычный YAML, по соглашению с префиксом vault_:

Код: Выделить всё

---
vault_db_password: "S3cr3t-Pa55!"
vault_api_token: "ghp_xxxxxxxxxxxxxxxxxxxx"
Теперь в открытом group_vars/webservers/vars.yml связываем понятные имена с секретами:

Код: Выделить всё

---
db_password: "{{ vault_db_password }}"
api_token: "{{ vault_api_token }}"
Зачем эта связка через префикс? Чтобы grep по коду показывал, где используется секрет, даже не расшифровывая vault. И чтобы в задачах фигурировали чистые имена db_password, а не vault_db_password. Используем как обычно:

Код: Выделить всё

---
- name: Настройка веб-приложения
  hosts: webservers
  become: true
  tasks:
    - name: Положить конфиг приложения с секретами
      ansible.builtin.template:
        src: app.conf.j2
        dest: /etc/myapp/app.conf
        owner: root
        group: root
        mode: "0640"
      no_log: true
Обрати внимание на no_log: true - без него Ansible при verbose-выводе или ошибке шаблона может выплюнуть расшифрованный пароль прямо в консоль и в логи. Это классический способ слить секрет, который сам же и шифровал.

Второй сценарий - encrypt_string, когда нужно зашифровать ровно одну переменную и вставить её в обычный незашифрованный файл. Это особенно показывают на экзамене, так что разберём подробно:

Код: Выделить всё

ansible-vault encrypt_string 'S3cr3t-Pa55!' --name 'db_password'
На выходе получишь готовый блок, который вставляется прямо в YAML:

Код: Выделить всё

db_password: !vault |
          $ANSIBLE_VAULT;1.1;AES256
          66386439653236336462626566653063336164663966303231363934653561363
          39383236303664656265656132643135313964353936313731633165633563366
          ...
Тег !vault говорит Ansible, что значение надо расшифровать, а символ | разрешает многострочность. Чтобы тебя не просили вводить пароль интерактивно, можно сразу указать файл с паролем:

Код: Выделить всё

ansible-vault encrypt_string --vault-id dev@~/.vault_pass_dev \
  --stdin-name 'db_password'
Здесь ты введёшь сам секрет в stdin, имя переменной задаётся через --stdin-name, а пароль берётся из файла. Это и есть тот самый ansible encrypt одной переменной, который ищут в поиске.

Ansible vault password: как запускать плейбук и где хранить ключ

Если в деле есть хоть один шифрованный файл, обычный ansible-playbook упадёт с ошибкой "Attempting to decrypt but no vault secrets found". Нужно дать Ansible пароль. Способов два.

Интерактивно - спросить пароль при запуске:

Код: Выделить всё

ansible-playbook site.yml --ask-vault-pass
Через файл с паролем - то, что используют в CI и на автоматических прогонах:

Код: Выделить всё

ansible-playbook site.yml --vault-password-file ~/.vault_pass
Файл .vault_pass - это просто текстовый файл, где на первой строке лежит сам пароль. Его права обязаны быть 0600, и он НИКОГДА не должен попадать в репозиторий - добавь его в .gitignore первым делом. Запуск с vault-password-file удобно зафиксировать в ansible.cfg, чтобы не писать флаг каждый раз:

Код: Выделить всё

[defaults]
vault_password_file = ~/.vault_pass
Можно пойти дальше и сделать password file исполняемым скриптом, который достаёт ansible vault password из менеджера секретов или переменной окружения - тогда пароль вообще не лежит на диске в открытом виде.

Когда хранилищ несколько (например, отдельные пароли для dev и prod), включается vault-id. Каждому хранилищу даёшь метку и свой файл:

Код: Выделить всё

ansible-playbook site.yml \
  --vault-id dev@~/.vault_pass_dev \
  --vault-id prod@~/.vault_pass_prod
Ansible переберёт ключи и подберёт нужный по метке в заголовке файла. Сменить пароль на файле (ротация при увольнении сотрудника или утечке) - это rekey:

Код: Выделить всё

ansible-vault rekey group_vars/webservers/vault.yml
ansible-vault rekey --new-vault-id prod@~/.vault_pass_new \
  --vault-id prod@~/.vault_pass_old group_vars/webservers/vault.yml
Типичные грабли
  • Закоммитил расшифрованный файл после decrypt и не зашифровал обратно. Секрет уже в истории. Лечится только ротацией пароля у сервиса, не самим vault.
  • Забыл no_log: true в задаче с секретом. При -vvv или ошибке пароль уходит в вывод и в логи CI.
  • Положил .vault_pass рядом с плейбуком и закоммитил. Шифрование теряет смысл - ключ лежит в том же репо.
  • Права на файл пароля не 0600. Ansible может ругаться, а соседи по серверу - читать твой ключ.
  • Пытаешься grep по значению секрета и не находишь. Внутри vault его нет в открытом виде - ищи по имени переменной, отсюда и соглашение с префиксом vault_.
  • Перепутал ansible-vault и HashiCorp Vault. Это разные вещи: первое - шифрование файлов, второе - отдельный сервис хранения секретов.
Мини-лаба
  • Создай ansible-vault create group_vars/db/vault.yml и положи туда vault_db_password.
  • Свяжи его в group_vars/db/vars.yml через db_password: "{{ vault_db_password }}".
  • Отдельно зашифруй один токен через encrypt_string --name и вставь блок в обычный vars.yml.
  • Запусти плейбук сначала с --ask-vault-pass, потом настрой vault_password_file в ansible.cfg и запусти без флага.
  • Сделай rekey файла на новый пароль и проверь, что плейбук всё ещё проходит.
  • Открой view на шифрованный файл и убедись, что edit/encrypt/decrypt работают как ожидаешь.
Для Ubuntu/Debian и RU-дистрибутивов (RED OS, Astra) всё идентично: vault - часть самого Ansible, от пакетного менеджера (apt вместо dnf) ничего не зависит. Меняются только команды установки самого Ansible, а ansible-vault и синтаксис плейбуков одни и те же.

Контрольные вопросы
  • Чем отличается шифрование целого файла от encrypt_string и когда что выбирать?
  • Какие два способа передать ansible vault password при запуске плейбука и какой подходит для CI?
  • Зачем нужно соглашение с префиксом vault_ и связкой через vars.yml?
  • Что делает rekey и почему он не спасает, если расшифрованный файл уже попал в git?
Итог

Ansible Vault даёт честный способ хранить пароли и токены в репозитории, не раскрывая их. Запомни связку: ansible-vault create/edit/view/rekey для файлов, encrypt_string для одиночных переменных, запуск через --ask-vault-pass или --vault-password-file, а ключ - всегда вне git и с правами 0600. Этого хватит и для прода, и чтобы спокойно пройти задание по vault на EX294.
👍3 ❤️4 🔥3 😄 🤔2
Аватара пользователя
simpson421
Сообщения: 1
Зарегистрирован: 16 май 2026, 18:33

Re: Ansible Vault: шифрование паролей и секретов

Сообщение simpson421 »

Долго путал ansible-vault с HashiCorp Vault, спасибо что развели в начале. Теперь дошло что это просто шифрование файлов, а не сервис.
👍 ❤️ 🔥 😄 🤔
Аватара пользователя
thornleaf
Сообщения: 1
Зарегистрирован: 11 май 2026, 23:04

Re: Ansible Vault: шифрование паролей и секретов

Сообщение thornleaf »

Вопрос про encrypt_string: а можно ли потом такой !vault блок отредактировать через edit, или только пересоздавать заново? У меня edit на обычном vars.yml ругается.
👍1 ❤️ 🔥1 😄 🤔1
Ответить
← Предыдущая глава
Регистрация результатов и специальные переменные
Следующая глава →
Организация инвентаря: group_vars, host_vars и вложенные группы

Все главы курса «Ansible: автоматизация и подготовка к RHCE (EX294)»

Поделиться темой: ✈ Telegram VK
Похожие запросы: что такое ansible простыми словамиansible для начинающих с чего начатьустановка ansible на linuxansible inventory и hosts файлчто такое playbook в ansibleструктура ansible playbook из чего состоит

Вернуться в «Ansible: автоматизация и подготовка к RHCE (EX294)»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость