Оповещения с разных инстансов счетчика в NetXMS разным получателям
Posted by Retifff на 08.02.2024
Введение
- Задача мониторинга
- Создание шаблонов событий (Event Template)
- Настройка порога (Threshold)
- Создание Action
- Notification Channels
- Скрипт сопоставления инстансов адресам получаетелей
- Правило в Event Processing Policy
- Тестирование оповещений
В прошлой статье я написал про мониторинг срока действия внешних сертификатов. Рассмотрим счетчик с инстансами для каждого сертификата из этой статьи. Картинка из Data Collection Configuration:
Как происходит весь процесс генерации аларма и отсылки оповещений в NetXMS? У нас есть родительский счетчик (Data Collection Item — DCI), который формирует несколько дочерних счетчиков — инстансов, каждый со своим сертификатом. На каждом все настройки идентичные родительскому — интервал опроса, порог, аларм, комментарий и т.п. Различие только в инстансе, т.е. в конкретном сертификате и в значении (в данном случае — количество оставшихся дней) счетчика. По установленному порогу формируется событие, по событию в Event Processing Policy (EPP) генерируется Alarm и выполняется Server Action — отсылка письма. На один и тот же адрес. Ну или на один и тот же набор адресов или групп рассылки.
Проблема в том, что сертификатов много, а вот получатели у них могут быть разные. Т.е. есть в компании какие-то отделы, группы, у которых какие-то свои наборы сертификатов. Мониторить их нужно нам, а посылать оповещения по каждой группе сертификатов нужно соответствующим группам.
Какие могут быть выходы из этого положения? Можно, к примеру, под каждую группу создать уникальный Event Template и в Event Processing Policy сделать отдельное правило, которое будет обрабатывать именно этот Event. В Action Configuration, соответственно, должен быть отдельный Action на каждую группу получателей (чтобы указать различные почтовые адреса получателей). Ну так себе решение, конечно, не масштабируемое. Если сертификатов и получателей много, вручную городить кучу шаблонов событий и правил EPP как-то совсем некрасиво.
Можно вешать счетчик для каждой группы сертификатов на отдельную ноду. В EPP аналогично отдельное правило для этой ноды, в Action Configuration отдельный Action, всё почти также, как в предыдущем случае. Ну и вывод такой же, впрочем.
Естественно, я это всё к тому, что есть более элегантное решение (не без скриптов, надо признать) и дальше оно и будет описано.
1 Задача мониторинга
Для начала возьмем счетчик со скриптом из предыдущей статьи (придется всю вторую часть той статьи повторить, для того, чтобы что-то сделать в этой):
который мониторит четыре сертификата на внешних хостах:
netxms.com
netxms.org
ya.ru
google.com
Пусть у нас будет две группы получателей, одна, к примеру, программисты, а вторая — девопсы. Сведу в небольшую табличку, кому что надо мониторить и их адреса:
Параметры/группы | Программисты | Девопсы |
Отслеживаемые сертификаты | netxms.com netxms.org | ya.ru google.com |
Адрес получателя | programmers@test-company.mooo.com | devops@test-company.mooo.com |
Т.е. надо, чтобы группа программистов получала оповещения по истечению срока действия сертификатов на хостах netxms.com и netxms.org, а группа девопсов на хостах ya.ru и google.com. Всё, ТЗ готово.
2 Создание шаблонов событий (Event Template)
Для начала создадим свои шаблоны событий для сертификатов, для каких-то нестандартных вещей свои удобнее.
Идем в меню Configuration > Event Templates и создаем два шаблона событий, CertificateExpireDateExternal_Threshold_Activate и CertificateExpireDateExternal_Threshold_Deactivate (имена можете задать любые, я привел свои в качестве примера). Заполняем поля Event name, Message, выставляем Severity.
Первый шаблон, активация, статус Warning:
Второй шаблон, деактивация, normal:
%6 в поле «Message» — это макрос, куда должен будет подставиться инстанс — имя сертификата и дата.
3 Настройка порога (Threshold)
Дальше идем в свойства счётчика (родительского, естественно) и там на вкладке Thresholds добавляем порог:
В поле Value ставим количество дней, за которое требуется предупреждать об том, что срок действия сертификата подходит к концу. Обычно за месяц, поэтому 30.
В поле Activation event ставим наш созданный эвент CertificateExpireDateExternal_Threshold_Activate, а в поле Deactivation event, соответственно — CertificateExpireDateExternal_Threshold_Deactivate.
Repeat event — это раз в какое время будет повторяться этот эвент (и, соответственно, отрабатывать EPP и посылаться оповещение). Для сертификатов я обычно ставлю раз в сутки, это как раз 86400 секунд.
Пока никаких отличий от настройки обычных счетчиков нет. Но сейчас они будут 🙂
4 Создание Action
Идем в Action Configuration и создаем Action такого содержания:
В поле Name — пишем какое-то понятное имя для экшена, у меня это «E-Mail sent to Many Groups — Certificate External — Alert».
Селектор Type ставим на «Send notification», Channel name — «SMTP-Text».
А вот в поле Recipient’s address мы ставим не адреса, а макрос:
%[Get_Recipients]
Поля Subject и Message text заполняете как вам удобно, а удобно там использовать макросы, чтобы получать в письме нужную информацию. У меня это
Внимание! %m. Статус: %S.
и
%N \nСобытие: %m \nВремя: %t \nСтатус: %S \nСертификат: %<instance>
соответственно.
Сразу предлагаю создать оповещение для резолва аларма, хотя это и не обязательно. Можно клонировать этот Action, изменить в клоне название на, допустим, «E-Mail sent to Many Groups — Certificate External — Resolve», и в поле Subject, в котором для того, чтобы было понятней, написать:
Решено. %m. Статус: %S.
Остальное можно не трогать.
5 Notification Channels
Тут я должен сделать небольшое отступление и рассказать о поле «Channel name» в Action. Я как-то упустил момент, когда оно появилось, приблизительно с 4-й версии NetXMS где-то. При обновлении всё смигрировалось и даже не заметил, что стало по-другому, подумаешь, какое-то новое поле 🙂 Но нет. Как оказалось, туда из Server Configuration переехали настройки SMTP-сервера, на который уходят оповещения из NetXMS.
Идем в меню Configuration > Notification Channels. Там видим два элемента, SMTP-Text и SMTP-HTML:
Открываем SMTP-Text и в Driver Configuration видим такое содержимое:
Server=localhost
RetryCount=1
Port=25
LocalHostName=
FromName=NetXMS Server
FromAddr=netxms@localhost
MailEncoding=utf8
IsHTML=no
Естественно, туда надо прописать параметры своего почтового сервера, если вы это не сделали раньше. У меня это выглядит как-то так:
Этих каналов оповещений можно создавать сколько угодно и не только для почты, но и для SMS, Telegram, MS Teams и т.п., вариантов много. Получается, что для разных оповещений можно указать разные почтовые серверы (и не только почтовые серверы).
Мне пока достаточно и SMTP, поэтому дальше я пишу именно про SMTP оповещения. Обратите внимание, что вы можете видеть, успешно ли у вас уходят оповещения по этим каналам и их общее количество, статус, наличие ошибок и т.п. Очень удобно, на мой взгляд.
6 Скрипт сопоставления инстансов адресам получаетелей
Возвращаемся обратно к нашим сертификатам. Идём в Script Library и вот там будет основная часть магии. Создаем новый скрипт, название его должно совпадать с именем макроса в квадратных скобках, который мы создавали на шаге 4, у меня это Get_Recipients:
Содержимое скрипта будет выглядеть примерно таким образом:
if ($event and $event->dci) {
if ($event->dci->instance ilike "*netxms.com*"){return "programmers@test-company.mooo.com";}
if ($event->dci->instance ilike "*netxms.org*"){return "programmers@test-company.mooo.com";}
if ($event->dci->instance ilike "*ya.ru*") {return "devops@test-company.mooo.com";}
if ($event->dci->instance ilike "*google.com*"){return "devops@test-company.mooo.com";}
}
return "";
В каждой строчке мы пишем имя хоста сертификата и почтовый адрес получателя (или получателей, через точку с запятой) оповещений по этому сертификату. В NetXMS это выглядит более красиво:
7 Правило в Event Processing Policy
Далее, нам нужно всё это объединить и делать это мы будем в Event Processing Policy (EPP). Создаем новое правило, открываем на редактирование и заполняем:
- Condition > Source Objects — туда добавляем нашу ноду, у меня это dc01.
- Condition > Events — добавляем наш эвент активации — CertificateExpireDateExternal_Threshold_Activate.
- Action > Alarm — Выбираем «Create new alarm» и заполняем согласно скриншота:
где в полях Message и Alarm Key можно использовать макросы: Macros for Event Processing. У меня это, соответственно:
- Message — %m Сертификат: %<instance>
- Alarm key — Certificate_Expire_Date_External_Alert_%n_%i
Далее:
- Server Actions — добавляем наш созданный в пункте Action «E-Mail sent to Many Groups — Certificate External — Alert».
- Comments — название правила, у меня это «Certificate Expire Date External Many Recipients ALERT».
Теперь создадим правило для автоматического резолва события, хотя это необязательно, можно и вручную резолвить. Чтобы создать правило для резолва события, легче всего скопировать только что созданное правило для алерта, вставить его и немного поправить следующие моменты:
- Condition > Events — меняем эвент на «CertificateExpireDateExternal_Threshold_Deactivate».
- Action > Alarm — меняем на «Resolve alarms». Обратите внимание, что там в поле Resolve all alarms with key должен остаться такой же ключ, как и в предыдущем правиле — «Certificate_Expire_Date_External_Alert_%n_%i», иначе наше правило не будет резолвить его.
- Server Actions — меняем на «E-Mail sent to Many Groups — Certificate External — Resolve».
- Comments — меняем имя правила на «Certificate Expire Date External Many Recipients Resolve».
Два этих правила в EPP выглядят примерно так:
В принципе всё. Переходим к тестированию.
8 Тестирование оповещений
Чтобы протестировать, всё ли правильно настроено, надо увеличить порог в родительском счетчике. Сейчас у меня в колонке Value такое количество дней до истечения срока действия сертификата:
Возьмем такую цифру, чтобы туда попали обе группы и программисты и девопсы. Ну например 55, чтобы попали не все. Получается, попадут сертификаты с хостов netxms.org, netxms.com и google.com. После того, как я в родительском счетчике поменял порог на 55 и немного подождал, во-первых, сработал порог:
А во-вторых, пришли письма:
Всё так, как и задумывалось, netxms.com — на адрес programmers@test-company.mooo.com, google.com — на адрес devops@test-company.mooo.com.
В итоге, у нас получается, что вносить имена хостов сертификатов нам нужно будет в два места — powershell-скрипт «NetXMS_CheckExternalCertificateExpiration.ps1» и имена хостов сертификатов и адреса получателей в скрипт «Get_Recipients» в Script Library NetXMS. Что несомненно проще, чем создавать кучу отдельных счетчиков.
Оставьте комментарий