Внешние скрипты Zabbix

Zabbix – очень популярная и довольно гибкая система мониторинга. Эта система мониторинга поддерживает достаточно много способов получения информации от наблюдаемых объектов. В этой публикации я на практике покажу один из этих способов – внешние скрипты Zabbix (они же внешние проверки). Скрипты могут быть написаны практически на любом языке, но я в своей практике использовал Python для решения одной из задач.

Что такое внешние скрипты Zabbix

Внешние скрипты (внешние проверки) Zabbix позволяют настроить скрипт или запустить скомпилированное ранее приложение на сервере Zabbix. Причем, без необходимости установки агента Zabbix на наблюдаемом объекте. Всю логику проверки вы конфигурируете в скрипте (или приложении).

При настройке элемента мониторинга в шаблоне вы просто указываете имя скрипта и в квадратных скобках передаете параметры.

script[<parameter1>,<parameter2>,...]

Если ваш скрипт или приложение не требует передачи параметров, то вы указываете только имя скрипта. В итоге мы получаем довольно гибкий инструмент, который позволяет нам настроить любую логику проверки, которая нам может понадобиться.

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

Например, запускать какой-то скрипт раз в минуту для сбора информации с термодатчика – вполне себе разумная идея. Но вот запуска какой-то скрипт (или десяток скриптов) каждый 5 секунд для сбора данных с какого-то устройства уже не кажется такой разумной идеей.

Пример внешнего скрипта Zabbix на Python

Лучше всего будет на примере показать пример того, как можно выполнить настройку внешней проверки Zabbix.

Описание задачи

Есть небольшая плата на ESP8266 с двумя термодатчиками. Один термодатчик расположен внутри серверной стойки. Второй термодатчик расположен снаружи серверной стойки. Получается такое довольно бюджетное решение для наблюдения за температурой. Там же настроен простой веб-сервер, который выходит значения с термодатчиков. Все просто.

При обращении к веб серверу мы получаем вот такой вывод.

Что я хотел бы сделать? Я хочу собирать данные с вывода выше и хранить собранные данных в Zabbix. Поскольку никакого другого средства для сбора данных мини плата ESP8266 не поддерживает, то остается обращаться только по веб. Для решения этой задачи я решил использовать небольшой внешний скрипт на Python. Про реализацию расскажу ниже.

Настройка внешнего Python скрипта

С чего начнем? Сначала создадим и протестируем сам скрипт. Все внешние скрипты Zabbix должны распологаться вот в этой директории:

/usr/lib/zabbix/externalscripts/

Сначала я перейду в эту директорию:

sudo su
cd /usr/lib/zabbix/externalscripts/

И создам сам скрипт:

nano server_room_temp.py

Если кратко, то скрипт выполняет следующие действия. В качестве параметра принимает одно из двух значений: inside или outside. Соответственно, при получении в качестве параметра значения “inside” – отображает температуру внутри серверного шкафа. При получении значений “outside” – снаружи серверного шкафа.

Тело самого скрипта:

#!/usr/bin/env -S python3 -u
# Script take one ot the followings args: "inside" or "outside"
# With "inside" parameter script display temperature inside server rack
# With "outside" parameter script display temperature outside server rack
from urllib.request import urlopen
from sys import argv
from re import findall

url = "http://192.168.1.89"
page = urlopen(url)
html_bytes = page.read()
html = html_bytes.decode("utf-8")
temp = findall(r'\d{1,2}\.\d{2}',html)

if argv[1] == "inside":
        print(temp[0])
elif argv[1] == "outside":
        print(temp[1])

Сохраняем тело скрипта в наш файл server_room_temp.py.

Сначала выполним проверку работы скрипта без использования Zabbix.

python3 server_room_temp.py inside
python3 server_room_temp.py outside
root@zabbix01:/usr/lib/zabbix/externalscripts# python3 server_room_temp.py inside
24.56
root@zabbix01:/usr/lib/zabbix/externalscripts# python3 server_room_temp.py outside
15.63
root@zabbix01:/usr/lib/zabbix/externalscripts#

Работает. Отлично. Теперь изменим владельца скрипта на пользователя, от имени которого работает служба Zabbix. В моем случае – это одноименный пользователь zabbix.

chown zabbix:zabbix server_room_temp.py

Мы выполнили всю необходимую подготовку и теперь можем настроить элементы мониторинга в шаблоне. Их будет два – один для мониторинга температуры внутри шкафа. Второй для температуры снаружи шкафа.

Пример настройки элемента для наблюдения за температурой внутри шкафа.

Наиболее важные четыре поля.

Название поляЗначениеОписание
NameInside Server Rack TemperatureНазвание элемента мониторинга
TypeExternal CheckТип проверки – внешняя проверка
Keyserver_room_temp.py[inside]Указываем имя скрипта. Мы передаем в скрипт только один параметр – указываем его в квадратных скобках
Type of informationNumeric (float)Тип возвращаемого значения

Элемент мониторинга для проверки температуры снаружи серверного шкафа практически аналогичен. За исключением имени элемента и передаваемого параметра при запуске скрипта.

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

Дополнительно вы также можете настроить триггеры на очень высокую или очень низкую температуру.

Это был пример из моей практике, которым я с вами поделился. Вряд ли те, кто работает с Zabbix изо дня в день, найдут тут для себя что-то новое. Но, надеюсь, для тех, кто только начинает погружаться в мир Zabbix материал статьи будет полезен.

Внешние скрипты Zabbix: 3 комментария

  1. Здравствуйте. А можно поподробнее, о плате на ESP8266 с двумя термодатчиками? Вы наверное имели ввиду плату не со встроенными термодатчиками. Было бы очень хорошо, если бы вы выложили не неё ссылку или хотя бы её фото. А то не понятно о какой именно плате идёт речь, их очень много разных.

    1. Добрый день! Не думал, что детали термодатчика могут кого-то заинтересовать, поэтому и не включил расширенную информацию о нем в текст статьи.
      К деталям. Плату собирал не я, а мои коллеги еще пару лет назад. Поэтому точными ссылками не поделюсь, но сама плата очень похожа вот на эту (Nodemcu V3 СР340) – https://aliexpress.ru/item/32264218680.html?sku_id=66932203692&spm=a2g2w.productlist.search_results.14.44194aa65A1nkm. Постараюсь при случае посмотреть точные маркировки на плате.
      К самой плате распаяны два аналоговых термоуса типа LM335 (тоже постараюсь уточнить точную маркировку) – https://aliexpress.ru/item/1005003383936224.html?sku_id=12000025525873446&spm=a2g2w.productlist.search_results.7.51211503gjEqnf
      В скетче для платы коллеги настроили веб сервер, который в обычной HTML табличке возвращает значения температуры с каждого из датчика. Исходного кода скетча у меня, к сожалению нет, нет 🙁 Фото тоже сделаю чуть позже.

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

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