Дорогие друзья, сегодня мы займемся такой нетривиальной задачей как алертинг. А именно — заставим 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": "?",
}
В файле конфигурации нас интересует всего несколько параметров.
tg_key
— сюда пишем наш API токен от BotFather.zbx_server
— здесь указываем адрес zabbix UI.zbx_api_user
— это пользователь под которым скрипт будет заходить в zabbix.zbx_api_pass
— его пароль.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)
cahbeua
11.12.2024 08:506 лет прошло, а воз и ныне там - забиск отправляет графики через Ж... Хотя они в целом не нужны от слова вообще.
Гораздо интереснее глянуть в дашборд, по алерту или просто для общего развития. Но я такое за всё время так и не нашёл. Видать только мне дашборд информативен, остальные как то из графиков всё понимают.
badangel
Есть более нативное и менее сложное решение - вебхуки.
otkchk Автор
Да, но графиков все так же нету.
opusmode
Да в общем-то они и не нужны, потому, что суть алёртинга - сообщать о важном, а не спамить миллионом сообщений, которые ничего не дают.
В вашем случае само сообщение полуполезно, так как не сказано, на каком клиенте value 100%, а график не даёт доп информации к сообщению - вы и без него знаете, что есть скачок. При этом CPU Utilization это вообще скоруе о Load Average.