Отправка уведомлений из Zabbix в Telegram

Как то я подумал о том, что было бы неплохо отправлять уведомления не на почту, а в Telegram
Хотелось получить что то интереснее, чем спам-рассылка по поводу и без повода. Telegram крут ещё и своими групповыми чатами (в том числе и приватными)

Установка каких либо дополнительных программ и библиотек меня вообще не впечатлила. Да и зачем всё это если можно использовать Telegram-бота и отправлять сообщения простым запросом

Первый шаг
Необходимо создать бота в Telegram. Для этого нужно добавить в список контактов бота @BotFather, сказать ему /start и /newbot
BotFather сперва спросит как назвать нового бота, а потом какое имя ему присвоить. В ответном сообщении вы получите всю необходимую информацию для его использования
Создание бота Telegram
Вы можете создать своего бота, а можете использовать моего
Познакомьтесь,
его зовут @TradeNarK_ZabbixBot
его токен 256070243:SHAAHonjepm7mzR6doFLgSNAbKg3BNJzQQm
Этого бота необходимо добавить либо к себе в список контактов либо в тот чат, куда вы планируете получать уведомления.
Эта информация нам пригодится немного позже.

Второй шаг
Для того что бы отправить сообщение себе или в чат необходимо знать ID чата или контакта
Сразу замечу, что по ID можно определить пользователь это или чат — ID чата начинается со знака «-» (минус)
Для того что бы определить ID есть специальный бот @MyTelegramID_bot. Его нужно добавить с себе в список контактов или же в чат и дать команду /start. В ответ он предоставит ID
Мой список контактов
Telegram ID
Чат для уведомлений
Group ID
Как и говорилось выше ID группы начинается со знака минус

Третий шаг
Для отправки сообщения достаточно выполнить зарос

# curl --header 'Content-Type: application/json' --request 'POST' --data '{"chat_id":"_ID_","text":"_MESSAGE_"}' "https://api.telegram.org/bot_TOKEN_/sendMessage"

где
_ID_ — ID чата или контакта полученный на втором шаге;
_MESSAGE_ — текст сообщения;
_TOKEN_ — токен бота полученный на первом шаге;

Запрос приобретает вид:

# curl --header 'Content-Type: application/json' --request 'POST' --data '{"chat_id":"1111111","text":"test message for blog https://tradenark.com.ua here"}' "https://api.telegram.org/bot256070243:SHAAHonjepm7mzR6doFLgSNAbKg3BNJzQQm/sendMessage"

и бот присылает сообщение
test message
Убедившись что вся эта кухня работает нужно написать скрипт который поможет нам в отправке.
Смотрим дефолтное расположение скриптов для отправки

# grep -i AlertScriptsPath /etc/zabbix/zabbix_server.conf | grep -v ^#
AlertScriptsPath=/usr/lib/zabbix/alertscripts

Теперь создаём скрипт в этой папке с таким содержимым:

# cat /usr/lib/zabbix/alertscripts/telegram_bot.sh
#!/bin/bash

TOKEN='256070243:SHAAHonjepm7mzR6doFLgSNAbKg3BNJzQQm'

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

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

# Определяем emoji для темы сообщения
if [[ $SUBJECT == 'PROBLEM' ]]
then
        ICON="\uD83D\uDE31"
elif [[ $SUBJECT == 'OK' ]]
then
        ICON="\uD83D\uDC4C"
else
        ICON="\u26A0"
fi

curl -s --header 'Content-Type: application/json' --request 'POST' --data "{\"chat_id\":\"${CHAT_ID}\",\"text\":\"$ICON ${SUBJECT}\n${MESSAGE}\"}" "https://api.telegram.org/bot${TOKEN}/sendMessage" | grep -q '"ok":false,'

Тут я добавил немного «развлекухи». В зависимости от темы бот будет добавлять смайлик. Как оказалось это одна из самых сложных задач. По той причине что вместо смайликов отображался текст / чистый код
Решение всё же нашлось. Для этого необходимо выбрать смайлик и определить его Unicode-формат. К примеру для обычного улыбающегося смайлика 🙂 это будет U+1F601.
Теперь на сайте fileformat.info нужно найти его перекодированное значение.
Для этого переходим по ссылке http://www.fileformat.info/info/unicode/char/1F601/index.htm и находим строку «C/C++/Java source code». В случае улыбающегося смайлика это будет «\uD83D\uDE01»
Сохраняем и делаем его исполняемым:

# chmod +x /usr/lib/zabbix/alertscripts/telegram_bot.sh

Четвёртый шаг
Необходимо научить заббикс пользоваться нашим скриптом.
Для этого нужно создать новый способ оповещения с несколькими параметрами:
Notify
Называем его как нам угодно. В поле «Имя», что бы не путаться, я использую Telegram Bot
Тип указываем «Скрипт»
В поле «Имя скрипта» вписываем только telegram_bot.sh так как скрипт находится в специально созданной для этого папке
Так же добавляем три дополнительных параметра как на скриншоте:
{ALERT.SENDTO} — кому отправлять;
{ALERT.SUBJECT} — тема сообщения;
{ALERT.MESSAGE} — текст самого сообщения;
После этого нажимаем «Добавить».

Пятый шаг
Идем в «Администрирование» — «Пользователи». Выбираем нашего пользователя — вкладка «Оповещения» — «Добавить».
В поле «Тип» выбирает тот тип, который мы создали (у меня Telrgram Bot).
В поле «Отправлять на» указываем свой ID или ID чата со второго шага.
Остальные параметры на своё усмотрение.
User notify

Шестой шаг
Идем «Настройка» — «Действие».
В графе «Источник событий» выбираем «Триггеры» и нажимаем создать.
Во вкладке «Действие» настраиваем шаблон уведомлений.
Я использую довольно сокращенный вариант по сравнению с предлагаемым по умолчанию:
Поле «Тема» — {TRIGGER.STATUS}
Поле «Сообщение по умолчанию» — {HOST.HOST} | {HOST.IP} | {TRIGGER.NAME} -> {ITEM.VALUE}
Действие
Во вкладке «Операции» жмём «Новый».
В открывшемся окне нас интересуют три главных пункта:
Тип операции — отправить сообщение;
Отправлять пользователям — выбираем своего пользователя;
Отправлять только через — выбираем метод, созданный на четвертом шаге;
Операции
В итоге получаются довольно информативные и короткие уведомления:

Так же у меня настроены уведомления о авторегистрации:

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