Настраиваем алерты из заббикса в телеграм

от автора

Дорогие друзья, сегодня мы займемся такой нетривиальной задачей как алертинг. А именно — заставим 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


ссылка на оригинал статьи https://habr.com/ru/articles/860988/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *