пятница, 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/.

44 комментария:

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

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

    ОтветитьУдалить
  2. Этот комментарий был удален автором.

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

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

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

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

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

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

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

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

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

    ОтветитьУдалить
  9. ID группы начинается со знака минус. Вы точно его указываете?

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

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

    ОтветитьУдалить
  12. Этот комментарий был удален автором.

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

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

      Удалить
  13. Из командной строки запускаю скрипт:

    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

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

    ОтветитьУдалить
  14. Менял немного.

    #!/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

    ОтветитьУдалить
    Ответы
    1. > ... sendMessage\\\"" >> /tmp/telegram2.log

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

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

      Удалить
  15. > Как минимум, у вас 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"}}

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

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

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

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

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

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

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


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

      Удалить
  17. С правами и настройками пути к алертскриптам всё перепроверил

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

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

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

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

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

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

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

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

    ОтветитьУдалить
    Ответы
    1. Как в телеге так и в консоли есть ограничения на кол-во символов.

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

    ОтветитьУдалить
  22. > Такое ощущение, что заббикс запускает какой-то другой скрипт

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

    ОтветитьУдалить
  23. что-то не работает.

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

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

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

      Удалить
  24. Здравствуйте!
    При компиляции из терминала linux вылетает ошибка
    end of file unexpected (expecting fi )

    ОтветитьУдалить
    Ответы
    1. У вас точно bash, а не симлинк на sh, dash, etc?
      Еще может быть, текст скрипта скопировался не полностью.

      Удалить
  25. Все сделал как указано в статье.... Скрипт скопирован полностью.

    ОтветитьУдалить
  26. Зачем эти велосипеды, если баду написали и выложили на github рабочий скрипт

    ОтветитьУдалить
    Ответы
    1. В первом абзаце есть ответ на ваш вопрос.
      И мне не нравятся громоздкие скрипты с кучей функций, которые мне не нужны.

      Удалить
  27. Спасибо. Всё работает :)
    Понадобилось лишь дайть права на чтение скрипта.
    типа : chmod 755 script.sh

    ОтветитьУдалить
  28. The casino that opened in the heart of The Strip - Filmfile
    The casino 네임드 사다리 that 스핀 토토 opened in 바셀티비 the heart of The Strip is a dark stone that belongs to one of the 스포츠토토 모바일 벳피스트 most famous casino gambling dens of all 안전 사이트 time. The casino

    ОтветитьУдалить