Linux Labs

Автоматизация: Git и Ansible / Ступень 5 из 6

Плейбук: задачи, обработчики, шаблоны

Не запущена Запускается обычно ~20 с
Выйти из урока

Шаг 3 из 6 · на машине · 8 мин

Обработчик: перезапуск после правки

Работающая служба новый конфиг сама не перечитает. Перезапускать её нужно — но только когда конфиг поменялся.

service с state: started работающий nginx не трогает: поменяй порт в конфиге — файл обновится, а nginx продолжит слушать старый. state: restarted перезапускает его при каждом прогоне, и соединения снова рвутся.

Для этого есть обработчик — задача в отдельном разделе handlers плея. Обычная задача вызывает его строкой notify с именем обработчика:

yaml
  tasks:
    - name: Конфиг приложения
      copy:
        src: app.conf
        dest: /etc/app.conf
      notify: Перезапустить app

  handlers:
    - name: Перезапустить app
      service:
        name: app
        state: restarted

Обработчик срабатывает, только если вызвавшая его задача ответила 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, и обработчик не сработает.

Проверь себя 1 вопрос

Плейбук с обработчиком, который перезапускает nginx, прогнали, конфиг поменялся, nginx перезапустился. Что сделает следующий прогон, если плейбук и машину не трогали?

  • Конфиг на машине уже совпадает с описанием, поэтому задача ответит ok. ansible-playbook site.yml --check покажет changed=0.

  • Записанный обработчик ждёт notify от задачи, которая что-то поменяла. Без изменений строки RUNNING HANDLER в выводе не будет.

  • Обработчик можно вызывать в каждом прогоне сколько угодно раз. Здесь его просто никто не вызовет: задача ответит ok.

Обработчик срабатывает только по notify от задачи, которая ответила changed. Конфиг на машине уже такой, как в плейбуке, поэтому задача отвечает ok, nginx не трогают, и в PLAY RECAP — changed=0.

Цели шага

0 из 3
  • Перезапустить nginx обработчиком после правки конфига — ещё не выполнена
  • Перевести сайт на порт 8081 — ещё не выполнена
  • Добиться, чтобы следующий прогон ничего не менял — ещё не выполнена
Ubuntu 24.04

Цели шага

0 из 3
  • Перезапустить nginx обработчиком после правки конфига — ещё не выполнена
  • Перевести сайт на порт 8081 — ещё не выполнена
  • Добиться, чтобы следующий прогон ничего не менял — ещё не выполнена
Загрузка…