Страницы

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

вторник, 27 ноября 2018 г.

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

Есть сервер на 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

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

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