сервиса имеет несколько различных параметров, наиболее распространенными из которых являются:
Модуль 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