Определение обработчиков в плейбуках Ansible
Development | Комментировать запись
Ansible – это современный инструмент управления конфигурацией. Для связи и выполнения команд на управляемых серверах (нодах) он использует только SSH и Python – то есть вам не нужно устанавливать агентское программное обеспечение на удаленные ноды. В этой серии мануалов вы познакомитесь с основными функциями Ansible, которые можно использовать для написания сценариев автоматизации серверов. В конце серии вы найдете практический пример плейбука для автоматизации настройки удаленного веб-сервера Nginx и развертывания на нем статического HTML-сайта.
Примечание: Этот мануал является частью серии по работе с Ansible. Другие мануалы из этой серии вы найдете по тегу ansible-practice. Весь код можно найти в этом репозитории.
Если вкратце, обработчики – это специальные задачи, которые выполняются только при помощи директивы notify. Обработчики выполняются в конце плея, когда все другие задачи уже выполнены.
Как правило, в Ansible обработчики используются для запуска, перезагрузки, перезапуска и остановки сервисов. К примеру, если ваш сценарий предполагает изменение конфигурации, то вероятность, что вам потребуется перезапустить сервис, чтобы изменения вступили в силу, очень высока. Конечно, в таком случае вам нужно определить обработчик для этого сервиса и включить директиву notify во все задачи, для выполнения которых этот обработчик требуется.
В предыдущем разделе этой серии (Создание шаблонов в плейбуках Ansible) вы узнали, как при помощи шаблонов заменить стандартную приветственную страницу Nginx пользовательской страницей HTML. На практике при настройке веб-сервера Nginx нам, скорее всего, пришлось бы включить новые файлы (server-блоки) в каталог sites-available, создать символические ссылки или изменить настройки, требующие перезагрузки или перезапуска сервера.
В подобном сценарии обработчик перезапуска Nginx будет выглядеть так:
... handlers: - name: Restart Nginx service: name: nginx state: restarted
Чтобы вызвать этот обработчик, нужно включить директиву notify в каждую задачу, которой требуется перезапуск сервера Nginx.
Следующий плейбук заменяет стандартный корневой каталог в конфигурации Nginx с помощью встроенного модуля Ansible replace. Этот модуль ищет в файле шаблоны на основе регулярного выражения, определенного с помощью regexp, а затем заменяет любые найденные совпадения содержимым, определенным с помощью replace. Затем задача отправляет уведомление обработчику Restart Nginx для скорейшего перезапуска. При этом неважно, сколько раз вы вызываете перезапуск – он произойдет только тогда, когда все задачи будут завершены и придёт очередь обработчиков. Кроме того, если модуль не обнаружит совпадений, никакие изменения в систему не будут внесены, следовательно, и обработчик тоже не будет запущен.
Создайте новый файл playbook-12.yml в каталоге ansible-practice:
nano ~/ansible-practice/playbook-12.yml
И добавьте в новый плейбук следующие строки:
--- - hosts: all become: yes vars: page_title: My Second Landing Page page_description: This is my second landing page description. doc_root: /var/www/mypage tasks: - name: Install Nginx apt: name: nginx state: latest - name: Make sure new doc root exists file: path: "{{ doc_root }}" state: directory mode: '0755' - name: Apply Page Template template: src: files/landing-page.html.j2 dest: "{{ doc_root }}/index.html" - name: Replace document root on default Nginx configuration replace: path: /etc/nginx/sites-available/default regexp: '(\s+)root /var/www/html;(\s+.*)?$' replace: \g<1>root {{ doc_root }};\g<2> notify: Restart Nginx - name: Allow all access to tcp port 80 ufw: rule: allow port: '80' proto: tcp handlers: - name: Restart Nginx service: name: nginx state: restarted
Сохраните и закройте файл.
При использовании обработчиков важно помнить, что они запускаются только тогда, когда задача, определяющая триггер notify, вносит изменение на сервере. Давайте посмотрим на наш плейбук: при первом запуске задачи replace он изменит конфигурационный файл Nginx, и, таким образом, вызывает обработчик для перезапуска. Однако при последующих выполнениях заменяемая строка больше не присутствует в файле, а значит, задача не вносит никаких изменений – следовательно, и не вызовет обработчик.
Не забудьте указать параметр –K при запуске плейбука, поскольку для этого требуются разрешения sudo:
ansible-playbook -i inventory playbook-12.yml -u 8host -K
Вы получите такой вывод:
BECOME password: PLAY [all] ********************************************************************************************** TASK [Gathering Facts] ********************************************************************************** ok: [203.0.113.10] TASK [Install Nginx] ************************************************************************************ ok: [203.0.113.10] TASK [Make sure new doc root exists] ******************************************************************** changed: [203.0.113.10] TASK [Apply Page Template] ****************************************************************************** changed: [203.0.113.10] TASK [Replace document root on default Nginx configuration] ********************************************* changed: [203.0.113.10] TASK [Allow all access to tcp port 80] ****************************************************************** ok: [203.0.113.10] RUNNING HANDLER [Restart Nginx] ************************************************************************* changed: [203.0.113.10] PLAY RECAP ********************************************************************************************** 203.0.113.10 : ok=7 changed=4 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
Если вы внимательно посмотрите на результат, вы увидите, что обработчик Restart Nginx выполняется непосредственно в конце плея. Если сейчас вы зайдете в браузер и посетите IP-адрес вашего сервера, вы увидите следующую страницу:
My Second Landing Page This is my second landing page description.
В следующей – заключительной – части этой серии мы соединим все изученные ранее темы и составим плейбук, который автоматизирует настройку удаленного сервера Nginx для размещения статического веб-сайта HTML.
Tags: Ansible, ansible-practice