Запуск плейбуков: проверка, теги, ограничения и отладка

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

Запуск плейбуков: проверка, теги, ограничения и отладка

Сообщение 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
Ты написал плейбук на сорок задач. Запускаешь его на проде - и на двадцать восьмой задаче что-то ломается, а первые двадцать семь уже накатились. Или того хуже: ты не уверен, что плейбук вообще сделает то, что ты задумал, но боишься прогнать его вживую. Знакомо? Команда ansible-playbook - это не одна кнопка "сделать всё". Это набор рычагов, которые позволяют посмотреть изменения заранее, прогнать только нужный кусок и быстро понять, где именно отвалилось. Кто эти рычаги знает - тот на проде спокоен, а на экзамене EX294 экономит драгоценные минуты.

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

Базовый запуск: ansible run playbook и его параметры

Минимальная команда запуска выглядит так:

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

ansible-playbook -i inventory site.yml
Здесь -i inventory указывает на файл инвентаря, а site.yml - сам плейбук. Если в ansible.cfg уже прописан inventory, флаг -i можно опустить. Когда говорят "ansible run playbook" или "запустить playbook ansible" - имеют в виду именно эту команду, всё остальное навешивается опциями поверх.

Полезные ansible playbook параметры, которые стоит держать в голове:
  • --check - сухой прогон, ничего не меняет на хостах
  • --diff - показать, что именно изменится в файлах и конфигах
  • -v / -vv / -vvv / -vvvv - уровень подробности вывода
  • --limit - ограничить запуск частью хостов
  • --tags / --skip-tags - запустить или пропустить задачи по тегам
  • --start-at-task - начать с конкретной задачи
  • --step - спрашивать подтверждение перед каждой задачей
  • -e (--extra-vars) - передать переменные из командной строки
  • --syntax-check - проверить синтаксис без выполнения
Эти ansible playbook команды работают одинаково на любом RHEL-семействе - RHEL, Fedora, AlmaLinux, RED OS, и на Debian/Ubuntu тоже. Сам ansible ставится через dnf install ansible-core (или apt install ansible на Debian-системах), но синтаксис запуска от дистрибутива не зависит.

Изображение

Сухой прогон --check и предпросмотр --diff

Главный инструмент уверенности - режим проверки (check mode). Плейбук проходит все задачи, докладывает, что бы он изменил, но реально ничего не трогает:

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

ansible-playbook site.yml --check
В паре с ним идёт --diff: для файловых модулей (template, copy, lineinfile, blockinfile) он покажет построчный дифф - что было и что станет. Связка дает полноценный предпросмотр:

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

ansible-playbook site.yml --check --diff
Допустим, у нас задача раскатывает конфиг через шаблон:

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

- name: Развернуть конфиг nginx
  ansible.builtin.template:
    src: nginx.conf.j2
    dest: /etc/nginx/nginx.conf
    owner: root
    group: root
    mode: "0644"
  notify: restart nginx
С --check --diff ты увидишь, поменяется ли файл и как именно, до того как тронешь рабочий nginx. Это и есть ответ на страх "а вдруг сломаю прод".

Важная оговорка: не все модули корректно работают в check mode. Если задача командного типа (ansible.builtin.command, ansible.builtin.shell) что-то проверяет и от её результата зависят следующие задачи, в сухом прогоне она может быть пропущена и плейбук выдаст ложные ошибки. На такой случай у задачи есть параметр check_mode: и поведение можно подкрутить:

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

- name: Узнать версию приложения
  ansible.builtin.command: /opt/app/bin/version
  register: app_version
  check_mode: false
  changed_when: false
Здесь check_mode: false заставляет команду выполниться даже в сухом прогоне (она безопасна, только читает), а changed_when: false говорит, что она ничего не меняет.

Теги, ограничение хостов и старт с задачи

Теперь про то, как не гонять весь плейбук целиком. Сначала навешиваем теги на задачи или роли:

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

- name: Установить пакеты
  ansible.builtin.dnf:
    name:
      - nginx
      - firewalld
    state: present
  tags:
    - packages

- name: Открыть порт HTTP
  ansible.posix.firewalld:
    service: http
    permanent: true
    state: enabled
    immediate: true
  tags:
    - firewall
Запустить только то, что помечено тегом firewall:

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

ansible-playbook site.yml --tags firewall
Или наоборот, прогнать всё, кроме медленной установки пакетов:

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

ansible-playbook site.yml --skip-tags packages
Посмотреть, какие теги вообще есть в плейбуке, не запуская его:

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

ansible-playbook site.yml --list-tags
Ограничение по хостам - флаг --limit. Инвентарь общий, а накатить хочешь на одну машину или группу:

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

ansible-playbook site.yml --limit web1.example.com
ansible-playbook site.yml --limit "webservers"
Если плейбук упал на середине, не обязательно гонять заново всё. Стартуй с нужной задачи по её имени:

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

ansible-playbook site.yml --start-at-task "Открыть порт HTTP"
А когда хочешь идти по плейбуку вручную, по шагам, с подтверждением каждой задачи - режим --step. Ansible перед каждой задачей спросит: выполнить (y), пропустить (n) или продолжить без вопросов (c). Удобно отлаживать новый плейбук на тестовой машине.

Связка check mode, тегов и --limit реально экономит время на экзамене EX294. Вместо того чтобы ждать прогон на всех хостах ради одного исправления, ты бьёшь точечно по нужной задаче и нужному узлу.

Передача переменных, проверка синтаксиса и линтер

Переменные с приоритетом выше почти всех остальных передаются через -e (--extra-vars):

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

ansible-playbook site.yml -e "app_version=2.4.1 env=staging"
Можно скормить целый файл переменных, поставив перед путём собаку:

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

ansible-playbook site.yml -e @vars/prod.yml
Перед запуском полезно гонять синтаксис-проверку. Она парсит YAML и структуру плейбука, ничего не выполняя:

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

ansible-playbook site.yml --syntax-check
Этого мало для качества. Для рабочего проекта ставь ansible-lint - он ловит не синтаксис, а плохие практики: использование command вместо штатного модуля, отсутствие имён у задач, небезопасные права на файлы:

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

ansible-lint site.yml
На экзамене ansible-lint обычно не нужен, но --syntax-check - твой друг, чтобы не словить глупую ошибку отступа на проверке.

Чтение вывода и отладка модулем debug

После прогона ansible печатает PLAY RECAP - сводку по каждому хосту:

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

PLAY RECAP *********************************************************
web1.example.com : ok=8  changed=3  unreachable=0  failed=0  skipped=2  rescued=0  ignored=0
Расшифровка статусов:
  • ok - задача отработала, состояние в норме (могло уже быть нужным)
  • changed - задача внесла изменение (жёлтый цвет в выводе)
  • unreachable - до хоста не достучались (SSH, DNS, ключи)
  • failed - задача упала с ошибкой (красный)
  • skipped - задача пропущена по условию when или тегам
  • rescued / ignored - пойманные блоком rescue и проигнорированные ошибки
Идемпотентный плейбук на повторном запуске должен давать changed=0 - это признак того, что ты написал его правильно, через состояния, а не через голые команды.

Когда непонятно, что внутри переменной или факта, выручает модуль ansible.builtin.debug. Печатает значение переменной или сообщение:

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

- name: Показать факт об ОС
  ansible.builtin.debug:
    var: ansible_facts['distribution']

- name: Вывести сообщение
  ansible.builtin.debug:
    msg: "Раскатываем версию {{ app_version }} на {{ inventory_hostname }}"
Параметры var и msg взаимоисключающие - либо одно, либо другое. И есть хитрый параметр verbosity: вывод появится только при достаточном уровне -v. Это позволяет оставить отладочные задачи в плейбуке навсегда, не засоряя обычный вывод:

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

- name: Дамп всех фактов (только при -vv и выше)
  ansible.builtin.debug:
    var: ansible_facts
    verbosity: 2
При обычном запуске эта задача молчит, а при ansible-playbook site.yml -vv покажет всё. Сами уровни: -v добавляет деталей, -vvv показывает параметры подключения, -vvvv - полную SSH-отладку.

Типичные грабли
  • --check на командных модулях даёт ложные failed - ставь check_mode: false на безопасные read-only команды.
  • --start-at-task требует ТОЧНОГО имени задачи, как в name. Опечатка или другой регистр - и Ansible молча ничего не запустит.
  • --limit с опечаткой в имени хоста не ошибка, а пустой прогон: 0 хостов. Всегда сверяйся с ansible-inventory --list.
  • Забыл навесить тег на роль - и --tags её пропустит, хотя по логике она нужна. Проверяй через --list-tags.
  • Переменная из -e перебивает почти всё, включая group_vars и host_vars. Удобно для разовых запусков, опасно если забыл, что её передал.
  • changed=N на каждом повторном прогоне - звоночек, что плейбук не идемпотентен. Чаще всего виноваты command/shell без changed_when.
Мини-лаба: повтори руками

Возьми любой свой плейбук на пару задач (или собери из примеров выше) и прогони по шагам:
  • ansible-playbook site.yml --syntax-check - убедись, что синтаксис чистый.
  • ansible-playbook site.yml --check --diff - посмотри предпросмотр, ничего не меняя.
  • Навесь теги packages и firewall, запусти ansible-playbook site.yml --tags firewall.
  • Прогони --skip-tags packages и сравни PLAY RECAP.
  • Запусти на одном хосте через --limit, потом с --step, нажимая y/n/c.
  • Добавь задачу с ansible.builtin.debug и verbosity: 2, прогони обычно и с -vv - почувствуй разницу.
  • Запусти плейбук дважды подряд - на втором разе добейся changed=0.
Контрольные вопросы
  • Чем отличается --check от --diff и зачем их запускают вместе?
  • Как запустить только задачи с тегом firewall и только на хосте web1?
  • Что означает changed=5 на повторном запуске того же плейбука и хорошо ли это?
  • Как сделать так, чтобы отладочная задача debug печаталась только при -vv, но молчала при обычном запуске?
Итог

ansible-playbook - это не "запустил и жди". Сухой прогон --check с --diff даёт уверенность до изменений, теги и --limit бьют точечно, --start-at-task поднимает плейбук с места падения, а debug с verbosity помогает понять, что внутри. Чтение PLAY RECAP и охота за идемпотентностью (changed=0 на повторе) отличают рабочий плейбук от случайно сработавшего. Эти рычаги ты будешь дёргать каждый день - и они же вытащат тебя на экзамене EX294, когда время на счету.
👍6 ❤️1 🔥 😄 🤔1
Аватара пользователя
haskell_main
Сообщения: 1
Зарегистрирован: 15 май 2026, 16:46

Re: Запуск плейбуков: проверка, теги, ограничения и отладка

Сообщение haskell_main »

Спасибо, наконец дошло зачем check_mode: false на command. У меня как раз сухой прогон валился на задаче с version, думал что плейбук кривой.
👍1 ❤️ 🔥 😄 🤔
Аватара пользователя
spark22
Сообщения: 1
Зарегистрирован: 15 май 2026, 05:41

Re: Запуск плейбуков: проверка, теги, ограничения и отладка

Сообщение spark22 »

А --start-at-task реально по точному имени? Я пол-часа тупил почему ничего не запускается, оказалось регистр буквы не тот. Добавьте это в грабли пожирнее)
👍 ❤️ 🔥 😄 🤔
Ответить
← Предыдущая глава
Структура плейбука: play, task, модули и переменные
Следующая глава →
Параллелизм и порядок выполнения: forks, serial, strategy

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

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

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

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

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