Оповещения Zabbix в Telegram

В статье описывается создание телеграм-бота, который будет присылать оповещение о событиях заббикс-сервера в телеграм.

Для Zabbix версий от 5.х

Для Zabbix версий до 5.х (хотя и в 5-й так тоже можно, но там можно проще)

Найти в поиске бота с ником @BotFather и добавить его к себе. Дать команду /newbot и создать нового бота.

YOU:
/newbot

BotFather:
Alright, a new bot. How are we going to call it? Please choose a name for your bot.

YOU:
bot_name

BotFather:
Good. Now let's choose a username for your bot. It must end in `bot`. Like this, for example: TetrisBot or tetris_bot.

YOU:
bot_name_bot

BotFather:
Done! Congratulations on your new bot. You will find it at t.me/bot_name_bot. You can now add a description, about section and profile picture for your bot, see /help for a list of commands. By the way, when you've finished creating your cool bot, ping our Bot Support if you want a better username for it. Just make sure the bot is fully operational before you do this.

Use this token to access the HTTP API:
993279574:AAGPAGf8V1Ct3P-qD04BzmvpOnv34t

For a description of the Bot API, see this page: https://core.telegram.org/bots/api

Создаём группу и добавляем туда созданного бота. Выполняем запрос вида:

https://api.telegram.org/bot993279574:AAGPAGf8V1Ct3P-qD04BzmvpOnv34t/getUpdates

Он должен вернуть ответ, где среди всего содержимого есть

"chat":{"id":-234204777

Если такого содержимого нет, то надо удалить бота и добавить его в группу снова, и повторить выполнение запроса.

Создать скрипт в каталоге /usr/lib/zabbix/alertscripts (для Debian) и подставить свой токен.

#!/bin/bash
TOKEN='993279574:AAGPAGf8V1Ct3P-qD04BzmvpOnv34t'

if [ $# -ne 3 ] ; then echo 'Error! You must to define three params' && exit 1 ; fi

CHAT_ID="$1"
SUBJECT="$2"
MESSAGE="$3"

curl -s --header 'Content-Type: application/json' --request 'POST' --data "{\"chat_id\":\"${CHAT_ID}\",\"text\":\"${SUBJECT}\n${MESSAGE}\"}" "https://api.telegram.org/bot${TOKEN}/sendMessage" | grep -q '"ok":false,'
if [ $? -eq 0 ] ; then exit 1 ; fi

Создаём новый способ оповещения типа «Script».

Перейти в Настройки — Действия. Если есть стандартная настройка отправки сообщений всем через все возможные варианты оповещения (All Media), то можно ничего не менять.

Переходим в Профиль пользователя > Оповещения и добавляем/редактируем новую запись

Теперь все оповещения приходят в группу.

 


Для Zabbix версий от 5.х

Для пятой версии Zabbix и выше действия по настройке почти такие же как выше. Бот и чат (если необходим чат) создаются так же. А вот уже способ оповещения будет создан немного по другому.

Итак, если бот уже создан и есть id чата, то идём в заббикс и оформляем тип оповещения Webhook.

Код скрипта вставляется через веб-интерефейс:

var Telegram = {
token: null,
to: null,
message: null,
proxy: null,
parse_mode: null,

sendMessage: function() {
var params = {
chat_id: Telegram.to,
text: Telegram.message,
disable_web_page_preview: true,
disable_notification: false
},
data,
response,
request = new CurlHttpRequest(),
url = 'https://api.telegram.org/bot' + Telegram.token + '/sendMessage';

if (Telegram.parse_mode !== null) {
params['parse_mode'] = Telegram.parse_mode;
}

if (Telegram.proxy) {
request.setProxy(Telegram.proxy);
}

request.AddHeader('Content-Type: application/json');
data = JSON.stringify(params);

// Remove replace() function if you want to see the exposed token in the Log file.
Zabbix.Log(4, '[Telegram Webhook] URL: ' + url.replace(Telegram.token, ''));
Zabbix.Log(4, '[Telegram Webhook] params: ' + data);
response = request.Post(url, data);
Zabbix.Log(4, '[Telegram Webhook] HTTP code: ' + request.Status());

try {
response = JSON.parse(response);
}
catch (error) {
response = null;
}

if (request.Status() !== 200 || typeof response.ok !== 'boolean' || response.ok !== true) {
if (typeof response.description === 'string') {
throw response.description;
}
else {
throw 'Unknown error. Check debug Log for more information.'
}
}
}
}

try {
var params = JSON.parse(value);

if (typeof params.Token === 'undefined') {
throw 'Incorrect value is given for parameter "Token": parameter is missing';
}

Telegram.token = params.Token;

if (params.HTTPProxy) {
Telegram.proxy = params.HTTPProxy;
}

if (['Markdown', 'HTML', 'MarkdownV2'].indexOf(params.ParseMode) !== -1) {
Telegram.parse_mode = params.ParseMode;
}

Telegram.to = params.To;
Telegram.message = params.Subject + '\n' + params.Message;
Telegram.sendMessage();

return 'OK';
}
catch (error) {
Zabbix.Log(4, '[Telegram Webhook] notification failed: ' + error);
throw 'Sending failed: ' + error + '.';
}

Остальные настройки на отправку сообщения, назначение пользователям заббикса такие же, как и для 4й версии.


Использовал материал с https://xakinfo.ru/. Там использован другой скрипт и отправка сообщение идёт не в группу, ну суть та же. Зато там скрипт вроде как отправляет графики.

Добавить комментарий