Система Orphus

пятница, 11 марта 2016 г.

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

Сегодня подумал: "А почему бы не прикрутить telegram к zabbix?"... Немного погуглил... Но мне не понравились решения с установкой дополнительных программ/скриптов. Поэтому я решил реализовать это по своему: сделать бота и научить zabbix отправлять мне уведомление через него.


Шаг 1.
Для начала нужно создать бота в telegram. Для этого надо добавить в свой список контактов бота @BotFather, сказать ему "/start" и потом "/newbot". BotFather сначала спросит, как назвать нового бота, а следующим сообщением нужно ввести имя бота. В ответ BotFather пришлет token.
Вы можете либо создать своего бота либо использовать моего (все сообщения будут отправлены только вам, у меня к ним доступа нет). Звать этого бота @zabbix_notify_bot, а token у него "179320554:AAHI9AeBkptHgMIh5pVs31CRzGHV_9sG8bs". Бота нужно добавить в свой список контактов.


Шаг 2.
Чтобы можно было отправить себе сообщение, нужно знать свой Telegram ID. Для этого добавьте в свой список контактов бота @MyTelegramID_bot и скажите ему "/start". В ответ получите свой Telegram ID. Скоро он пригодится.
Если оповещение нужно слать в группу, то надо этого бота добавить в группу и сказать "/start". И далее использовать этот Telegram ID.

Шаг 3.
Для отправки сообщений достаточно дать одну команду:
curl --header 'Content-Type: application/json' --request 'POST' --data '{"chat_id":"_telegram_id_","text":"_your_message_"}' "https://api.telegram.org/bot_bot_token_/sendMessage"
, где _telegram_id_ - ваш Telegram ID, полученный на шаге 2;
_your_message_ - любое сообщение, которое бот отправит вам (для переноса строк можно использовать \n);
_bot_token_ - token бота, полученный на шаге 1.
Для отправки уведомлений из zabbix, я использую такой скрипт:
#!/bin/bash

TOKEN='179320554:AAHI9AeBkptHgMIh5pVs31CRzGHV_9sG8bs'

which curl &>/dev/null
if [ $? -ne 0 ] ; then echo 'FAIL: curl not found.' && exit 1 ; fi
if [ $# -ne 3 ] ; then echo 'FAIL: Params not defined.' && echo 'Usage: zabbix-to-telegram-notify.sh TelegramID Subject Message' && 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
Если используется прокси, то нужно добавить соответствующие параметры для curl.
Скрипт нужно положить в каталог, который указан в параметре "AlertScriptsPath" в конфиге zabbix сервера:
# grep -i AlertScriptsPath /etc/zabbix/zabbix_server.conf | grep -vE '^#'
AlertScriptsPath=/etc/zabbix/alertscripts
И сделать его исполняемым:
chmod +x /etc/zabbix/alertscripts/zabbix-to-telegram-notify.sh

Шаг 4.
Теперь нужно настроить сам zabbix, чтобы он мог пользоваться скриптом. Для начала нужно создать новый способ оповещений. Я буду рассматривать для zabbix 3+, т.к. использую его. В 2.2-2.4 разница не большая.
Идем в Администрирование - Способы оповещений, жмем кнопку "Создать способ оповещений". В поле "Имя" вводим название способа оповещения. В поле "Тип" нужно выбрать "Скрипт". В поле "Имя скрипта" нужно указать имя файла-скрипт, без пути; например, zabbix-to-telegram-notify.sh. В поле "Параметры скрипта" нужно нажать "Добавить" 3 раза и ввести в появившиеся поля {ALERT.SENDTO}, {ALERT.SUBJECT} и {ALERT.MESSAGE}. Пример:

Шаг 5.
Идем в Администрирование - Пользователи - выбираем своего пользователя - Оповещения - Добавить. В поле "Тип" выбираем только что созданный способ оповещения, например, Telegram Bot. В поле "Отправлять на" вводим свой Telegram ID, полученный на шаге 2. Остальные поля заполняем на свое усмотрение.

Шаг 6.
Идем в Настройка - Действия, в поле "Источник событий" выбираем "Триггеры" и жмем "Создать действие". На закладках "Действие" и "Условие" заполняем поля по своему усмотрению. Я в полях "Сообщение по умолчанию" и "Сообщение о восстановлении" указываю такое:
{HOST.NAME} :: {ITEM.NAME} :: {ITEM.VALUE}


Status:  {TRIGGER.STATUS}
Host:  {HOST.NAME}
Item:  {ITEM.NAME}
Value:  {ITEM.LASTVALUE}

Key:  {ITEM.KEY}

Severity: {TRIGGER.SEVERITY}

Trigger: {TRIGGER.NAME}
Description: {TRIGGER.DESCRIPTION}
Но это "на вкус и цвет".
На закладке "Операции" жмем "Новый". Выбираем пользователя. В поле "Отправить только через" выбираем созданный на шаге 4 способ оповещения, например, Telegram Bot. Жмем "Добавить" и еще раз "Добавить".


На этом все. Теперь Zabbix должен присылать уведомления в Telegram.






Информация с сайта http://blog.angel2s2.ru/.

Похожие статьи

38 коммент.:

Dmitry Paskal комментирует... понедельник, 14 марта 2016 г., 20:03:00 GMT+2

Зацени игрушку от ableev: https://github.com/ableev/Zabbix-in-Telegram

Roma Shagrov комментирует... понедельник, 14 марта 2016 г., 23:49:00 GMT+2

Это было первое, что мне гугл выдал. Но это излишне. Тут нужна только отправка сообщений от заббикса себе в телегу. А для этого достаточно одного запроса curl. Чем проще, тем лучше.

Но "Simple zabbix's management via bot's commands" выглядит интересным. Правда это пока todo и... другая история.

Dmitry Pury комментирует... четверг, 9 июня 2016 г., 11:52:00 GMT+2
Этот комментарий был удален автором.
Roma Shagrov комментирует... четверг, 9 июня 2016 г., 12:30:00 GMT+2

В скрипте ошибок нет, 100%. Возможно ваш sh криво реагирует на $#.
На счет проверки, я вас не понял.

Dmitry Pury комментирует... четверг, 9 июня 2016 г., 12:38:00 GMT+2

прошу прощения, не проснулся с утра, утро надо начинать с кофе.
Закинул готовый скрипт через sftp, но его не проверил, делал через notepad++, и как следствие символ переноса был виндовый. открыл в vi удалил их, всё работает как часы, ещё раз прошу прощения.

Roma Shagrov комментирует... четверг, 9 июня 2016 г., 12:46:00 GMT+2

С кем не бывает ;-)
Главное, что разобрались и все заработало :-)
Хорошего дня!

Vitaliy Solovev комментирует... среда, 29 июня 2016 г., 15:59:00 GMT+2

Добрый день. Пользую этот скрипт, но со своим ботом. Напрямус с сервера сообщения отправляются боту, а он их уже постит в группу телеграм. С этим все в порядке. Но при выполнении скрипта на сервере появляется отбивка FAIL: Params not defined. Usage: zabbix-to-telegram.sh TelegramID Subject Message Скрипт в нужной директории, выполняется из под sudo. Символов лишних тоже нет. В чем может быть проблема?

Roma Shagrov комментирует... среда, 29 июня 2016 г., 17:48:00 GMT+2

Добрый день.
Такое сообщение выводится, когда скрипту передано не 3 параметра, а больше или меньше трех. Наверное, у вас в Subject или Message есть пробелы. Возьмите все параметры в кавычки, т.е., например, если запустить скрипт так
zabbix-to-telegram.sh "000000" "My Subject" "My Message"
то он отработает, а если не использовать кавычки, то она сочтет, что ему передали 5 параметров и выплюнет то сообщение.

sudo для работы скрипта совсем не нужен. Скрипт прекрасно работает из под обычного пользователя.
Но если вам все же нужен sudo, попробуйте дополнительно экранировать кавычки, т.е.
zabbix-to-telegram.sh "\"000000\"" "\"My Subject\"" "\"My Message\""

Vitaliy Solovev комментирует... четверг, 30 июня 2016 г., 10:53:00 GMT+2

Решил проблему с отработкой скрипта на сервере руками - шлет сообщения независимо от наличия ковычек. в Заббиксе 3.0 настроено все по Вашей инструкции, но сообщения не приходят все равно. Права на каталог и выполнение скрипта выдал полные всем пользователям. Куда ковырять дальше теряюсь в догадках :(

Roma Shagrov комментирует... четверг, 30 июня 2016 г., 11:48:00 GMT+2

Извините, я запутался... Выше вы писали, что отправляет сообщения и они приходят, но есть ошибка при запуске руками. Сейчас вы говорите, что решили проблему отправки руками, но сообщения не приходят...
Думаю, где-то в процессе настройки или отладки закралась ошибка. Пришлите команду, которой вы запускаете скрипт (если из крона, то всю строку) и сам скрипт, который у вас на сервере лежит (в токене бота можете изменить несколько символов). Можете не почту прислать, она указана вверху.

Unknown комментирует... среда, 20 июля 2016 г., 10:18:00 GMT+2

Не приходят сообщения в группу. Не проверкой, не через забикс. Если вместо id группы ввожу ID пользователя, то все отлично работает. Настраиваю на Centos7. Помогите пожалуйста.

Roma Shagrov комментирует... среда, 20 июля 2016 г., 11:11:00 GMT+2

ID группы начинается со знака минус. Вы точно его указываете?

Роман комментирует... среда, 20 июля 2016 г., 11:41:00 GMT+2

Да. В телеграме сделал упгрейд до супер группы, ID изменился на более длинный и тоже не помогло.

Роман комментирует... среда, 20 июля 2016 г., 12:22:00 GMT+2

При проверке через команду в шаге 3 при подстановке ID группы:
{"ok":false,"error_code":400,"description":"Bad Request: chat not found"}
Если прописываю ID пользователя сообщения приходят в Telegram.

Роман комментирует... среда, 20 июля 2016 г., 12:37:00 GMT+2
Этот комментарий был удален автором.
Roma Shagrov комментирует... среда, 20 июля 2016 г., 15:48:00 GMT+2

Можете меня временно админом группы сделать? @romalll
Завтра посмотрю. Адаптер питания от ноута концы откинул.

Roma Shagrov комментирует... среда, 20 июля 2016 г., 15:48:00 GMT+2

Можете меня временно админом группы сделать? @romalll
Завтра посмотрю. Адаптер питания от ноута концы откинул.

violatordm комментирует... четверг, 21 июля 2016 г., 9:48:00 GMT+2

Из командной строки запускаю скрипт:

su zabbix telegram2.sh Telegram_id 'Test subj' 'Test message'

Результат: сообщение приходит, в логах записи есть.

В Zabbix 3.0.2 создал Способ оповещения, прописал в нём {ALERT.SENDTO}, {ALERT.SUBJECT}, {ALERT.MESSAGE}; пользователю оповещение добавил с привязкой на скрипт.

В итоге на срабатывание триггера ничего не приходит, в логе - пусто, но в Журнале действий всё нормально. Состояние - Отправлено.

В лог пишет строка:

echo "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\\\"" >> /tmp/telegram2.log

В общем, затык...

Roma Shagrov комментирует... четверг, 28 июля 2016 г., 21:21:00 GMT+2

Вы скрипт точно не меняли?

violatordm комментирует... среда, 3 августа 2016 г., 6:18:00 GMT+2

Менял немного.

#!/bin/bash

TOKEN='***'

which curl &>> /tmp/telegram2.log
if [ $? -ne 0 ] ; then echo 'FAIL: curl not found.' && exit 1 ; fi
if [ $# -ne 3 ] ; then echo 'FAIL: Params not defined.' && echo 'Usage: telegram2.sh TelegramID Subject Message' && exit 1 ; fi

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

echo $CHAT_ID >> /tmp/telegram2.log
echo $SUBJECT >> /tmp/telegram2.log
echo $MESSAGE >> /tmp/telegram2.log

date >> /tmp/telegram2.log

echo "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\\\"" >> /tmp/telegram2.log

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" >> /tmp/telegram2.log

Roma Shagrov комментирует... среда, 3 августа 2016 г., 9:14:00 GMT+2

> ... sendMessage\\\"" >> /tmp/telegram2.log

Как минимум, у вас 2 лишних бэкслэша в конце второй строки.

А что пишет в лог последняя строка (curl)? Она должна ответ сервера писать, либо ошибку. Кстати, замените в последней строке
>> /tmp/telegram2.log
на
&>> /tmp/telegram2.log
чтобы ошибки от курла тоже писались в лог.

violatordm комментирует... среда, 3 августа 2016 г., 12:54:00 GMT+2

> Как минимум, у вас 2 лишних бэкслэша в конце второй строки.

Это поправил, но оно только на запись в лог влияет.

> А что пишет в лог последняя строка (curl)?

Ответ и пишет:

{"ok":true,"result":{"message_id":18,"from":{"id":ХХХ,"first_name":"ХХХ","username":"ХХХ"},"chat":{"id":ХХХ,"first_name":"ХХХ","last_name":"ХХХ","username":"ХХХ","type":"private"},"date":1470221426,"text":"Test subj\nTest message"}}

Roma Shagrov комментирует... среда, 3 августа 2016 г., 15:00:00 GMT+2

"ok":true возвращается тогда, когда сервер телеграмм все принял и не обнаружил ошибок в запросе.
Скорее всего вы не верно указали Telegram_id в заббиксе (ведь из консоли все приходит). Если конечно этот ответ получен не от консоли.

> А что пишет в лог последняя строка (curl)?
На всякий... Имел ввиду, когда скрипт запускается заббиксом, а не через консоль.

Roma Shagrov комментирует... среда, 3 августа 2016 г., 15:00:00 GMT+2

"ok":true возвращается тогда, когда сервер телеграмм все принял и не обнаружил ошибок в запросе.
Скорее всего вы не верно указали Telegram_id в заббиксе (ведь из консоли все приходит). Если конечно этот ответ получен не от консоли.

> А что пишет в лог последняя строка (curl)?
На всякий... Имел ввиду, когда скрипт запускается заббиксом, а не через консоль.

violatordm комментирует... четверг, 4 августа 2016 г., 5:29:00 GMT+2

ID верный.
Фишка в том, что скрипт срабатывает только из командной строки. И приведённые цитаты из лога - это тоже после вызова командной строки.
А при отработке из Zabbix - молчок. Никакой записи в лог скрипта не попадает. Права на скрипт есть, никакой ошибки уведомления Zabbix не даёт.

Roma Shagrov комментирует... четверг, 4 августа 2016 г., 10:52:00 GMT+2

Получается проблема на уровне либо ФС (права, пути), либо заббикс (ошибка в настройке). Пока только одно соображение в голову приходит...
Попробуйте вот этот вариант скрипта (для отладки, что в логе?) как из консоли, так и самим заббиксом - http://pastebin.com/3Bb4yD7H

Так же можете попробовать переключиться на пользователя заббикса, например, "su zabbix -" и выполнить скрипт. У этого пользователя должен быть указан шелл в /etc/passwd, а не что-то в духе /bin/false и /bin/nologin.


Если ничего из вышесказанного не поможет, сделайте настройки по новой, внимательно проверяя все пути и поля, которые заполняете (не раз с таким сталкивался).

violatordm комментирует... четверг, 4 августа 2016 г., 11:20:00 GMT+2

С правами и настройками пути к алертскриптам всё перепроверил

Так я же и писал, что запускаю из строки:
su zabbix telegram2.sh Telegram_id 'Test subj' 'Test message'

Опять же - если бы Zabbix не мог исполнить скрипт - в Журнале оповещений ошибка бы была.

violatordm комментирует... четверг, 4 августа 2016 г., 11:43:00 GMT+2

> Попробуйте вот этот вариант скрипта (для отладки, что в логе?)

Попробовал. Та же картина.
Из командной строки запускаю - работает: и в Телеграм сообщение приходит и в логе запись.
Из Zabbix - "Состояние - Отправлено" на панели, но ни в Телеграме, ни в логах - ничего.

Roma Shagrov комментирует... четверг, 4 августа 2016 г., 12:38:00 GMT+2

Такое ощущение, что заббикс запускает какой-то другой скрипт, но не этот. Уверен, что тут надо копать либо в фс, либо в конфиге сервера заббикс, либо в настройках заббикс (веб-морда).
Если только к вам подключиться и посмотреть.

violatordm комментирует... пятница, 5 августа 2016 г., 5:35:00 GMT+2

> Такое ощущение, что заббикс запускает какой-то другой скрипт

Нет больше скриптов с таким именем.
Ладно, чёрт с ним.

Денис Прищемихин комментирует... вторник, 16 августа 2016 г., 10:44:00 GMT+2

столкнулся с проблемой, оповещения по серверам приходят в полном объёме, а вот по принтерам урезаются, при этом на почту всё приходит как надо

Roma Shagrov комментирует... среда, 17 августа 2016 г., 9:18:00 GMT+2

Как в телеге так и в консоли есть ограничения на кол-во символов.

Unknown комментирует... пятница, 19 августа 2016 г., 9:40:00 GMT+2

>У этого пользователя должен быть указан шелл в >/etc/passwd, а не что-то в духе /bin/false и >/bin/nologin.
su - username -s /bin/bash
и ничего не нужно менять в /etc/passwd

Алексей Ямщиков комментирует... пятница, 19 августа 2016 г., 9:42:00 GMT+2

> Такое ощущение, что заббикс запускает какой-то другой скрипт

Включаем дебаг левел в заббиксе на 4 уровень и не гадаем на кофейной гуще

Roma Shagrov комментирует... пятница, 19 августа 2016 г., 10:01:00 GMT+2

О! Точно! Совсем забыл об этом. Спасибо 👍

Nureke Ezy комментирует... вторник, 11 октября 2016 г., 12:21:00 GMT+2

что-то не работает.

в subject и message пробелов нет.

FAIL: Params not defined.
Usage: zabbix_bot.sh TelegramID Subject Message

Roma Shagrov комментирует... вторник, 11 октября 2016 г., 13:38:00 GMT+2

Должно быть ровно 3 параметра. Не больше, не меньше. Лучше взять их в кавычки (чтобы наверняка).

Evgeny Pestov комментирует... четверг, 23 марта 2017 г., 11:10:00 GMT+2

Большое спасибо!
Инструкция рабочая.

Отправить комментарий