====== Управление службами с помощью модуля Ansible Service ====== ==== Параметры модуля service ==== сервиса имеет несколько различных параметров, наиболее распространенными из которых являются: * name: имя службы * enabled: определяется, должна ли служба запускаться при загрузке машины * pattern: если команда status не работает, этот параметр позволяет определить, работает служба или нет * sleep: во время действия restarted определяет темп между остановкой и запуском * state: действие над службой: запущена, остановлена, перезапущена или перезагружена (в случае изменения конфигурационного файла) ==== Варианты использования модуля ==== Модуль Service можно использовать для запуска, остановки, перезапуска или перезагрузки служб по мере необходимости, помогая автоматизировать и стандартизировать управление вашей инфраструктурой. Ниже приведен простой плейбук для запуска [[https://itsecforu.ru/2022/06/16/🌐-настройка-заголовков-безопасност/|nginx]]: --- - name: Manage Nginx service hosts: webservers tasks: - name: Ensure Nginx is running and enabled at boot ansible.builtin.service: name: nginx state: started enabled: yes Аналогичным образом, изменяя параметр state, можно останавливать и перезапускать службы. Однако использование модуля не ограничивается запуском и остановкой сервисов. Ниже приведен пример плейбука для установки и настройки nginx (упрощенный вариант): --- - name: manage services hosts: all become: true tasks: - name: Installing nginx package: - name: - nginx - name: nginx configuration template: src:nginx.conf.j2 dest: /etc/nginx/nginx.conf owner:root group:root mode: 0644 - name: Reloading the conf service: name: nginx state: reloaded - name: Verification nginx is started service: name: nginx state:started enabled: true Это простой пример использования модуля, но у него есть некоторые ограничения. Одно из них заключается в том, что наш плейбук всегда будет перезапускать службу nginx, даже если конфигурация не менялась. Один из способов избежать этого – использовать обработчики. ==== Использование обработчиков для работы с сервисом ==== Обработчики позволяют запустить действие, если задача внесла изменения в систему (статус изменился). Ansible позволяет запускать события после того, как задача прошла статус обработчика. Кроме того, хотя несколько задач могут требовать одного и того же действия, оно будет запущено только после выполнения всех блоков задачи. Таким образом, наш плейбук приобретает следующий вид: --- - name: manage services hosts: all become: true tasks: - name: nginx configuration template: src:nginx.conf.j2 dest: /etc/nginx/nginx.conf owner:root group:root mode: 0644 notify: - reload nginx - name: Verification nginx is started service: name: nginx state:started enabled: true handlers: - name: reload nginx service: name: nginx state: reloaded Как и в случае с модулем пакетов, существуют модули, специфичные для каждого типа системы инициализации, которые имеют больше возможностей: systemd и sysvinit. ==== Получение информации о сервисе: service_facts ==== Ansible предоставляет модуль service_facts, позволяющий получить множество информации о сервисе. Этот модуль не принимает никаких параметров. С другой стороны, он требует, чтобы функция gather_facts не была отключена. Например, я хочу открывать порты 80 и 443 только в том случае, если активна служба брандмауэра. Наш плейбук приобретает следующий вид: --- - name: manage services hosts: all become: true tasks: - name: nginx configuration template: src:nginx.conf.j2 dest: /etc/nginx/nginx.conf owner:root group:root mode: 0644 notify: - reload nginx - name: Gets information about a service service_facts: - name:debug debug: var: ansible_facts.services["firewalld.service"] handlers: - name: reload nginx service: name: nginx state: reloaded Сервисы добавляются в переменную ansible_facts и содержит список всех служб, установленных на машине. Поэтому, если вы хотите получить доступ к службе [[https://itsecforu.ru/2022/06/29/🖧-шпаргалка-по-firewalld/|firewalld]], вам нужно указать ansible_facts.services[«firewalld.service»]. TASK [debug] ********************************************************************************************* ok: [host1] => { "firewalld.service": { "name": "firewalld.service", "source": "systemd", "state": "running", "status": "enabled" } } Например, я могу добавить задачу, которая запускается только в том случае, если служба firewalld находится в включенном состоянии: --- - name: manage services hosts: all become: true tasks: - name: nginx configuration template: src:nginx.conf.j2 dest: /etc/nginx/nginx.conf owner:root group:root mode: 0644 notify: - reload nginx - name: Gets information about a service service_facts: - name: authorizes the https flow ansible.posix.firewalld: service: https permanent: yes state:enabled when: ansible_facts.services["firewalld.service"].status == "enabled" handlers: - name: reload nginx service: name: nginx state: reloaded