Определение обработчиков в плейбуках Ansible

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: ,

Добавить комментарий