Как настроить уведомления в Telegram от Icinga2
Roman Bogachev
VMware Specialist | Drone Pilot | Traveler
Настраиваем канал для получения уведомлений о проблемах с хостами и сервисами в Telegram
Шаг 1. Создание бота в Telgram Добавляем бота под названием BotFather и отправляем ему команду /newbot
, выбираем имя, которое будет отображаться в списке контактов и адрес. Например, «My Alert Checker» с адресом «MyPrivateBot» .
Если адрес не занят, а имя введено правильно, BotFather пришлет в ответ сообщение с токеном — «ключом» для доступа к созданному боту. Его нужно сохранить и никому не показывать.
Шаг 2. Создание канала Создаём канал с любым названием и адресом, и переходим в его настройки.
Необходимо добавить в список администраторов созданного нами бота — именно он будет публиковать уведомления в канал.
![](004.png)
![](005.png)
Шаг 3. Идентификация чата Отправим в чат любое сообщение, чтобы отследить ID-канала для отправки уведомлений.
После того, как отправили сообщение, выполним curl-запрос, подставив ранее полученный токен для бота.
1 curl --silent "https://api.telegram.org/bot${TOKEN} /getUpdates"
1 2 3 {"ok" :true ,"result" :[{"update_id" :731268716, "channel_post" :{"message_id" :4,"chat" :{"id" :-1001348922431,"title" :"My Alert Checker" ,"type" :"channel" },"date" :1516122930,"text" :"ferfe" }}]}
Получаем ID канала - -1001348922431
.
Шаг 4. Настройка Icinga2 для отправки уведомлений в Telegram Внесем правки в конфигурационные файлы Icinga2 .
Добавим нового пользователя В конфигурационный файл users.conf
добавим нового пользователя и впишем полученный ID канала:
1 2 3 4 5 6 7 8 object User "mytestuser" { import "generic-user" display_name = "Test User" // The telegram chat ID vars.telegram_chat_id = "-1001348922431" }
Создадим правила уведомления в Telegram Создаем новые правила уведомления в конфигурационном файле notifications.conf
и указываем пользователя, который будет получать уведомления:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 apply Notification "telegram-icingaadmin" to Host { import "mail-host-notification" command = "telegram-host-notification" users = [ "mytestuser" ] assign where host.name } apply Notification "telegram-icingaadmin" to Service { import "mail-service-notification" command = "telegram-service-notification" users = [ "mytestuser" ] assign where host.name }
Добавим скрипт для отправки уведомлений Создаем скрипт telegram-host-notification.sh
в директории scripts
для отправки уведомлений по хостам.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 #!/bin/sh if [ -n "$ICINGAWEB2_URL " ]; then HOSTDISPLAYNAME="<a href=\"$ICINGAWEB2_URL /host/show?host=$HOSTNAME \">$HOSTDISPLAYNAME </a>" fi template=$(cat <<TEMPLATE <strong>$NOTIFICATIONTYPE</strong> - $HOSTDISPLAYNAME is $HOSTSTATE Host: $HOSTALIAS Address: $HOSTADDRESS Date/Time: $LONGDATETIME <pre>$HOSTOUTPUT</pre> TEMPLATE ) if [ -n "$NOTIFICATIONCOMMENT " ]; then template="$template Comment: ($NOTIFICATIONAUTHORNAME ) $NOTIFICATIONCOMMENT " fi /usr/bin/curl --silent --output /dev/null \ --data-urlencode "chat_id=${TELEGRAM_CHAT_ID} " \ --data-urlencode "text=${template} " \ --data-urlencode "parse_mode=HTML" \ --data-urlencode "disable_web_page_preview=true" \ "https://api.telegram.org/bot${TELEGRAM_BOT_TOKEN} /sendMessage"
Создаем скрипт telegram-service-notification.sh
в директории scripts
для отправки уведомлений по сервисам.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 #!/bin/sh if [ -n "$ICINGAWEB2_URL " ]; then HOSTDISPLAYNAME="<a href=\"$ICINGAWEB2_URL /host/show?host=$HOSTNAME \">$HOSTDISPLAYNAME </a>" SERVICEDISPLAYNAME="<a href=\"$ICINGAWEB2_URL /service/show?host=$HOSTNAME &service=$SERVICEDESC \">$SERVICEDISPLAYNAME </a>" fi template=$(cat <<TEMPLATE <strong>$NOTIFICATIONTYPE</strong> $HOSTDISPLAYNAME - $SERVICEDISPLAYNAME is $SERVICESTATE Address: $HOSTADDRESS Date/Time: $LONGDATETIME <pre>$SERVICEOUTPUT</pre> TEMPLATE ) if [ -n "$NOTIFICATIONCOMMENT " ]; then template="$template Comment: ($NOTIFICATIONAUTHORNAME ) $NOTIFICATIONCOMMENT " fi /usr/bin/curl --silent --output /dev/null \ --data-urlencode "chat_id=${TELEGRAM_CHAT_ID} " \ --data-urlencode "text=${template} " \ --data-urlencode "parse_mode=HTML" \ --data-urlencode "disable_web_page_preview=true" \ "https://api.telegram.org/bot${TELEGRAM_BOT_TOKEN} /sendMessage"
Создаем команды для отправки уведомлений Команды будут выполнять соответствующий скрипт, который вытягивает информацию о проблеме с хостом или сервисом, и curl-запросом отправляет это в Telegram . Определяем собственную конфигурацию команд в файле commands.conf
:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 object NotificationCommand "telegram-host-notification" { import "plugin-notification-command" command = [ SysconfDir + "/icinga2/scripts/telegram-host-notification.sh" ] env = { NOTIFICATIONTYPE = "$notification .type$" HOSTNAME = "$host .name$" HOSTALIAS = "$host .display_name$" HOSTADDRESS = "$address$" HOSTSTATE = "$host .state$" LONGDATETIME = "$icinga .long_date_time$" HOSTOUTPUT = "$host .output$" NOTIFICATIONAUTHORNAME = "$notification .author$" NOTIFICATIONCOMMENT = "$notification .comment$" HOSTDISPLAYNAME = "$host .display_name$" TELEGRAM_BOT_TOKEN = BOT_TOKEN_MUST_BE_HERE TELEGRAM_CHAT_ID = "$user .vars.telegram_chat_id$" // optional ICINGAWEB2_URL = "https://icinga.example.com/icingaweb2" } } object NotificationCommand "telegram-service-notification" { import "plugin-notification-command" command = [ SysconfDir + "/icinga2/scripts/telegram-service-notification.sh" ] env = { NOTIFICATIONTYPE = "$notification .type$" SERVICEDESC = "$service .name$" HOSTNAME = "$host .name$" HOSTALIAS = "$host .display_name$" HOSTADDRESS = "$address$" SERVICESTATE = "$service .state$" LONGDATETIME = "$icinga .long_date_time$" SERVICEOUTPUT = "$service .output$" NOTIFICATIONAUTHORNAME = "$notification .author$" NOTIFICATIONCOMMENT = "$notification .comment$" HOSTDISPLAYNAME = "$host .display_name$" SERVICEDISPLAYNAME = "$service .display_name$" TELEGRAM_BOT_TOKEN = BOT_TOKEN_MUST_BE_HERE TELEGRAM_CHAT_ID = "$user .vars.telegram_chat_id$" // optional ICINGAWEB2_URL = "https://icinga.example.com/icingaweb2" } }
Перезагружаем сервис и проверяем работу бота. Для примера отключу веб-сервер.
Troubleshooting Если уведомления не приходят - сперва проверьте правильность всех настроек. Попробуйте выполнить команду из консоли:
К примеру:
1 2 {"ok" :true ,"result" :{"message_id" :5,"chat" :{"id" :-1001348922431,"title" :"My Alert Checker" ,"type" :"channel" },"date" :1516124394,"text" :"Hello world" }}