Всем привет.
Знакомый приобрел для своей фирмы ИБП и попросил настроить мониторинг через Zabbix Server.
ИБП бюджетный и SNMP-карта в комплект не входит, так по самому ИБП информации мало.
Был рассмотрен вариант мониторинга без покупки карты: использовать nut-server + USB кабель (идет в комплекте).
Итак….
Инфраструктура в которой проводилась настройка:
- UPS: FinePower Rack-3000
- Ubuntu Server: 24.04
- NUT: 2.8.0
- Zabbix: 7.4
Вариант с USB не подошел, т.к. так как устройство вело себя непредсказуемо. Пришлось покупать кабель USB — RS-232. Ниже ссылка — это не рекалама, а что реально было использовано за небольшие деньги.
Название: (UGreen) Кабель-адаптер Ugreen USB 2.0 A-RS232 DB9, чип PL2303 3 м (20223)
Следующее, с чем столкнулся, что nut получает от ИБП заряд батареи равным нулю. Что весьма странно. Ниже будет ссылка на GitHub на похожую проблему и почему было мной выбрано именно такое решение.
Т.к. в репозитории Ubuntu Server 24.04 есть только версия 2.8.1 nut-server
1 2 3 4 5 6 7 8 | apt policy nut-server nut-server: Installed: (none) Candidate: 2.8.1-3.1ubuntu2 Version table: 2.8.1-3.1ubuntu2 500 500 http://ru.archive.ubuntu.com/ubuntu noble/main amd64 Packages 100 /var/lib/dpkg/status |
то было проще взять образ для docker’а и его использовать.
Плюсы такого решения:
- после обновления ОС и ПО версия не слетит,
- получать данные из контейнера не представляет особой сложности,
- не потребляет много ресурсов.
Минусы:
- для меня их тут нет, т.к. в данном случае решение рабочее,
- ну разве что держать docker для nut-server — кому-то может показаться слишком избыточным решением. Но мне не хотелось искать старые deb-пакеты или старые репозитории, а потом морочиться при обновлении.
Docker.
В итоге решил использовать docker с образом где nut-версия 2.8.0.
Сначала запустил и проверил, что все данные получает корректно. Есть предположение, что это из-за того, что driver.version.data: Megatec 0.06, а в 2.8.1 уде 0.07 и новый драйвер либо иначе считает заряд, либо не так интерпретирует данные, но это всего лишь предположение. Почему я так решил: nut запрашивает у ИБП данные, а потом получая от него ответ эти данные вы водит в читаемый вариант. Но т.к. у ИБП, с большей долей вероятности, старая прошивка или версия ПО, которое им управляет, старая, то современный драйвер уже не так их интерпретирует.
Для меня заряд батарей важные данные, т.к. если ИБП перейдет в режим работы от батарей, то мне надо получать его в % для понимания ситуации:
- Если входящее питание пропало на условные 3-5 минут. За это время ИБП не успеет исчерпать заряд батарей и при возобновлении подачи питания вернется в нормальный режим работы — «от сети», а батареи зарядит обратно. В таком случае сервера выключать не целесообразно, т.к. критического момента нет.
- Если входящее питание пропало больше, чем на условные 3-5 минут и батареи стали просаживать, то тут для меня важно понимать порог (все значения условны для меня, у вас могут быть свои исходя из инфраструктуры):
Уровень заряда в % Действие 75 информация 50 уже серьезно 40 всё ещё серьёзно 30 очень серьёзно 25 критично — выключение серверов и ниже сверх критично Как видно, при использовании версии 2.8.1 такие данные получить не возможно.
Подготовим файл для запуска nut нужной версии, а так же для доступа к USB на хосте для контейнера
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | services: nut1: image: instantlinux/nut-upsd:2.8.0-r4 container_name: nut2.8.0 restart: unless-stopped user: "0:0" privileged: true environment: - DRIVER=nutdrv_qx # Явно задаем ваш драйвер вместо usbhid-ups - PORT=/dev/ttyUSB0 # Указываем порт внутри контейнера - PROTOCOL=megatec # Дополнительный параметр протокола - POLLINTERVAL=2 # Интервал опроса - API_USER=upsmon # Имя пользователя для мониторинга - API_PASSWORD=11111 # Придумайте свой пароль - SECRET=11111 # Должен совпадать с API_PASSWORD - NUT_QUIET_INIT_SSL=1 devices: - "/dev/ttyUSB0:/dev/ttyUSB0" ports: - "3493:3493" |
параметры, указанные ниже, опциональны:
- container_name
- API_PASSWORD
- SECRET
задайте какие вам нужно. Порт пробросьте при необходимости.
Для получения данных выполнить команду:
1 | docker exec nut2.8.0 upsc ups@localhost |
Вывод:
Перейдем к настройке zabbix.
Zabbix Agent 2.
Я использую zabbix-agent2. Для начала создадим скрипт, который будет запускаться и обращаться к контейнеру и получать через него данные — /usr/local/bin/nut-get
1 2 3 4 5 6 7 8 9 10 11 12 | #!/bin/bash CONTAINER="nut2.8.0" UPS="ups@localhost" if [ $# -ne 1 ]; then echo "Usage: $0 " >&2 exit 1 fi exec /usr/bin/docker exec "$CONTAINER" \ upsc "$UPS" "$1" 2>/dev/null |
Обратить внимание, что тут переменная CONTAINER — это имя контейнера с nut-server, который запускали выше.
Сделаем его исполняемым:
1 | sudo chmod +x /usr/local/bin/nut-get |
И проверим:
1 | /usr/local/bin/nut-get battery.charge |
1 | /usr/local/bin/nut-get ups.status |
Выводы:
Теперь создадим файл конфигурации для Zabbix Userparametres — /etc/zabbix/zabbix_agent2.d/nut.conf
1 | UserParameter=ups.get[*],/usr/local/bin/nut-get "$1" |
После надо перезапустить агента:
1 | sudo systemctl restart zabbix-agent2 |
И проверить:
1 | zabbix_agent2 -t 'ups.get[battery.charge]' |
1 | zabbix_agent2 -t 'ups.get[ups.status]' |
1 | zabbix_agent2 -t 'ups.get[ups.type]' |
Вывод:
Как видно, агента Zabbix получает все необходимые данные.
Zabbix Server.
Сам сервер настраивать не потребуется. Здесь просто размещу шаблон, который сделал для данного UPS. Вообще, это первая версия, т.к. хотелось бы сделать универсальный шаблон. Он максимально простой, без каких-то сложностей.
В данном шаблоне присутствуют макросы:
| Макрос | Значение | Описание |
| {$UPS_BATTERY_AVERAGE} | 35 | Battery charge threshold for Average event (%) |
| {$UPS_BATTERY_DISASTER} | 15 | Battery charge threshold for Disaster event (%) |
| {$UPS_BATTERY_HIGH} | 20 | Battery charge threshold for High event (%) |
| {$UPS_BATTERY_INFO} | 75 | Battery charge threshold for Information event (%) |
| {$UPS_BATTERY_WARNING} | 50 | Battery charge threshold for Warning event (%) |
Данные макросы используются в триггерах. Соответственно, для изменения уровня срабатывания триггера не надо менять значение в нём — достаточно изменить в макросе. Будет меньше ошибок.
Элементы данных — 8 шт. Взял самые необходимые из вывода (на скриншоте выше):
Параметры:
- Интервал
- История
- Динамика
- Тип — тут Zabbix агент (т.е. сервер опрашивает агента), т.к. используется внутри сети. Если Zabbix агент где-то за NAT, firewall или в другой сети, то надо поменять на «Zabbix агент (активный)», чтобы он сам отправлял данные на сервер.
Остальные можно изменить на какие требуется.
Триггеры — 14 шт., но для двух элементов — заряда батареи и статус ИБП.
Про «Статус ИБП»:
- оповещение будет всегдя при любой смене статуса, т.к. если у ИБП поменялся статус — это инцидент. Даже если вручную включен тест батарей или их калибровка.
- так же есть дополнительные статусы, которые выводятся.
На скриншоте обычная проверка:

А вот если статус изменится (для теста в запустил короткий тест на 10 сек. на ИБП, а так же изменил интервал проверки на 5 с. у хоста, которому назначен данный шаблон — исключительно для теста и скринов):

Вот такие оповещения приходят в мессенджер:

Это в самом дашборде Zabbix:

Так же есть три графика:
- Батарея
- Загрузка
- Питание
При необходимости можно свои сделать.
[заметка обновляется по мере настройки шаблона]
Ссылки:
If you found an error, highlight it and press Shift + Enter or to inform us.



