Сразу про матчасть. RHCE (это и есть Red Hat Certified Engineer, экзамен EX294) много лет шёл на RHEL 8, версия RH294 для RHEL 9 закрепила ansible-core как отдельный пакет, а с 2025-2026 Red Hat двигает программу на RHEL 10 и рабочий процесс через ansible-navigator с execution environment. Хорошая новость: фундамент не поменялся. Плейбуки, роли, vault, идемпотентность - то же самое. Меняется обёртка запуска. Поэтому если твоя подготовка к rhce строится на понимании механики, ты переживёшь смену версии спокойно.
Сквозной проект: инвентарь, group_vars и vault
Соберём типовой стенд: группа веб-серверов и группа БД. Начинаем с инвентаря - это скелет всего.
Код: Выделить всё
# inventory
[webservers]
web1.example.com
web2.example.com
[databases]
db1.example.com
[production:children]
webservers
databases
Код: Выделить всё
# group_vars/databases/vars.yml
db_name: appdb
db_user: appuser
# group_vars/databases/vault.yml (зашифровано ansible-vault)
db_password: "S3cretPass!"
Код: Выделить всё
ansible-vault encrypt group_vars/databases/vault.yml

Роли, шаблоны и handlers
Логику раскладываем по ролям. Роль webserver ставит nginx или httpd, кладёт конфиг из шаблона и дёргает handler на перезапуск. Роль database ставит и настраивает СУБД. Скелет роли создаётся одной командой:
Код: Выделить всё
ansible-galaxy init roles/webserver
Код: Выделить всё
# roles/webserver/tasks/main.yml
---
- name: Установить веб-сервер
ansible.builtin.dnf:
name: httpd
state: present
- name: Развернуть конфиг из шаблона
ansible.builtin.template:
src: vhost.conf.j2
dest: /etc/httpd/conf.d/vhost.conf
owner: root
group: root
mode: "0644"
notify: restart httpd
- name: Открыть порт в firewalld
ansible.posix.firewalld:
service: http
permanent: true
immediate: true
state: enabled
- name: Запустить и включить httpd
ansible.builtin.service:
name: httpd
state: started
enabled: true
Код: Выделить всё
# roles/webserver/handlers/main.yml
---
- name: restart httpd
ansible.builtin.service:
name: httpd
state: restarted
Код: Выделить всё
# roles/webserver/templates/vhost.conf.j2
ServerName {{ ansible_facts['fqdn'] }}
DocumentRoot /var/www/html
# Узлов в группе webservers: {{ groups['webservers'] | length }}
Плейбук site.yml, запуск и обработка ошибок
Верхний плейбук связывает группы с ролями. Это и есть классический site.yml:
Код: Выделить всё
# site.yml
---
- name: Настройка веб-серверов
hosts: webservers
become: true
roles:
- webserver
- name: Настройка БД
hosts: databases
become: true
roles:
- database
Код: Выделить всё
ansible-playbook --syntax-check site.yml
ansible-playbook site.yml --check --ask-vault-pass
ansible-playbook site.yml --ask-vault-pass
Код: Выделить всё
- name: Безопасная проверка сервиса
block:
- name: Проверить ответ веб-сервера
ansible.builtin.command: curl -sf http://localhost
register: curl_out
changed_when: false
rescue:
- name: Сообщить о проблеме
ansible.builtin.debug:
msg: "Веб-сервер не ответил, смотрим логи"
Это твоя личная ansible шпаргалка перед экзаменом. Если по каждому пункту можешь сделать руками без подсказки - ты готов.
- Установка и настройка ansible-core, ansible.cfg, файл инвентаря со статическими группами и children.
- ad-hoc команды через ansible и модуль -m, разбор вывода.
- Плейбук: hosts, become, tasks, FQCN-модули, name у каждой задачи.
- Переменные всех уровней, факты ansible_facts, register и debug.
- Циклы loop, условия when, обработка изменений changed_when и failed_when.
- Шаблоны Jinja2, фильтры, доступ к groups и hostvars.
- Роли: структура, ansible-galaxy init, подключение через roles и include_role, зависимости в meta.
- Ansible Vault: encrypt, edit, rekey, запуск с --ask-vault-pass или --vault-id.
- Управление системой: пакеты dnf, сервисы systemd, пользователи и группы, cron, archive/unarchive, parted и filesystem для дисков.
- Сеть и безопасность: firewalld, authorized_key, базовое понимание SELinux-контекстов.
- Готовые роли и коллекции из Galaxy: установка через requirements.yml.
Ansible экзамен - это не проверка памяти, а проверка скорости и аккуратности. Несколько вещей, которые реально решают.
ansible-doc вместо зубрёжки. Никто не помнит все параметры. Команда ansible-doc ansible.posix.firewalld покажет имена и примеры прямо в терминале. На экзамене это разрешено и это твой главный союзник.
Идемпотентность - критерий зачёта. Проверяющий гоняет твой плейбук дважды. Первый прогон делает changed, второй должен быть весь ok. Если задача каждый раз показывает changed (частый случай с command и shell) - добавь changed_when: false или creates.
--check и --syntax-check. Прогоняй вхолостую перед боевым запуском, лови ошибки до того, как они что-то сломают.
Тайм-менеджмент. Двадцать задач за четыре часа. Не залипай на одной. Сделал, что знаешь, спорное оставил на потом. Проходной порог - 210 из 300.
Теперь грабли, на которых срезаются чаще всего:
- YAML-отступы. Только пробелы, никаких табов. Сбитый отступ - и плейбук не парсится. Настрой редактор заранее.
- Забытый FQCN. Современный линтер ругается на короткие имена. Пиши ansible.builtin.copy, а не copy.
- Пропущенный become: true. Половина задач требует root, а ошибка permission denied выглядит загадочно.
- Precedence переменных. Если значение не то, что ждёшь - вспомни порядок: extra-vars важнее всего, дальше task vars, block vars, role vars, потом group_vars и host_vars. group_vars/all - самый слабый уровень.
- Незашифрованный секрет. Пароль в открытом vars.yml - это провал по безопасности, даже если плейбук работает.
Повтори руками без подглядывания: подними инвентарь с группами webservers и databases, заведи group_vars с открытыми переменными и зашифрованным vault.yml, создай роль webserver через ansible-galaxy init, напиши tasks с установкой httpd, шаблоном конфига и handler на restart, открой порт через firewalld, собери site.yml и прогони его с --check, а потом по-настоящему. Затем запусти второй раз и убедись, что всё ok без changed. Сломай отступ специально и посмотри на ошибку - чтобы узнавать её мгновенно.
Контрольные вопросы
- Чем отличается хранение секрета в vars.yml от схемы vault_db_password в vault.yml плюс присваивание в vars?
- Почему задача с ansible.builtin.command может ломать идемпотентность и как это лечится?
- Какой уровень переменных перебьёт group_vars/all и почему это важно понимать на экзамене?
- Зачем прогонять плейбук с --check и --syntax-check до боевого запуска?
Ты собрал сквозной проект, где встретились инвентарь, group_vars с vault, роли, шаблоны, handlers и обработка ошибок - ровно тот набор, который проверяет EX294. Дальше расти есть куда: ansible-navigator и execution environment, AWX как open-source ядро, Ansible Automation Platform (AAP) на проде и интеграция Ansible в полноценные DevOps-пайплайны. Но фундамент у тебя уже есть. На экзамене не пытайся всё помнить - помни механику, а детали бери из ansible-doc. Пиши идемпотентно, проверяй --check, следи за отступами и временем. Спокойствие и аккуратность тут важнее скорости пальцев. Удачи на EX294 - ты подготовлен лучше, чем кажется.