====== Управление службами с помощью модуля 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