Handlers в Ansible: как перезапускать сервис только при реальном изменении
Ситуация
Вчера коллега жалуется: после смены одной строчки в конфиге nginx упал прод. Сервис перезапустился, но конфигурация оказалась невалидной. Всё встало.
Звучит знакомо? Обычная история, когда хендлеры срабатывают невпопад или, наоборот, не срабатывают вовсе.
Предыстория
Я веду три десятка серверов. Раньше на каждое изменение конфига nginx или sshd я просто перезапускал сервис. Думал: главное — чтобы применилось.
Потом один раз не проверил синтаксис. Сервер nginx упал. Пришлось лезть по IPMI и вручную править файлы. Полчаса простоя.
Проблема
В Ansible по умолчанию хендлер срабатывает всегда, если его вызвали. Даже если конфиг не изменился. Или изменился, но с ошибкой.
Ещё хуже: если в одном плейбуке несколько тасок меняют разные конфиги, а хендлер один — он может перезапустить сервис раньше времени, когда другие файлы ещё не готовы.
Почему это важно?
- 🚫 Лишний перезапуск сервиса — потеря времени. На кластере из 50 машин это минуты простоя.
- 💥 Перезапуск с битой конфигурацией — падение сервиса. Особенно критично для nginx, sshd, PostgreSQL.
- 🔄 Непредсказуемый порядок выполнения — деплой становится лотереей.
Решение
Я перестал доверять дефолтным хендлерам. Теперь использую только проверенные паттерны.
Первое: всегда добавляю notify с уникальным именем. Никогда не вешаю один хендлер на разные таски, если порядок важен.
Второе: перед перезапуском делаю проверку. Для nginx — nginx -t, для sshd — sshd -t. Запускаю это как отдельную таску с changed_when: false.
Третье: использую флаг listen в хендлере. Это позволяет группировать события и запускать хендлер только после всех изменений в группе.
Хендлер должен перезапускать сервис только тогда, когда это безопасно и действительно необходимо. Иначе это не хендлер, а бомба замедленного действия.
Результат
Теперь nginx перезапускается только если конфиг реально изменился и прошёл проверку. Ни одного случайного падения за полгода.
Деплой стал предсказуемым. Я сплю спокойно, а мои серверы работают стабильно.
📬 Зв'яжіться з нами
Бажаєте впровадити це у своєму бізнесі? Пишіть нам!
- 📧 Email: [email protected]
- 🌐 Сайт: 1it.pro
- 📝 Блог: blog.1it.pro