Иногда при запуске какого-либо Ansible Playbook у вас будут задачи, которые нужно выполнить если только предшествующая им задача была выполнена (этакая реализация условия if).
Для примера у вас есть Ansible Playbook где вы ставите nginx
последней версии и перезапускаете службу nginx
.
tasks:
- name: Install nginx
yum:
name: nginx
state: latest
- name: Restart nginx
service:
name: nginx
state: restarted
При первом запуске Ansible Playbook всё пройдёт по плану у вас установиться nginx
и перезапуститься служба. Но представим ситуации что вы запускаете эту задачу повторно (возможно в надежде что вышла более новая версия nginx
), и в таком случае может получиться что nginx
у вас последней версии и установка будет пропущена, но сервис всё также перезапуститься. Логично в такой ситуации перезапускать сервис только если он был установлен либо обновлён. Для этого нам понадобится handlers, который вызывается с использованием notify.
tasks:
- name: Install nginx
yum:
name: nginx
state: latest
notify: Restart nginx
handlers:
- name: Restart nginx
service:
name: nginx
state: restarted
В такой реализации перезапуск сервиса будет только после того как сам сервис установился либо обновился, т.е задача Install nginx
отработала.
По умолчанию handlers запускаются после того, как все задачи в конкретном Ansible Playbook были выполнены. Если вам нужно запустить handlers раньше восспользуйтесь млдулем meta.
tasks:
- name: Install nginx
yum:
name: nginx
state: latest
notify: Restart nginx
- name: Flush handlers
meta: flush_handlers
- name: Second task
yum:
name: vim
state: latest
handlers:
- name: Restart nginx
service:
name: nginx
state: restarted
Для того, чтобы использовать handlers ролях прописываем их в файле roles/rolename/handlers/main.yml
.
Комментарии