воскресенье, 20 сентября 2015 г.

apcupsd и APC Smart-UPS 1500VA

В прошлом я уже подключал ИБП к компьютеру и воспользовался тогда для контроля за состоянием ИБП системой NUT, о чём и написал в заметке NUT и Eaton Powerware 5110. В этот раз мне понадобилось подключить к компьютеру ИБП APC Smart-UPS 1500VA. Попробовал по старой памяти настроить для этого NUT, но драйвер usbhid-ups, работающий с этим ИБП через интерфейс USB, при запуске завершался ошибкой сегментации памяти. При этом XFCE издевательски выводил уведомление о полной зарядке батареи в правом верхнем углу экрана, общаясь с ИБП через шину dbus и демон upowerd.

Попробовал воспользоваться переходником USB-RS232 (COM-порт поддерживается драйвером apcsmart), но после подключения к компьютеру ИБП пискнул и отключился вместе со всей нагрузкой. Собственно, можно было ожидать чего-то подобного, т.к. в конфигурации драйвера apcsmart есть не один вариант кабеля RS232. Стало понятно, что переходник на USB, по всей видимости, не поможет.

Я знал о существовании apcupsd, но пользоваться им не хотелось из-за его специализированности на ИБП только одного производителя. Но тут деваться стало некуда и я решил всё-таки настроить его.

Настройка apcupsd

Итак, перво-наперво, установим apcupsd:
# apt-get install apcupsd
Открываем файл /etc/apcupsd/apcupsd.conf и редактируем, выставляя следующие настройки:
UPSCABLE usb
UPSTYPE usb
DEVICE

POLLTIME 10 # По умолчанию 60

BATTERYLEVEL 0 # По умолчанию 5%
MINUTES 3
TIMEOUT 0

BEEPSTATE N # Отключаем писк ИБП
apcupsd выключает компьютер при наступлении одного из условий:
  • уровень заряда батареи в процентах упал до значения меньше указанного в BATTERYLEVEL,
  • расчётное время работы от батареи в минутах стало меньше значения, указанного в MINUTES,
  • время непрерывной работы от батареи в минутах превысило значение, указанное в TIMEOUT.
Если какая-либо из этих настроек имеет значение 0, она не учитывается при принятии решения о выключении компьютера.

Теперь откроем файл /etc/default/apcupsd и включим демон, вписав в файл настройку:
ISCONFIGURED=yes
Теперь можно включить и запустить демона через systemd:
# systemctl enable apcupsd.service
# systemctl start apcupsd.service
Поскольку мы не меняли сетевые настройки, демон запустится и будет ожидать подключений на TCP-порту 3551 на локальном IP-адресе 127.0.0.1.

Узнать состояние ИБП можно с помощью программы-клиента apcaccess. Можно запускать её и от имени обычного пользователя, ведь для установки сетевого подключения не нужно обладать особыми правами, но стоит учитывать, что программа лежит в каталоге /sbin, поэтому для обычного пользователя доступна только при указании полного пути:
$ /sbin/apcaccess
Программа выводит различные данные ИБП в виде списка имён параметров и их значений. У программы есть опция -u, отключающая отображение единиц измерения. С помощью опции -p можно вывести значение только одного параметра, указав после опции имя параметра. Воспользуемся этим чтобы наблюдать за состоянием ИБП при помощи системы мониторинга Zabbix.

Настройка Zabbix

Предполагается, что на компьютере уже установлен и настроен Zabbix-агент. Добавим в конфигурацию агента "пользовательский параметр". Сделать этом можно либо напрямую отредактировав файл /etc/zabbix/zabbix_agentd.conf, либо создав новый файл в каталоге /etc/zabbix/zabbix_agentd.d/ специально для этого пользовательского параметра. Впишем строчку:
UserParameter=ups[*],/sbin/apcaccess -u -p $1
Перезапустим Zabbix-агента, чтобы новые настройки вступили в силу:
# systemctl restart zabbix-agent.service
Я подготовил два варианта шаблонов - один с элементами данных "Zabbix-агент", а второй - с элементами данных "Zabbix-агент (активный)".

Фрагмент страницы истории:


Фрагмент шаблона со списком триггеров:

Состав триггеров и приоритеты соответствуют моим нуждам, вы можете настроить их по-другому.

В ИБП предусмотрен режим "байпас" (более привычное название - шунт), то есть режим передачи напряжения со входа на выход напрямую. Если с напряжением в розетке всё в порядке, то ИБП работает именно в этом режиме, выполняя лишь функцию сетевого фильтра. При выходе напряжения за установленные пределы включается режим стабилизации. Если напряжение пропадает полностью, то ИБП начинает работать от батареи. Работа от батареи сопровождается довольно заметным шумом вентиляторов, с чем можно смириться, т.к. эта ситуация является аварийной, а в нормальном режиме "байпас" вентиляторы не работают.

12 комментариев:

donat комментирует...

Я уперся в настройку узла. Я не понимаю, как в шаблон попадают данные в этом случае, когда на сервер присылается(?) простыня(?) с параметрами.

И в моем случае
apcaccess [status [ [][:] ] ]


И на выходе только список значений.
Ведь не сервер с шаблоном его разбирают?

morbo комментирует...

В приложенных мной шаблонах дело обстоит так. В случае пассивного агента:
1. Zabbix-сервер запрашивает у Zabbix-агента значение ups[STATUS].
2. Zabbix-агент находит UserParamter=ups[*],/sbin/apcaccess -u -p $1 и вместо * подставляет все аргументы, которые указаны в квадратных скобках в ups[STATUS]. Указан только один аргумент - STATUS. Этот единственный аргумент имеет номер 1 и поэтому подставляется в команде на место шаблона $1. Получается, что надо выполнить команду /sbin/apcaccess -u -p STATUS.
3. После выполнения команды Zabbix-агент отправляет на Zabbix-сервер в качестве результата то, что команда вывела.

В случае активного агента дело обстоит похожим образом.
1. Zabbix-агент запрашивает у сервера список всех параметров, которые интересуют сервер и для каждого из параметров узнаёт периодичность, с которой нужно отправлять значения на Zabbix-сервер. Эти запросы в дальнейшем периодически повторяются, чтобы при изменении настроек на Zabbix-сервере эти настройки обновились на Zabbix-агенте. При обновлении настроек снимаются с контроля более не нужные данные и добавляются нужные, а у каких-то изменяется периодичность контроля.
2. Как и в случае пассивного Zabbix-агента, ключ ups[STATUS] преобразуется в команду /sbin/apcaccess -u -p STATUS. Команда выполняется Zabbix-агентом с указанной периодичностью, а результаты отправляются на Zabbix-сервер по инициативе Zabbix-агента.

Анонимный комментирует...

Как строчку UserParameter=ups[*],/sbin/apcaccess -u -p $1 для windows клиента сделать?

morbo комментирует...

>В винде делаю так ... UserParameter=ups[*],/sbin/apcaccess -u -p %1. Но не робит. Что за место * писать?

Про винду ничего сказать не могу. Почему возник вопрос именно про *? У вас в винде есть /sbin/apcaccess?

Анонимный комментирует...

Оооойй...Это всё Пятница виновата)) Вот так делаю. UserParameter=ups[*],c:\apcupsd\bin\apcaccess -u -p %1. В %1 значение подставляется. Но в * не хочет.
Ну или можно статейку, про то как мониторить несколько UPS c одного хоста.

Unknown комментирует...

Установил apcupsd на Centos 7. Почему то в директории /etc/default/apcupsd оный файл отсутствует. В чём может быть дело? Сервер APC видит, но управления (инициализации выключения)нетю

morbo комментирует...

Наверное дело в том, что это Centos, а в нём нет каталога /etc/default/ Попробуйте поискать что-нибудь похожее в каталоге /etc/sysconfig/ Вообще, если вы настраиваете Centos по статье про Debian, то всю специфику своего дистрибутива вам нужно учитывать самому - тут я не помощник.

Анонимный комментирует...

Не получилось все настроить по данной статье, решил написать, как сделал.
Версия: apcupsd 3.14.10 (13 September 2011) debian
Из-за того, что “/sbin/apcaccess -u -p STATUS” не работает (выдает сообщение с ошибкой, что нет параметров -u и -p), пришлось грепать вывод:
/sbin/apcaccess status 127.0.0.1:3550 | grep -w STATUS | sed s/[^,.0-9]//g
1. status 127.0.0.1:3550 - порт указан из-за того, что к серверу подключено два бесперебойника на разных портах (его передаем вторым параметром с сервера).
2. grep -w STATUS - через переменную $1 передаем значение ups[STATUS] (значения передаются с сервера)
3. sed s/[^,.0-9]//g - убираем лишние символы из вывода

Строчка из конфига агента: UserParameter=ups[*],/sbin/apcaccess status 127.0.0.1:$2 | grep -w $1 | sed s/[^,.0-9]//g

Спасибо за статью!

Анонимный комментирует...

Не получилось все настроить по данной статье, решил написать, как сделал.
Версия: apcupsd 3.14.10 (13 September 2011) debian
Из-за того, что “/sbin/apcaccess -u -p STATUS” не работает (выдает сообщение с ошибкой, что нет параметров -u и -p), пришлось грепать вывод:
/sbin/apcaccess status 127.0.0.1:3550 | grep -w STATUS | sed s/[^,.0-9]//g
1. status 127.0.0.1:3550 - порт указан из-за того, что к серверу подключено два бесперебойника на разных портах (его передаем вторым параметром с сервера).
2. grep -w STATUS - через переменную $1 передаем значение ups[STATUS] (значения передаются с сервера)
3. sed s/[^,.0-9]//g - убираем лишние символы из вывода

Строчка из конфига агента: UserParameter=ups[*],/sbin/apcaccess status 127.0.0.1:$2 | grep -w $1 | sed s/[^,.0-9]//g

Спасибо за статью!

Анонимный комментирует...

Спасибо за статью. Очень помогли.

rulet комментирует...

На Debian 10, 64 bit, такой вывод:

r@prime:~$ sudo apcaccess
[sudo] пароль для r:
APC : 001,017,0421
DATE : 2019-09-14 08:42:59 +0300
HOSTNAME : prime
VERSION : 3.14.14 (31 May 2016) debian
CABLE : USB Cable
DRIVER : USB UPS Driver
UPSMODE : Stand Alone
STARTTIME: 2019-09-14 08:41:40 +0300
STATUS : COMMLOST
MBATTCHG : 0 Percent
MINTIMEL : 0 Minutes
MAXTIME : 60 Seconds
NUMXFERS : 0
TONBATT : 0 Seconds
CUMONBATT: 0 Seconds
XOFFBATT : N/A
STATFLAG : 0x05000100
END APC : 2019-09-14 08:43:16 +0300
r@prime:~$

Перед этим проделывал:

ISCONFIGURED=yes

и:

# systemctl enable apcupsd.service
# systemctl start apcupsd.service

а также перезагрузку делал.

Есть идеи?

morbo комментирует...

rulet, идей у меня много, но я подозреваю что спросить вы хотели не об этом. Попытаюсь догадаться. Подозреваю, что вас интересует строка STATUS: COMMLOST. COMMLOST расшифровывается как communication lost - потеря связи. Проверьте связь с ИБП через кабель USB.