Как настроить уведомления в Telegram от Icinga2

Как настроить уведомления в 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
# curl --silent "https://api.telegram.org/bot521924663:AAH7t61mNpKLOToyIsPm3vFOJ3GNaD9-LSI/getUpdates"
{"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
# curl --silent --data-urlencode "chat_id=-1001348922431" --data-urlencode "text=Hello world" "https://api.telegram.org/bot521924663:AAH7t61mNpKLOToyIsPm3vFOJ3GNaD9-LSI/sendMessage"
{"ok":true,"result":{"message_id":5,"chat":{"id":-1001348922431,"title":"My Alert Checker","type":"channel"},"date":1516124394,"text":"Hello world"}}