1 min read

Handlers в Ansible: как перезапускать сервис только при реальном изменении

Handlers в Ansible: как перезапускать сервис только при реальном изменении

Ситуация

Вчера коллега жалуется: после смены одной строчки в конфиге nginx упал прод. Сервис перезапустился, но конфигурация оказалась невалидной. Всё встало.

Звучит знакомо? Обычная история, когда хендлеры срабатывают невпопад или, наоборот, не срабатывают вовсе.

Предыстория

Я веду три десятка серверов. Раньше на каждое изменение конфига nginx или sshd я просто перезапускал сервис. Думал: главное — чтобы применилось.

Потом один раз не проверил синтаксис. Сервер nginx упал. Пришлось лезть по IPMI и вручную править файлы. Полчаса простоя.

Проблема

В Ansible по умолчанию хендлер срабатывает всегда, если его вызвали. Даже если конфиг не изменился. Или изменился, но с ошибкой.

Ещё хуже: если в одном плейбуке несколько тасок меняют разные конфиги, а хендлер один — он может перезапустить сервис раньше времени, когда другие файлы ещё не готовы.

Почему это важно?

  • 🚫 Лишний перезапуск сервиса — потеря времени. На кластере из 50 машин это минуты простоя.
  • 💥 Перезапуск с битой конфигурацией — падение сервиса. Особенно критично для nginx, sshd, PostgreSQL.
  • 🔄 Непредсказуемый порядок выполнения — деплой становится лотереей.

Решение

Я перестал доверять дефолтным хендлерам. Теперь использую только проверенные паттерны.

Первое: всегда добавляю notify с уникальным именем. Никогда не вешаю один хендлер на разные таски, если порядок важен.

Второе: перед перезапуском делаю проверку. Для nginx — nginx -t, для sshd — sshd -t. Запускаю это как отдельную таску с changed_when: false.

Третье: использую флаг listen в хендлере. Это позволяет группировать события и запускать хендлер только после всех изменений в группе.

Хендлер должен перезапускать сервис только тогда, когда это безопасно и действительно необходимо. Иначе это не хендлер, а бомба замедленного действия.

Результат

Теперь nginx перезапускается только если конфиг реально изменился и прошёл проверку. Ни одного случайного падения за полгода.

Деплой стал предсказуемым. Я сплю спокойно, а мои серверы работают стабильно.


📬 Зв'яжіться з нами

Бажаєте впровадити це у своєму бізнесі? Пишіть нам!

Связаться с нами
Telegram
WhatsApp
Email