Mattermost. Интеграция с Zabbix

СВК
Published

Продолжим разбираться с mattermost в части интеграции с внешними сервисами.

Часть вторая. Интеграция с Zabbix

Во второй части повествования о интеграции mattermost, речь пойдет про отправку сообщений об авариях из zabbix в mattermost. В результате поисков в сети был взят за основу вот этот скрипт. Код написан на Perl, поэтому может потребоваться доустановка перловых-пакетов. Прежде чем приступить к описанию кода (он несколько изменён по сравнению с исходным) сперва, как водится, произведём некоторые настройки.

Mattermost

Для использования механизма приёма сообщений от сторонних сервисов, требуется добавить запись входящих "хуков". Идём в настройки "Integrations"->"Incoming webhooks" и добавляем запись:

mm<em>inwebhooks</em>1.png

После, скопируем подчёркнутую ссылку для вставки в скрипт.

mm<em>inwebhooks</em>2.png

Zabbix

В интерфейсе управления zabbix через меню "Администрирование"->"Способы оповещения" добавим новый способ оповещения:

mm<em>zabbix</em>1.png

Где в параметрах скрипта следует указать:

  1. {ALERT.SENDTO}
  2. Ссылку на mattermost вэбхук (которую скопировали ранее)
  3. Имя пользователя в mattermost от которого будут приходить сообщения
  4. Ссылка на аватарку (файлик должен быть доступен по http)
  5. {ALERT.MESSAGE}

Затем, в настройках пользователя, добавим новый способ оповещения:

mm<em>zabbix</em>2.png

Где в поле "Отправить на" надо указать название канала в mattermost, куда будут сыпаться сообщения, в нашем случае это "it" (стоит заметить, что используется системное название канала). Это значение будет подставлено вместо макроса {ALERT.SENDTO}, который фигурирует в параметрах вновь созданного способа оповещения. {ALERT.MESSAGE} - это, собственно, будет само сообщение.

Исходный скрипт подвергся некоторым изменениям, это связано с тем, что используемая у нас версия zabbix сообщение отдаёт не в json (может быть это где-то настраивается). Потому код пришлось поменять. Код снабжён коментариями и сложностей в понимании вызвать не должен. На сервере, где установлен Zabbix, создаём файл /usr/lib/zabbix/alertscripts/zabbixMatterBot.pl (у меня Debian, zabbix установлен из официального репозитория) следующего содержания:

 #!/usr/bin/perl
 # https://github.com/drewbeer/zabbix-mattermost-alertscript DrewBeer
 # passes data in and curls it out via json to mattermost webhooks as attachments.
 # you can use this as you wish, free as in beer, life is that way.
 # minify your json before you set it in zabbix, it will make your life easier

 use warnings;
 use strict;
 use JSON;
 use Data::Dumper;

 # включаем режим отладки, /tmp/zabbix-mattermost.log
 my $debug = 0;
 my $logFH;
 my $zabbixData = ();

 # debug log the incoming data
 if ($debug) {
   open($logFH, '>>', '/var/log/zabbix/zabbix-mattermost.log');
   my $dump = Dumper(@ARGV);
   print $logFH "args:\n$dump\n";
 }

 # получаем данные с zabbix
 # соответственно - название канала, ссылку на mattermost, имя бота,
 # сылку на иконку, и сообщение
 my ($channel, $hook, $botName, $iconUrl, $body) = @ARGV;

 $zabbixData = $body;

 # создаем сообщение
 my $payload;

 $payload = processInternal($zabbixData);

 # Отладка
 if ($debug) {
   print $logFH "final payload: $payload\n";
 }

 # отправляем сообщение
 if ($payload) {
   sendPayload($payload);
 }

 exit;

 # процедура отправки сообщения
 # используется curl
 sub sendPayload {
   my($payload) = @_;
   my $cmd = qq( curl -s -i -X POST --data-urlencode '$payload' $hook > /dev/null);
   if ($debug) {
     $cmd = qq( curl -i -X POST --data-urlencode '$payload' $hook );
   }
   my $cmdOutput = `$cmd`;

   # final debug
   if ($debug) {
     print $logFH "curl:\n$cmd \n$cmdOutput\n";
   }
 }

 # разбираем сообщение от zabbix
 # и подготавливаем json-ответ

 sub processInternal {
   my $data = shift;
   my $attach = ();


   # заполняем требуемые поля
   $attach->{'channel'} = $channel;
   $attach->{'username'} = $botName;
   $attach->{'icon_url'} = $iconUrl;
   $attach->{'response_type'} = 'comment';
   $attach->{'text'} = $data;

   if ($debug) {
     my $body = Dumper $attach;
     print $logFH "object:\n$body\n";
   }

   my $jsonBody = encode_json $attach;

   # экранируем все кавычки
   my $jsonPayload = qq(payload=$jsonBody);

   # возвращаем готовый ответ
   return $jsonPayload;
 }

Теперь либо ждём сработку триггера, либо моделируем аварию в zabbix и получаем сообщение

mm<em>zabbix</em>messages.png

Вот и вся интеграция.