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>