Продолжим разбираться с 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 и получаем сообщение

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