Управление службами с помощью модуля Ansible Service

сервиса имеет несколько различных параметров, наиболее распространенными из которых являются:

  • name: имя службы
  • enabled: определяется, должна ли служба запускаться при загрузке машины
  • pattern: если команда status не работает, этот параметр позволяет определить, работает служба или нет
  • sleep: во время действия restarted определяет темп между остановкой и запуском
  • state: действие над службой: запущена, остановлена, перезапущена или перезагружена (в случае изменения конфигурационного файла)

Модуль Service можно использовать для запуска, остановки, перезапуска или перезагрузки служб по мере необходимости, помогая автоматизировать и стандартизировать управление вашей инфраструктурой.

Ниже приведен простой плейбук для запуска 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.

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 и содержит список всех служб, установленных на машине.

Поэтому, если вы хотите получить доступ к службе 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