Страницы

Поиск по вопросам

среда, 25 декабря 2019 г.

Как временно “приглушить” monit на период развертывания сервиса через ansible?

#linux #развертывание #ansible #monit


Есть сервер на linux, на нем работает некий сервис myservice, за сервисом наблюдает
monit. Сообщает на почту обо всех изменениях и при необходимости перезагружает сервис.

Есть ansible playbook, который переустанавливает сервис, конфигурирует и перезапускает.
И monit тоже конфигурирует и перезапускает при необходимости. Работает это отлично,
но плохо то, что при этом monit шлет пачку писем:


service instance пропал
service instance появился
service instance сменил PID
monit перезагрузился


Можно в роли давать monit задачу приостанавливать мониторинг, но об этой задаче он
тоже сообщает. Дважды.

- name: monit не наблюдает за myservice
  shell: monit unmonitor myservice

- name: monit наблюдает за myservice
  shell: monit monitor myservice


Можно перезапускать сервис из самого monit'a. Тогда письма приходят с менее угрожающими
заголовками, вроде Action done myservice. Но всё равно одно или два письма + одно про
релоад монита.

- name: Перезапуск myservice через monit
  shell: monit restart myservice


Я беспокоюсь о том, что это всё сработает как у мальчика, который кричал «Волки!».
Все привыкнут, что с почты постоянно валится куча писем и что это нормальный процесс,
волноваться не о чем. Поэтому хочу, чтобы штатные работы не приводили ни к каким тревогам
вообще.

Можно ли это как-то реализовать на этом стеке технологий? Или я категорически неправ
в своих опасениях?
    


Ответы

Ответ 1



Решение monit config: /etc/monit/monitrc set alert {{mail_recipient}} but not on { action, instance } ansible: Во всех командах параметр -I нужен, почему — смотри ниже. В начале установки через monit останавливаем сервис, это считается action - name: Остановка myservice через monit shell: monit -I stop myservice Потом производим всю необходимую установку и настройку. Убеждаемся, что сам monit запущен. Перезагружаем конфиги через сам monit, это событие типа instance - name: Убедиться, что monit запущен service: name=monit state=started - name: Перезагрузка конфигов monit shell: monit -I reload Потом перезагружаем сервис, это считается action - name: Перезапуск myservice через monit shell: monit -I restart myservice Конфигурация monit Получать только определенные события set alert foo@bar only on { timeout, nonexist } Получать все события кроме некоторых: set alert foo@bar but not on { instance } Подробнее про фильтрацию событий в monit: https://mmonit.com/monit/documentation/monit.html#Setting-an-event-filter Оставшиеся проблемы monit "забывает" команды, отданные после перезагрузки — решено. Разобрано в отдельном вопросе, здесь я просто добавляю -I к командам. C такой конфигурацией monit перестает сообщать об изменениях собственного instance не только на период развертывания, а вообще. То есть, если он был перезагружен вручную, либо если упал а потом был поднят при развертывании — то сообщения не будет. Можно оставить только такой конфиг: set alert {{mail_recipient}} but not on { action } Но тогда при развертывании все равно будет одно сообщение на почту про sudo monit reload. Безуспешно пробовал такую схему, она не работает. name: monit - приостановить мониторинг shell: monit unmonitor all name: monit - перезагрузка конфигов shell: monit reload name: monit - возобновить мониторинг shell: monit monitor all

Комментариев нет:

Отправить комментарий