HTML Diff
0 added 0 removed
Original 2026-01-01
Modified 2026-02-26
1 <p>При выполнении задач в плейбуках периодически возникает необходимость перезапускать какой-либо сервис. Например, при обновлении конфигурационного файла. Простое решение - написать две обычные задачи. Одна из них будет обновлять конфиг, а вторая делать рестарт. И это будет работать, но есть одна проблема: рестарт произойдет в любом случае, даже если конфиг не изменится. В некоторых случаях такое поведение нежелательно, и в принципе это не очень красиво.</p>
1 <p>При выполнении задач в плейбуках периодически возникает необходимость перезапускать какой-либо сервис. Например, при обновлении конфигурационного файла. Простое решение - написать две обычные задачи. Одна из них будет обновлять конфиг, а вторая делать рестарт. И это будет работать, но есть одна проблема: рестарт произойдет в любом случае, даже если конфиг не изменится. В некоторых случаях такое поведение нежелательно, и в принципе это не очень красиво.</p>
2 <p>Чтобы этого избежать, в Ansible существует механизм, который называется<em>handlers</em>. Воспользуемся им:</p>
2 <p>Чтобы этого избежать, в Ansible существует механизм, который называется<em>handlers</em>. Воспользуемся им:</p>
3 <ol><li><p>На верхнем уровне, где определены хосты и список задач, добавляем еще один ключ с именем handlers и внутри него описываем набор задач. Причем в данном случае обязательно, чтобы задачи содержали имя.</p>
3 <ol><li><p>На верхнем уровне, где определены хосты и список задач, добавляем еще один ключ с именем handlers и внутри него описываем набор задач. Причем в данном случае обязательно, чтобы задачи содержали имя.</p>
4 </li>
4 </li>
5 <li><p>Связываем таски, которые могут порождать изменения, с задачами из секции handlers. Для этого с помощью ключа notify обращаемся к хендлерам по их именам:</p>
5 <li><p>Связываем таски, которые могут порождать изменения, с задачами из секции handlers. Для этого с помощью ключа notify обращаемся к хендлерам по их именам:</p>
6 </li>
6 </li>
7 </ol><p>Теперь если задача по обновлению конфига произведет изменения, то будет вызван связанный с ней<em>handler</em>, который перезапустит nginx. Важно помнить, что он будет отработан не сразу, а только когда завершится весь сценарий. Это имеет значение. Ведь плейбук может содержать много задач, которые потребуют рестарта nginx. И делать это каждый раз не нужно. Достаточно будет одного перезапуска в самом конце.</p>
7 </ol><p>Теперь если задача по обновлению конфига произведет изменения, то будет вызван связанный с ней<em>handler</em>, который перезапустит nginx. Важно помнить, что он будет отработан не сразу, а только когда завершится весь сценарий. Это имеет значение. Ведь плейбук может содержать много задач, которые потребуют рестарта nginx. И делать это каждый раз не нужно. Достаточно будет одного перезапуска в самом конце.</p>
8 <p>Запустим наш плейбук и посмотрим, как это работает:</p>
8 <p>Запустим наш плейбук и посмотрим, как это работает:</p>
9 <p>Как видим после изменения конфига был вызван handler:</p>
9 <p>Как видим после изменения конфига был вызван handler:</p>
10 <p>Если же запустить сценарий повторно, то конфиг не поменяется и nginx не будет перезапущен.</p>
10 <p>Если же запустить сценарий повторно, то конфиг не поменяется и nginx не будет перезапущен.</p>