Mattermost. Интеграция с Zabbix
Продолжим разбираться с mattermost в части интеграции с внешними сервисами.
Часть вторая. Интеграция с Zabbix
Во второй части повествования о интеграции mattermost, речь пойдет про отправку сообщений об авариях из zabbix в mattermost. В результате поисков в сети был взят за основу вот этот скрипт. Код написан на Perl, поэтому может потребоваться доустановка перловых-пакетов. Прежде чем приступить к описанию кода (он несколько изменён по сравнению с исходным) сперва, как водится, произведём некоторые настройки.
Mattermost
Для использования механизма приёма сообщений от сторонних сервисов, требуется добавить запись входящих "хуков". Идём в настройки "Integrations"->"Incoming webhooks" и добавляем запись:
После, скопируем подчёркнутую ссылку для вставки в скрипт.
Zabbix
В интерфейсе управления zabbix через меню "Администрирование"->"Способы оповещения" добавим новый способ оповещения:
Где в параметрах скрипта следует указать:
- {ALERT.SENDTO}
- Ссылку на mattermost вэбхук (которую скопировали ранее)
- Имя пользователя в mattermost от которого будут приходить сообщения
- Ссылка на аватарку (файлик должен быть доступен по http)
- {ALERT.MESSAGE}
Затем, в настройках пользователя, добавим новый способ оповещения:
Где в поле "Отправить на" надо указать название канала в 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 и получаем сообщение
Вот и вся интеграция.