пятница, 15 февраля 2019 г.

Уведомления от Zabbix в Telegram без блокировок (через IFTTT)

Мне надоело возиться с проксиками для работы скрипта "Уведомления от Zabbix в Telegram" поэтому решил сделать так, чтобы работало без прокси, т.к. своего проксика нет.
Не долго думая, вспомнил, что у IFTTT с не очень недавних пор появилась поддержка webhooks. Через этот механизм я и решил сделать "новую" уведомлялку.

Есть два варианта:
1. Слать уведомления от бота IFTTT
2. Слать уведомления от своего бота, которого делал в "Уведомления от Zabbix в Telegram"

Рассмотрим оба варианта.


В обоих случаях нужно зарегистрироваться на IFTTT. После чего перейти в My Applets -> Services, в поле поиска ввести webhooks и тыкнуть по карточке "Webhooks" и там нажать кнопку "Connect". Далее справа вверху нажать кнопку "Documentation" и сохранить куда-нибудь "Your key is:", ключик скоро понадобится.

1. Слать уведомления от бота IFTTT

Для начал нужно добавить бота IFTTT в телегу. Открываем телегу и в поиске вводим "@ifttt", открываем бота и жмем старт.

Теперь надо создать апплет ifttt. Открываем My Applets -> New Applets, тыкаем по синей надписи "this", вводим в поле поиска "webhooks" и тыкаем карточку, теперь выбираем карточку "Receive a web request" и в поле "Event Name" указываем название события без пробелов, например, "telegram_to_zabbix". Жмем кнопку "Create trigger".
Теперь тыкаем в синюю надпись "that", в поле поиска вводим "telegram", тыкаем карточку и выбираем "Send message". В поле "Message text" заменяем текст на
{{Value1}}<br>{{Value2}}<br>{{Value3}}
, а в "Include web page preview?" выбираем "Disabled".
Жмем "Create action". Жмет "Finish". Готово.

Теперь надо сделать скрипт и настроить заббикс.
Коннектимся на сервер заббикса, идем в папку /etc/zabbix/alertscripts и создаем файл, например, zabbix-to-ifttt_telegram-notify.sh, в котором пишем следующий код:
#!/bin/bash

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

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

IFTTT_EVENT='telegram_to_zabbix'

curl -s -X POST -H "Content-Type: application/json" -d "{\"value1\":\"<b>${IFTTT_EVENT}</b>\",\"value2\":\"${SUBJECT}\",\"value3\":\"${MESSAGE}\"}" "https://maker.ifttt.com/trigger/${IFTTT_EVENT}/with/key/${IFTTT_KEY}" &>/dev/null     

if [ $? -eq 0 ] ; then exit 1 ; fi
В переменной "IFTTT_EVENT" нужно указать ту же строку, которую вводили в поле "Event Name" при создании апплета ifttt, например, telegram_to_zabbix.

И даем этому файлу права на выполнение:
chmod +x zabbix-to-ifttt_telegram-notify.sh

Далее открываем заббикс и переходим в Администрирование > Способы оповещения, жмем "Создать способ оповещения" (шаг 4 в "Уведомления от Zabbix в Telegram").
В поле "Имя" указываем, например, "IFTTT to Telegram Bot".
В поле "Тип" выбираем "Скрипт".
В поле "Имя скрипта" вписываем имя созданного выше файла, например, zabbix-to-ifttt_telegram-notify.sh.
В разделе "Параметры скрипта" жмем три раза "Добавить" и вводим (по порядку сверху вниз):
{ALERT.SENDTO}
{ALERT.SUBJECT}
{ALERT.MESSAGE}

Далее идем в Администрирование > Пользователи, выбираем своего пользователя, переходим в "Оповещения", жмем "Добавить".
В поле "Тип" выбираем созданный ранее способ оповещения, например, IFTTT to Telegram Bot.
В поле "Отправлять на" указываем ключик, который мы получили на IFTTT в самом начале ("Your key is:").
Остальные поля на свой вкус.
Жмем "Добавить" и потом "Обновить". С пользователем готово.

Осталось сделать действие на триггер. Идем в Настройка > Действия, справа вверху в "Источник событий" выбираем "Триггеры" и жмем "Создать действие".
Действие нужно создавать аналогично как описано в статье "Уведомления от Zabbix в Telegram" в шаге 6. Я в разделе "Действие" указываю
A Состояние обслуживания не в обслуживании
B Важность триггеров >= Высокая
C Имя триггера не содержит test
.
В разделе "Операции" в поле "Тема по умолчанию" указываю "{TRIGGER.STATUS} {HOST.NAME}".
В поле "Сообщение по умолчанию" - "Trigger: {TRIGGER.NAME}<br>{ITEM.NAME} = {ITEM.LASTVALUE}"
Обратите внимание на "<br>". Так необходимо обозначать перенос трок. Это поле должно состоять строго из одной строки. Иначе работать ничего не будет.
В поле "Операции" жмем "Новый". В "Отправлять только через" выбираем "IFTTT to Telegram Bot". В "Отправлять пользователям" жмем "Добавить" и выбираем своего пользователя. Я так же создаю "Условие" - "Событие подтверждено = Не подтверждено".
В разделе "Операции восстановления" все аналогично. Поле "Операции" не трогаем.

Готово. Теперь уведомления от заббикса будут прилетать в телегу через бота IFTTT.




2. Слать уведомления от своего бота, которого делал в Уведомления от Zabbix в Telegram


Сначала нужно, как и пред. варианте, создать апплет ifttt. Открываем My Applets -> New Applets, тыкаем по синей надписи "this", вводим в поле поиска "webhooks" и тыкаем карточку, теперь выбираем карточку "Receive a web request" и в поле "Event Name" указываем название события без пробелов, например, "Zabbix_Notify_Bot". Жмем кнопку "Create trigger".
Теперь тыкаем в синюю надпись "that", в поле поиска снова вводим "webhooks", тыкаем карточку и выбираем "Make a web request
".
В поле "URL" вводим https://api.telegram.org/bot%ТОКЕН%/sendMessage. Подстроку %ТОКЕН% нужно заменить на свой токен. Как его получить смотри в шаге 1 в статье "Уведомления от Zabbix в Telegram". Либо можете использовать моего бота - https://api.telegram.org/bot179320554:AAHI9AeBkptHgMIh5pVs31CRzGHV_9sG8bs/sendMessage.
В поле "Method" выбираем "POST".
В поле "Content Type" выбираем "application/json".
В поле "Body" вводим {"chat_id":"{{Value1}}","text":"{{Value2}}\n{{Value3}}"}.
Жмем "Create action". Жмет "Finish". Готово.

Теперь нужно сделать скрипт.
Коннектимся на сервер заббикса, идем в папку /etc/zabbix/alertscripts и создаем файл, например, zabbix-via-ifttt-to-telegram-notify.sh, в котором пишем следующий код:
#!/bin/bash

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"

IFTTT_EVENT='Zabbix_Notify_Bot'
IFTTT_KEY='%ВАШ_КЛЮЧ%'

curl -s -X POST -H "Content-Type: application/json" -d "{\"value1\":\"${CHAT_ID}\",\"value2\":\"${SUBJECT}\",\"value3\":\"${MESSAGE}\"}" "https://maker.ifttt.com/trigger/${IFTTT_EVENT}/with/key/${IFTTT_KEY}" &>/dev/null     

if [ $? -eq 0 ] ; then exit 1 ; fi
В переменной "IFTTT_EVENT" нужно указать ту же строку, которую вводили в поле "Event Name" при создании апплета IFTTT, например, Zabbix_Notify_Bot.
В переменной "IFTTT_KEY" нужно указать ключ, который мы получали на IFTTT в самом начале ("Your key is:").

Далее нужно этому файлу дать права на выполнение:
chmod +x zabbix-to-ifttt_telegram-notify.sh


Теперь надо настроить заббикс.
В Администрирование > Способы оповещения, жмем "Создать способ оповещения" (шаг 4 в "Уведомления от Zabbix в Telegram").
В поле "Имя" указываем, например, "Telegram Bot via IFTTT".
В поле "Тип" выбираем "Скрипт".
В поле "Имя скрипта" вписываем имя созданного выше файла, например, zabbix-via-ifttt-to-telegram-notify.sh.
В разделе "Параметры скрипта" жмем три раза "Добавить" и вводим (по порядку сверху вниз):
{ALERT.SENDTO}
{ALERT.SUBJECT}
{ALERT.MESSAGE}

Далее идем в Администрирование > Пользователи, выбираем своего пользователя, переходим в "Оповещения", жмем "Добавить".
В поле "Тип" выбираем созданный ранее способ оповещения, например, Telegram Bot via IFTTT.
В поле "Отправлять на" указываем свой Telegram ID. Как его узнать рассказано в шаге 2 в статье "Уведомления от Zabbix в Telegram".
Остальные поля на свой вкус.
Жмем "Добавить" и потом "Обновить". С пользователем готово.

Осталось сделать действие на триггер. Идем в Настройка > Действия, справа вверху в "Источник событий" выбираем "Триггеры" и жмем "Создать действие".
Действие нужно создавать аналогично как описано в статье "Уведомления от Zabbix в Telegram" в шаге 6. Я в разделе "Действие" указываю
A Состояние обслуживания не в обслуживании
B Важность триггеров >= Высокая
C Имя триггера не содержит test
.
В разделе "Операции" в поле "Тема по умолчанию" указываю "{TRIGGER.STATUS} {HOST.NAME}".
В поле "Сообщение по умолчанию" - "Trigger: {TRIGGER.NAME}\n{ITEM.NAME} = {ITEM.LASTVALUE}"
Обратите внимание на "\n". Так необходимо обозначать перенос трок. Это поле должно состоять строго из одной строки. Иначе работать ничего не будет.
В поле "Операции" жмем "Новый". В "Отправлять только через" выбираем "Telegram Bot via IFTTT". В "Отправлять пользователям" жмем "Добавить" и выбираем своего пользователя. Я так же создаю "Условие" - "Событие подтверждено = Не подтверждено".
В разделе "Операции восстановления" все аналогично. Поле "Операции" не трогаем.

Готово. Теперь уведомления от заббикса будут прилетать в телегу в наш бот, как это было раньше (см. Уведомления от Zabbix в Telegram).



За сим отклоняюсь. Меньше вам алертов и стабильных серверов!







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

5 комментариев:

  1. Так будет лучше:

    #!/bin/bash

    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"

    IFTTT_EVENT='Наше значение'
    IFTTT_KEY='наш ключ'

    RES=$(curl -s -X POST -H "Content-Type: application/json" -d "{\"value1\":\"${CHAT_ID}\",\"value2\":\"${SUBJECT}\",\"value3\":\"${MESSAGE}\"}" "https://maker.ifttt.com/trigger/${IFTTT_EVENT}/with/key/${IFTTT_KEY}")
    if [ $? -ne 0 ]; then
    echo 'FAIL: curl error'
    exit 1
    fi

    if echo "$RES" | grep -q '"errors"'; then
    echo 'FAIL: server error'
    exit 1
    fi

    echo 'SUCCESS'
    exit 0

    ОтветитьУдалить
  2. Спасибо огромное автору, избавили меня от головной боли с обходом блокировки api.telegram.org. Оповещения работают как часы.

    ОтветитьУдалить
  3. Zabbix 5.0 Ubuntu 20.04
    При тестировании выдает:
    Media type test failed.
    Process exited with code: 1.

    Но сообщение доходит.

    ОтветитьУдалить
  4. скрипт от Aleksey ошибок не дает и тоже работает

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