Как просмотреть статус единой службы через Ansible с модулями, а не оболочкой?

#ansible #ansible-2.x #ansible-facts

#ansible #ansible-2.x #ansible-факты

Вопрос:

Необходимо проверить статус единой службы в нескольких системах с помощью Ansible playbook, есть ли способ сделать это с использованием сервисных модулей, а не модуля оболочки?

Ответ №1:

С помощью service модуля (и связанных с ним более специфических модулей, таких как systemd ) вы можете убедиться, что служба находится в желаемом состоянии.

Например, следующая задача позволит запустить apache при загрузке, если он еще не настроен, запустить apache, если он остановлен, и сообщить об изменении, если было внесено какое-либо изменение, или ok, если никаких изменений не требовалось.

 - name: Enable and start apache
  service:
    name: apache
    enabled: yes
    state: started
  

Простая проверка статуса службы без каких-либо изменений не поддерживается этими модулями. Вам придется использовать командную строку и проанализировать статус вывода / возврата.

пример с systemd

 - name: Check status of my service
  command: systemctl -q is-active my_service
  check_mode: no
  failed_when: false
  changed_when: false
  register: my_service_status

- name: Report status of my service
  debug:
    msg: "my_service is {{ (my_service_status.rc == 0) | ternary('Up', 'Down') }}"
  

Следует отметить:

  • check_mode: no запустите задачу независимо от того, используете вы ‘—check’ в командной строке ansible_playbook или нет. Без этого в режиме проверки следующая задача завершится неудачей с неопределенной переменной.
  • failed_when: false предотвращает сбой задачи, когда код возврата отличается от 0 (когда служба не запущена). Вы можете быть более конкретными, перечислив все возможные коды возврата в обычных условиях и выполнив сбой при получении другого (например failed_when: not (my_service_status in [0, 3, X]) )
  • changed_when: false позволяет задаче всегда сообщать о порядке, за исключением changed по умолчанию для команд и модуля оболочки.