Есть сервер на 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
Я беспокоюсь о том, что это всё сработает как у мальчика, который кричал «Волки!». Все привыкнут, что с почты постоянно валится куча писем и что это нормальный процесс, волноваться не о чем. Поэтому хочу, чтобы штатные работы не приводили ни к каким тревогам вообще.
Можно ли это как-то реализовать на этом стеке технологий? Или я категорически неправ в своих опасениях?
Ответ
Решение
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
Комментариев нет:
Отправить комментарий