Шаг 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/.
44 коммент.:
Зацени игрушку от ableev: https://github.com/ableev/Zabbix-in-Telegram
Это было первое, что мне гугл выдал. Но это излишне. Тут нужна только отправка сообщений от заббикса себе в телегу. А для этого достаточно одного запроса curl. Чем проще, тем лучше.
Но "Simple zabbix's management via bot's commands" выглядит интересным. Правда это пока todo и... другая история.
В скрипте ошибок нет, 100%. Возможно ваш sh криво реагирует на $#.
На счет проверки, я вас не понял.
прошу прощения, не проснулся с утра, утро надо начинать с кофе.
Закинул готовый скрипт через sftp, но его не проверил, делал через notepad++, и как следствие символ переноса был виндовый. открыл в vi удалил их, всё работает как часы, ещё раз прошу прощения.
С кем не бывает ;-)
Главное, что разобрались и все заработало :-)
Хорошего дня!
Добрый день. Пользую этот скрипт, но со своим ботом. Напрямус с сервера сообщения отправляются боту, а он их уже постит в группу телеграм. С этим все в порядке. Но при выполнении скрипта на сервере появляется отбивка FAIL: Params not defined. Usage: zabbix-to-telegram.sh TelegramID Subject Message Скрипт в нужной директории, выполняется из под sudo. Символов лишних тоже нет. В чем может быть проблема?
Добрый день.
Такое сообщение выводится, когда скрипту передано не 3 параметра, а больше или меньше трех. Наверное, у вас в Subject или Message есть пробелы. Возьмите все параметры в кавычки, т.е., например, если запустить скрипт так
zabbix-to-telegram.sh "000000" "My Subject" "My Message"
то он отработает, а если не использовать кавычки, то она сочтет, что ему передали 5 параметров и выплюнет то сообщение.
sudo для работы скрипта совсем не нужен. Скрипт прекрасно работает из под обычного пользователя.
Но если вам все же нужен sudo, попробуйте дополнительно экранировать кавычки, т.е.
zabbix-to-telegram.sh "\"000000\"" "\"My Subject\"" "\"My Message\""
Решил проблему с отработкой скрипта на сервере руками - шлет сообщения независимо от наличия ковычек. в Заббиксе 3.0 настроено все по Вашей инструкции, но сообщения не приходят все равно. Права на каталог и выполнение скрипта выдал полные всем пользователям. Куда ковырять дальше теряюсь в догадках :(
Извините, я запутался... Выше вы писали, что отправляет сообщения и они приходят, но есть ошибка при запуске руками. Сейчас вы говорите, что решили проблему отправки руками, но сообщения не приходят...
Думаю, где-то в процессе настройки или отладки закралась ошибка. Пришлите команду, которой вы запускаете скрипт (если из крона, то всю строку) и сам скрипт, который у вас на сервере лежит (в токене бота можете изменить несколько символов). Можете не почту прислать, она указана вверху.
Не приходят сообщения в группу. Не проверкой, не через забикс. Если вместо id группы ввожу ID пользователя, то все отлично работает. Настраиваю на Centos7. Помогите пожалуйста.
ID группы начинается со знака минус. Вы точно его указываете?
Да. В телеграме сделал упгрейд до супер группы, ID изменился на более длинный и тоже не помогло.
При проверке через команду в шаге 3 при подстановке ID группы:
{"ok":false,"error_code":400,"description":"Bad Request: chat not found"}
Если прописываю ID пользователя сообщения приходят в Telegram.
Можете меня временно админом группы сделать? @romalll
Завтра посмотрю. Адаптер питания от ноута концы откинул.
Можете меня временно админом группы сделать? @romalll
Завтра посмотрю. Адаптер питания от ноута концы откинул.
Из командной строки запускаю скрипт:
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
В общем, затык...
Вы скрипт точно не меняли?
Менял немного.
#!/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
> ... sendMessage\\\"" >> /tmp/telegram2.log
Как минимум, у вас 2 лишних бэкслэша в конце второй строки.
А что пишет в лог последняя строка (curl)? Она должна ответ сервера писать, либо ошибку. Кстати, замените в последней строке
>> /tmp/telegram2.log
на
&>> /tmp/telegram2.log
чтобы ошибки от курла тоже писались в лог.
> Как минимум, у вас 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"}}
"ok":true возвращается тогда, когда сервер телеграмм все принял и не обнаружил ошибок в запросе.
Скорее всего вы не верно указали Telegram_id в заббиксе (ведь из консоли все приходит). Если конечно этот ответ получен не от консоли.
> А что пишет в лог последняя строка (curl)?
На всякий... Имел ввиду, когда скрипт запускается заббиксом, а не через консоль.
"ok":true возвращается тогда, когда сервер телеграмм все принял и не обнаружил ошибок в запросе.
Скорее всего вы не верно указали Telegram_id в заббиксе (ведь из консоли все приходит). Если конечно этот ответ получен не от консоли.
> А что пишет в лог последняя строка (curl)?
На всякий... Имел ввиду, когда скрипт запускается заббиксом, а не через консоль.
ID верный.
Фишка в том, что скрипт срабатывает только из командной строки. И приведённые цитаты из лога - это тоже после вызова командной строки.
А при отработке из Zabbix - молчок. Никакой записи в лог скрипта не попадает. Права на скрипт есть, никакой ошибки уведомления Zabbix не даёт.
Получается проблема на уровне либо ФС (права, пути), либо заббикс (ошибка в настройке). Пока только одно соображение в голову приходит...
Попробуйте вот этот вариант скрипта (для отладки, что в логе?) как из консоли, так и самим заббиксом - http://pastebin.com/3Bb4yD7H
Так же можете попробовать переключиться на пользователя заббикса, например, "su zabbix -" и выполнить скрипт. У этого пользователя должен быть указан шелл в /etc/passwd, а не что-то в духе /bin/false и /bin/nologin.
Если ничего из вышесказанного не поможет, сделайте настройки по новой, внимательно проверяя все пути и поля, которые заполняете (не раз с таким сталкивался).
С правами и настройками пути к алертскриптам всё перепроверил
Так я же и писал, что запускаю из строки:
su zabbix telegram2.sh Telegram_id 'Test subj' 'Test message'
Опять же - если бы Zabbix не мог исполнить скрипт - в Журнале оповещений ошибка бы была.
> Попробуйте вот этот вариант скрипта (для отладки, что в логе?)
Попробовал. Та же картина.
Из командной строки запускаю - работает: и в Телеграм сообщение приходит и в логе запись.
Из Zabbix - "Состояние - Отправлено" на панели, но ни в Телеграме, ни в логах - ничего.
Такое ощущение, что заббикс запускает какой-то другой скрипт, но не этот. Уверен, что тут надо копать либо в фс, либо в конфиге сервера заббикс, либо в настройках заббикс (веб-морда).
Если только к вам подключиться и посмотреть.
> Такое ощущение, что заббикс запускает какой-то другой скрипт
Нет больше скриптов с таким именем.
Ладно, чёрт с ним.
столкнулся с проблемой, оповещения по серверам приходят в полном объёме, а вот по принтерам урезаются, при этом на почту всё приходит как надо
Как в телеге так и в консоли есть ограничения на кол-во символов.
>У этого пользователя должен быть указан шелл в >/etc/passwd, а не что-то в духе /bin/false и >/bin/nologin.
su - username -s /bin/bash
и ничего не нужно менять в /etc/passwd
> Такое ощущение, что заббикс запускает какой-то другой скрипт
Включаем дебаг левел в заббиксе на 4 уровень и не гадаем на кофейной гуще
О! Точно! Совсем забыл об этом. Спасибо 👍
что-то не работает.
в subject и message пробелов нет.
FAIL: Params not defined.
Usage: zabbix_bot.sh TelegramID Subject Message
Должно быть ровно 3 параметра. Не больше, не меньше. Лучше взять их в кавычки (чтобы наверняка).
Большое спасибо!
Инструкция рабочая.
Здравствуйте!
При компиляции из терминала linux вылетает ошибка
end of file unexpected (expecting fi )
У вас точно bash, а не симлинк на sh, dash, etc?
Еще может быть, текст скрипта скопировался не полностью.
Все сделал как указано в статье.... Скрипт скопирован полностью.
Зачем эти велосипеды, если баду написали и выложили на github рабочий скрипт
В первом абзаце есть ответ на ваш вопрос.
И мне не нравятся громоздкие скрипты с кучей функций, которые мне не нужны.
Спасибо. Всё работает :)
Понадобилось лишь дайть права на чтение скрипта.
типа : chmod 755 script.sh
Отправить комментарий