Работающая служба новый конфиг сама не перечитает. Перезапускать её нужно — но только когда конфиг поменялся.
service с state: started работающий nginx не трогает: поменяй порт в конфиге — файл обновится, а nginx продолжит слушать старый. state: restarted перезапускает его при каждом прогоне, и соединения снова рвутся.
Для этого есть обработчик — задача в отдельном разделе handlers плея. Обычная задача вызывает его строкой notify с именем обработчика:
Обработчик срабатывает, только если вызвавшая его задача ответила changed, и один раз — в конце плея, после всех задач. В выводе это строка RUNNING HANDLER (в Вики).
Перезапусти nginx обработчиком
Коллега поменял в плейбуке ~/ansible-lab/site.yml порт сайта на 8081, а nginx пока слушает 8080. Добавь в плейбук обработчик, который перезапускает nginx, вызови его из задачи с конфигом и только потом прогони плейбук. Сайт должен ответить на http://127.0.0.1:8081/, а следующий прогон — ничего не менять.
Цели · 0 из 3
- Перезапустить nginx обработчиком после правки конфига ещё не выполнена
- Перевести сайт на порт 8081 ещё не выполнена
- Добиться, чтобы следующий прогон ничего не менял ещё не выполнена
Раз обработчик ждёт конца плея, notify у нескольких задач — скажем, у конфига и у файла с сертификатом — всё равно даёт один запуск обработчика: две правки — один перезапуск. А когда задача отвечает ok, обработчик молчит, и прогон без правок ничего не перезапускает.
Обработчик видит только изменения своего прогона. Если правку уже применил прогон без notify, следующий прогон увидит файл на месте — задача ответит ok, и обработчик не сработает.
Плейбук с обработчиком, который перезапускает nginx, прогнали, конфиг поменялся, nginx перезапустился. Что сделает следующий прогон, если плейбук и машину не трогали?
-
Конфиг на машине уже совпадает с описанием, поэтому задача ответит
ok.ansible-playbook site.yml --checkпокажетchanged=0. -
Записанный обработчик ждёт
notifyот задачи, которая что-то поменяла. Без изменений строкиRUNNING HANDLERв выводе не будет. -
Обработчик можно вызывать в каждом прогоне сколько угодно раз. Здесь его просто никто не вызовет: задача ответит
ok.
Обработчик срабатывает только по notify от задачи, которая ответила changed. Конфиг на машине уже такой, как в плейбуке, поэтому задача отвечает ok, nginx не трогают, и в PLAY RECAP — changed=0.