Retifff's Blog

Мой ИТ блог — пошаговые мануалы

Оповещения с разных инстансов счетчика в NetXMS разным получателям

Posted by Retifff на 08.02.2024

Введение

  1. Задача мониторинга
  2. Создание шаблонов событий (Event Template)
  3. Настройка порога (Threshold)
  4. Создание Action
  5. Notification Channels
  6. Скрипт сопоставления инстансов адресам получаетелей
  7. Правило в Event Processing Policy
  8. Тестирование оповещений

В прошлой статье я написал про мониторинг срока действия внешних сертификатов. Рассмотрим счетчик с инстансами для каждого сертификата из этой статьи. Картинка из 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.comdevops@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. Что несомненно проще, чем создавать кучу отдельных счетчиков.

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