Уведомления от Zabbix в Telegram

В Интернете есть много статей про ботов в Telegram на python, bash, etc… но если вам нужна простейшая, ни от кого не зависимая уведомлялка, то читайте дальше.

Бот

Регистрируем своего бота, для этого пишем в Telegram боту @BotFather

/newbot

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

Zabbix

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

имя_вашего_бота

BotFather
Done! Congratulations on your new bot. You will find it at telegram.me/zbxmtbot. You can now add a description, about section and profile picture for your bot, see /help for a list of commands.

Use this token to access the HTTP API:
токен:бота

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

/setuserpic

BotFather
Choose a bot to change profile photo.

@имя_вашего_бота

BotFather
OK. Send me the new profile photo for the bot.

Скрипт

На Zabbix сервере добавляем скрипт, через который будут отправляться сообщения. KEY, он же токен бота берем из диалога с BotFather.

nano /usr/lib/zabbix/alertscripts/zbxtg.sh
#!/bin/bash

USERID=$1
THEME=$2
BODY=$3

KEY="токен:бота"
TIMEOUT="10"
URL="https://api.telegram.org/bot$KEY/sendMessage"

TEXT="$THEME
$BODY"

PARSEMODE="markdown"

curl -s --max-time $TIMEOUT -d "chat_id=$USERID&disable_web_page_preview=1&parse_mode=$PARSEMODE&text=$TEXT" $URL > /dev/null

Кстати, обратите внимание на вот этот кусочек кода:

TEXT="$THEME
$BODY"

Таким образом обеспечивается перенос строки, я пробовал всякие там <br>, <br />, /n, /r — ничего не работало, а вот такой перенос — работает ;-). И ещё хозяйке на заметку (хотя я это и не использую): All <, > and & symbols that are not a part of a tag or an HTML entity must be replaced with the corresponding HTML entities (< with &lt;, > with &gt; and & with &amp;).

Меняем владельца и делаем скрипт исполняемым.

chown zabbix:root /usr/lib/zabbix/alertscripts/zbxtg.sh
chmod +x /usr/lib/zabbix/alertscripts/zbxtg.sh

Параметрами $1, $2, $3 для скрипта являются получатель, тема и тело сообщения. Вы можете сами проверить как Zabbix будет дёргать скрипт, выполнив команду /usr/lib/zabbix/alertscripts/zbxtg.sh user_id message_theme message_body

Чтобы узнать свой user id, нужно найти бота в поиске в приложении Telegram или перейти по ссылке http://telegram.me/имя_бота и нажать на /start и что-нибудь ему написать, после чего зайти на https://api.telegram.org/botтокен:бота/getUpdates и увидеть факт отправки сообщения от вас боту. Сообщения будут иметь вид:

"message":{"message_id":14681,"from":{...},"chat":{"id":123456789,"first_name":"REALNAME","username":"NICKNAME","type":"private"},"date":...

Где «chat»:{«id»:123456789 и будет user id. Для группы:

"message":{"message_id":14686,"from":{...},"chat":{"id":-12345678,"title":"GROUPNAME","type":"group"},"date":...

Где user id будет: «chat»:{«id»:-12345678

Заметка: чтобы добавить бота в группу, нужно нажать на название группы в Telegram, выбрать Добавить участников и в поиске набрать имя_бота.

Оповещение

Добавляем способ оповещения, для этого идём в Администрирование — Способы оповещений, добавляем новый. Указываем Имя оповещения, Тип: Скрипт, Имя скрипта: zbxtg.sh (подразумевается, что скрипт лежит в определённой директории, которая указывается в конфиге сервера, т.е. в /etc/zabbix/zabbix_server.conf).

Дополнение для Zabbix 3.0

В третьей версии Zabbix нужно при создании media type обязательно указывать три параметра {ALERT.SENDTO}, {ALERT.SUBJECT} и {ALERT.MESSAGE}, как написано тут: https://www.zabbix.com/documentation/3.0/manual/config/notifications/media/script иначе $1..$3 не передаются в скрипт, и, соответственно, ничего не работает. Спасибо за дополнение Dmitry Burtsev и Nikolay Groo
Первоисточник: https://hellsman.ru/admin/linux/opoveshheniya-zabbix-cherez-telegram-s-pomoshhyu-telegram-botapi#hcq=NtUMuOp

Действие

Добавляем действие, для этого идём в Настройка — Действия, выбираем Источник событий — Триггеры и добавляем новое (обычно в этом разделе уже есть какое-нибудь оповещение через email или т.п.). Далее идёт самый изюм, из-за которого стоит просмотреть этот пост :-). Если событий сыпется много, то их дико неудобно воспринимать, а в телеге можно кое-как отформатировать текст, чем и воспользуемся.

Итак, Имя — названия действия
Тема по умолчанию *{HOST.NAME1} — *`{TRIGGER.STATUS}`* — {EVENT.DATE} — {EVENT.TIME}*
Сообщение по умолчанию {TRIGGER.NAME}

Если Вам нужно сообщение о восстановлении, то ставим галочку и заполняем поля аналогично. На вкладке Условия добавляем какие душе угодно зависимости: узлы/группы/шаблоны, важность триггеров, время и прочее.

На вкладке Операции добавляем операцию с шагом от 1 к 1, добавляем группы пользователей или пользователей, которым нужно отправлять сообщение (ну и вообще для которых это действие будет работать), выбираем способ оповещения в Отправлять только через. Обновляем, добавляем, сохраняем.

Длительность шага работает так: срабатывает триггер, с этого момента начинается отсчёт времени и это промежуток времени считается шагом 1. Когда отсчитывается N секунд, соответствующее длительности (по умолчанию 60 сек), наступает шаг 2 и т.д. Таким образом можно например отправлять сообщения разными способами (sms, email, etc) или определённым пользователям/группам если событие (триггер) не подтверждено в течение какого-либо времени.

Пользователь

Добавляем способ оповещения для пользователя. Для отправки сообщения в телеграмовскую группу я создал фиктивного пользователя в Zabbix и добавил ему оповещение с id группы (для групп всегда со знаком минус).

В результате получаем сообщения такого вида:

Напоследок

Дополнительный совет по поводу Telegram. Русификация: пишем @telerobot фразу locale windows ru, скачиваем файлик. По инструкции нужно зажать Alt+Shift и нажать на кнопку выбора языка в настройках, но под линуксом это не работает, поэтому заходим в настройки и просто печатаем на клавиатуре волшебное слово loadlang после чего открывается окно с выбором файла для локализации.

4 комментария

  1. Вроде и статья новая, а скрипт старый. Илья (автор) уже давно сделал скрипт на питоне. И башевый скрипт уже не поддерживает.

    1. Давно не занимаюсь этой темой, коллеги говорят что есть разные варианты, зависит от того, как именно провайдер реализовал блокировку. Лучше поискать в интернете, наверняка люди уже изобрели свои велосипеды. Вероятно проще всего проксировать трафик, либо купить дешевую виртуалку в каком-нибудь маленьком облаке и крутить бота на ней, либо оставить бота на своем сервере и сделать ему доступ в интернет через vpn к этой виртуалке (или любой другой платный = стабильно работающий vpn).

Добавить комментарий для itvdonsk Отменить ответ

Ваш e-mail не будет опубликован. Обязательные поля помечены *