Ansible
2026-02-26 18:27 Diff

При выполнении задач в плейбуках периодически возникает необходимость перезапускать какой-либо сервис. Например, при обновлении конфигурационного файла. Простое решение - написать две обычные задачи. Одна из них будет обновлять конфиг, а вторая делать рестарт. И это будет работать, но есть одна проблема: рестарт произойдет в любом случае, даже если конфиг не изменится. В некоторых случаях такое поведение нежелательно, и в принципе это не очень красиво.

Чтобы этого избежать, в Ansible существует механизм, который называется handlers. Воспользуемся им:

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

  2. Связываем таски, которые могут порождать изменения, с задачами из секции handlers. Для этого с помощью ключа notify обращаемся к хендлерам по их именам:

Теперь если задача по обновлению конфига произведет изменения, то будет вызван связанный с ней handler, который перезапустит nginx. Важно помнить, что он будет отработан не сразу, а только когда завершится весь сценарий. Это имеет значение. Ведь плейбук может содержать много задач, которые потребуют рестарта nginx. И делать это каждый раз не нужно. Достаточно будет одного перезапуска в самом конце.

Запустим наш плейбук и посмотрим, как это работает:

Как видим после изменения конфига был вызван handler:

Если же запустить сценарий повторно, то конфиг не поменяется и nginx не будет перезапущен.