Дорогие друзья, сегодня мы займемся такой нетривиальной задачей как алертинг. А именно — заставим 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
ссылка на оригинал статьи https://habr.com/ru/articles/860988/
Добавить комментарий