При выполнении задач в плейбуках периодически возникает необходимость перезапускать какой-либо сервис. Например, при обновлении конфигурационного файла. Простое решение - написать две обычные задачи. Одна из них будет обновлять конфиг, а вторая делать рестарт. И это будет работать, но есть одна проблема: рестарт произойдет в любом случае, даже если конфиг не изменится. В некоторых случаях такое поведение нежелательно, и в принципе это не очень красиво.
Чтобы этого избежать, в Ansible существует механизм, который называется handlers. Воспользуемся им:
На верхнем уровне, где определены хосты и список задач, добавляем еще один ключ с именем
handlers
и внутри него описываем набор задач. Причем в данном случае обязательно, чтобы задачи содержали имя.Связываем таски, которые могут порождать изменения, с задачами из секции
handlers
. Для этого с помощью ключаnotify
обращаемся к хендлерам по их именам:
- hosts: webservers
tasks:
- name: install nginx
ansible.builtin.apt:
name: nginx
state: latest
become: yes
- name: update nginx config
ansible.builtin.copy:
src: files/nginx.conf
dest: /etc/nginx/nginx.conf
notify:
- restart nginx
become: yes
handlers:
- name: restart nginx
ansible.builtin.service:
name: nginx
state: reloaded
become: yes
Теперь если задача по обновлению конфига произведет изменения, то будет вызван связанный с ней handler, который перезапустит nginx. Важно помнить, что он будет отработан не сразу, а только когда завершится весь сценарий. Это имеет значение. Ведь плейбук может содержать много задач, которые потребуют рестарта nginx. И делать это каждый раз не нужно. Достаточно будет одного перезапуска в самом конце.
Запустим наш плейбук и посмотрим, как это работает:
ansible-playbook playbook.yml -i inventory.ini
Как видим после изменения конфига был вызван handler:
RUNNING HANDLER [restart nginx] *****************************
changed: [ec2-18-216-178-214.us-east-2.compute.amazonaws.com]
Если же запустить сценарий повторно, то конфиг не поменяется и nginx не будет перезапущен.
Самостоятельная работа
Создайте новый плейбук, опишите в нем установку и настройку Nginx для отображения HTML странички. Для этого реализуйте следующие задачи:
- Установка nginx
Копирование файла по пути /usr/share/nginx/html/index.html со следующим содержимым:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Hello World!</title> </head> <body> <h1>Hello World!</h1> </body> </html>
Содержимое этого файла будет выводиться Nginx.
Копирование файла конфигурации по адресу /etc/nginx/nginx.conf:
events { } http { server { listen 80 default_server; } }
Обработчик перезапуска сервиса Nginx, если изменился конфигурационный файл.
Файлы для копирования должны находиться в директории files/
Выполните плейбук. Если все выполнилось успешно, по адресу http://SERVER_IP должна быть доступна страница с текстом
Hello, World!
.Измените конфигурационный файл Nginx, измените
listen 80
наlisten 8080
. Выполните плейбук и откройте страницу по адресу http://SERVER_IP:8080 (с указанием порта)Залейте изменения на Github
В результате должен получиться плейбук с обработчиками, которые реагируют на изменения в основной задаче
Дополнительные материалы
Остались вопросы? Задайте их в разделе «Обсуждение»
Вам ответят команда поддержки Хекслета или другие студенты
- Статья «Как учиться и справляться с негативными мыслями»
- Статья «Ловушки обучения»
- Статья «Сложные простые задачи по программированию»
- Вебинар «Как самостоятельно учиться»
Для полного доступа к курсу нужен базовый план
Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.