Дорогие друзья, сегодня мы займемся такой нетривиальной задачей как алертинг. А именно — заставим zabbix отправлять нам сообщения в телеграм-бот в случае сбоев и ошибок замеченных на наших серверах.

В zabbix версии 7.0 есть встроенный механизм по отправке сообщений в телеграм, но он не доработан — там нету опции отправки графиков. Такое, кстати, очень сильно просят добавить ZBXNEXT-5611.

Благо, я нашел библиотеку, которая позволит нам добится желаемого. Она, правда, заточена под zabbix версий 2, 3 и 4, но я думаю, мы сможем ее подружить с zabbix 7.0.

Мой сетап очень простой. Это 2 виртуальные машины. Одна заточена под zabbix сервер, а вторая является клиентом, на которой крутится zabbix-agent. Обе машины включены в bridge с моим Wi-Fi адаптером. Это значит, что я смогу к ним достучатся по сети с моего рабочего ПК.

Процесс поднятия zabbix сервера, а также подвязку клиента, я описывать не буду. С заббиксом много кто знаком, да и для такого официальной документации хватает.

❯ Создаем бота

Первое, что мы должны сделать, это создать бота через BotFather. Главное, что нам здесь нужно — это получить от него API токен.

❯ Настраиваем скрипт

Теперь, нам необходимо склонировать скрипты в рабочую область zabbixa. Это папка /usr/lib/zabbix/alertscripts. Очень важно, чтобы скрипт просто лежал в этой папке. Никаких подпапок быть не должно.

root@zabbix:/usr/lib/zabbix/alertscripts# git clone https://github.com/ableev/Zabbix-in-Telegram.git .
Cloning into '.'...
remote: Enumerating objects: 536, done.
remote: Counting objects: 100% (6/6), done.
remote: Compressing objects: 100% (5/5), done.
remote: Total 536 (delta 1), reused 4 (delta 1), pack-reused 530 (from 1)
Receiving objects: 100% (536/536), 186.68 KiB | 2.46 MiB/s, done.
Resolving deltas: 100% (305/305), done.

Предварительно со стороны zabbix нам нужно создать пользователя для скрипта. Это делается для того, чтоб он мог зайти в заббикс и стянуть график. Также, очень важно дать этому пользователю админские права через вкладку Permissions. Идем в Users->Users и жмем Create user.

Далее нас интересует файл конфигурации скрипта. Он представлен как zbxtg_settings.example.py. Делаем копиию и редактируем:

root@zabbix:/usr/lib/zabbix/alertscripts# cp zbxtg_settings.example.py zbxtg_settings.py
# -*- coding: utf-8 -*-

tg_key = ""  # telegram bot api key

zbx_tg_prefix = "zbxtg"  # variable for separating text from script info
zbx_tg_tmp_dir = "/var/tmp/" + zbx_tg_prefix  # directory for saving caches, uids, cookies, etc.
zbx_tg_signature = False

zbx_tg_update_messages = True
zbx_tg_matches = {
    "problem": "PROBLEM: ",
    "ok": "OK: "
}

zbx_server = "http://10.0.0.123:8080"  # zabbix server full url
zbx_api_user = "zbxtg"
zbx_api_pass = "yuJ0aith"
zbx_api_verify = True  # True - do not ignore self signed certificates, False - ignore

#zbx_server_version = 2  # for Zabbix 2.x version
zbx_server_version = 7  # for Zabbix 3.x version, by default, not everyone updated to 4.x yet
#zbx_server_version = 4  # for Zabbix 4.x version, default will be changed in the future with this

zbx_basic_auth = False
zbx_basic_auth_user = "zabbix"
zbx_basic_auth_pass = "zabbix"

proxy_to_zbx = None
proxy_to_tg = None

# proxy_to_zbx = "http://proxy.local:3128"
# proxy_to_tg = "https://proxy.local:3128"

# proxy_to_tg = "socks5://user1:password2@hostname:port" # socks5 with username and password
# proxy_to_tg = "socks5://hostname:port" # socks5 without username and password
# proxy_to_tg = "socks5h://hostname:port" # hostname resolution on SOCKS proxy. 
                                          # This helps when internet provider alter DNS queries.
                                          # Found here: https://stackoverflow.com/a/43266186/957508

google_maps_api_key = None  # get your key, see https://developers.google.com/maps/documentation/geocoding/intro

zbx_tg_daemon_enabled = False
zbx_tg_daemon_enabled_ids = [6931850, ]
zbx_tg_daemon_enabled_users = ["ableev", ]
zbx_tg_daemon_enabled_chats = ["Zabbix in Telegram Script", ]

zbx_db_host = "localhost"
zbx_db_database = "zabbix"
zbx_db_user = "zabbix"
zbx_db_password = ""


emoji_map = {
    "Disaster": "?",
    "High": "?",
    "Average": "❗",
    "Warning": "⚠️",
    "Information": "ℹ️",
    "Not classified": "?",
    "OK": "✅",
    "PROBLEM": "❗",
    "info": "ℹ️",
    "WARNING": "⚠️",
    "DISASTER": "❌",
    "bomb": "?",
    "fire": "?",
    "hankey": "?",
}

В файле конфигурации нас интересует всего несколько параметров.

  1. tg_key — сюда пишем наш API токен от BotFather.

  2. zbx_server — здесь указываем адрес zabbix UI.

  3. zbx_api_user — это пользователь под которым скрипт будет заходить в zabbix.

  4. zbx_api_pass — его пароль.

  5. zbx_server_version — не совсем понимаю зачем этот параметр, но на всякий поставим 7.

Также, есть пачка параметров zbx_db. Наполняем их настройками коннекта к базе данных zabbixa.

❯ Настраиваем zabbix

Со скриптом закончили, теперь приступаем к настройкам самого zabbixa. Нас интересует всего на всего несколько мест. Первое, это настройка Media types. Заходим в Alerts->Media types. Здесь мы видим просто ну невероятное количество интеграций (телеграм в том числе). Те, кто делал zabbix очень большые молодцы :)

Наш Media type должен выглядеть вот так. Здесь мы как раз таки говорим zabbixу какой скрипт исполнять и какие параметры нам нужно в него передать. Последний параметр --debug сделан для того, чтобы скрипт отчитался о проделанной работе. Это очень полезно, если запускать скрипт с консоли. В продакшн сетапе это, наверное, стоит убрать.

zbxtg.py
{ALERT.SENDTO}
{ALERT.SUBJECT}
{ALERT.MESSAGE}

Далее, идем в Alerts->Actions->Trigger actions и создаем здесь действие. Кроме наименования, идем во вкладку Operations и жмем кнопку Add напротив параметра Operations.

Здесь мы определяем сообщение, которое zabbix будет отправлять в качестве параметра для скрипта. В поле Send to users я добавил моего текущего zabbix пользователя. Наш Subject, к примеру, может выглядеть вот так: FAIL: {TRIGGER.NAME} on {HOSTNAME}. Параметр zbxtg;graphs говорит нашему скрипту, чтобы он зашел в zabbix и стянул график. Для наглядности, продублирую Message в отдельное поле.

Last value: {ITEM.LASTVALUE1} ({TIME})
zbxtg;graphs
zbxtg;graphs_period=10800
zbxtg;itemid:{ITEM.ID1}
zbxtg;title:{HOST.HOST} - {TRIGGER.NAME}

Кроме самого алерта в zabbixe предусмотрена реакция на исчерпание инцидента. Для этого нужна отдельная операция. Она будет отличатся только параметром Subject. Добавляем поле в параметр Recovery operations. Не забываем о параметре Send to users — здесь ставим вашего текущего zabbix пользователя.

И последнее, что нужно настроить это Media type для пользователя. Идем в Users->Users, выбираем нашего zabbix юзера, идем на вкладку Media и добавляем параметр.

Type автоматически заполнится нашим Media type'ом. А вот в поле Send to нам необходимо указать наш телеграм-логин с собачкой. Кстати, в телеграме надо будет предварительно что-то отправить боту, иначе скрипт не сможет отправлять вам сообщения. Это сделано для защиты от спама.

❯ Тестируем

Для тестов я выбрал дефолтную метрику CPU utilization. Заходим на клиент и нагружаем систему через stress тест.

root@client:/home/tkchk# stress --cpu 4
stress: info: [3242] dispatching hogs: 4 cpu, 0 io, 0 vm, 0 hdd

В результате у нас получится вот такая красота:

И, дорогие друзья, на этом все. Мы успешно настроили алертинг. Меня интересует только одно — понравилась ли тебе данная публикация? Не стесняйся, ставь лайки и пиши комментарии. А я на этом закругляюсь. До встречи!


Новости, обзоры продуктов и конкурсы от команды Timeweb.Cloud  в нашем Telegram-канале 

Перейти ↩

Также читайте мой цикл статтей о взломе диска от Red Balloon Security. Часть 0x00

Комментарии (4)


  1. badangel
    11.12.2024 08:50

    Есть более нативное и менее сложное решение - вебхуки.


    1. otkchk Автор
      11.12.2024 08:50

      Да, но графиков все так же нету.


      1. opusmode
        11.12.2024 08:50

        Да в общем-то они и не нужны, потому, что суть алёртинга - сообщать о важном, а не спамить миллионом сообщений, которые ничего не дают.

        В вашем случае само сообщение полуполезно, так как не сказано, на каком клиенте value 100%, а график не даёт доп информации к сообщению - вы и без него знаете, что есть скачок. При этом CPU Utilization это вообще скоруе о Load Average.


  1. cahbeua
    11.12.2024 08:50

    6 лет прошло, а воз и ныне там - забиск отправляет графики через Ж... Хотя они в целом не нужны от слова вообще.

    Гораздо интереснее глянуть в дашборд, по алерту или просто для общего развития. Но я такое за всё время так и не нашёл. Видать только мне дашборд информативен, остальные как то из графиков всё понимают.