пятница, 2 июля 2010 г.

Мониторинг UPS

Появился Luxeon UPS-2000LE и понадобилось прикрутить к нему мониторинг (всем замечательный, только не поддерживает SNMP).

Выдвигаемые требования:
1. Съем статистики
2. Умение уведомлять различными способами о изменениях состояний.
3. Желательно иметь возможность прикрутить статистику к cacti или какой-то другой визуальный мониторинг.
4. При заряде батареи в 5% отсылать серверам уведомление, чтоб они могли корректно завершиться. (это также необходимо для щадящего режима использования аккумуляторов).
5. Желательно при включении питания от сети с минимальной задержкой (5-10сек) автоматически включать сервера.
6. Используемая ОС - FreeBSD (желательно, чтоб были клиенты и под другие оси)

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




Network UPS Tools
Рассмотрим вторую Network UPS Tools для управления UPS.

Устанавливаем:

# cd /usr/ports ; make search name='nut-'
# cd /usr/ports/sysutils/nut
# cd /usr/ports/sysutils/nut ;make config 

Options for nut 2.4.1 
[X] SERIAL SERIAL support 
[ ] USB USB support 
[ ] SNMP SNMP support 
[X] NEON NEON XML/HTTP support 
[ ] PDU Powerman PDU support 
[ ] HAL HAL support 
[ ] IPV6 IPV6 support 
[ ] DEVEL Install header files 
[X] CGI Web CGI interface
# make install clean
Создадим необходимые директории для драйверов и сервера, куда будут сохраняться данные UPS,
и выставим корректные права на директорию.

# mkdir -p /var/state/ups ;chmod 0770 /var/state/ups; chown uucp:wheel /var/state/ups
Драйвер
Найдем свой драйвер UPS в списке поддерживаемого оборудования.

# cd /usr/local/etc/nut
Посмотрим, поддерживает ли NUT мой UPS

# cat driver.list | grep Luxeon
#
Конфигурационные файлы
Все конфигурационные файлы находятся в директории /usr/local/etc/nut
ups.conf - настройки UPS драйвера для сбора данных
upsd.conf - настройка основного демона upsd для Network UPS Tools
upsd.users - контроль доступа к UPS демону (профили пользователей) upsmon.conf - настройки монитора UPS демона

ups.conf
В этом файле вы указываете свои UPS.

# cd /usr/local/etc/nut 
# cp ups.conf.sample ups.conf 
Добавим UPS и настроим подключение к нему(драйвер подобран опытным путем).

# Уникальный идентификатор UPS. Используется как адрес вашего UPS.
[Luxeon_2000LE]

# драйвер, можно сказать универсальный, подходит ко многим моделям  
# UPS, иногда требует  настройки. 
driver = megatec

# тоже подходит, но так и не удалось заставить отдавать статистику заряда батареи.
# является модифицированным вариантом "megatec" но как правило более старый драйвер.
#driver = blazer_ser

# Указываем с какого порта снимать статистику ( /dev/cuad -порт COM на FreeBSD)
port = /dev/cuad0

# Добавляем описание, что это за UPS
desc = "Luxeon UPS-2000LE"

# Описываем производителя UPS (необязательно, можно добавлять 
# если драйвер сам не определяет
mfr = "Luxeon"

# Описываем модель UPS (необязательно, можно добавлять если драйвер сам не определяет)
model = "UPS-2000LE" 

# Множитель напряжения. Необходим для корректного отображения напряжения батареи.
# Например для данного UPS используется батареи с напряжением в 96 В (номинальное), 
# а показывает напряжение 2.x В. 
# Для правильного отображения значит нужно использовать множитель 48 (по умолчанию он = 1) battvoltmult = 48

# Т.к данный UPS неизвестен драйверу(нам приходится определять все руками), 
#соответственно он не знает, как определить % заряда батареи.
# Значит придется снова задавать руками... 
# Напряжение не используемых батарей 110 В, Напряжение при загрузке сначала 104, 
# затем быстро падает до 99В (падение постепенно замедляется) 
# Задаем напряжения (без множителя) в следующем формате "напряжение разряженных 
# батарей":"напряжение полностью заряженных батарей" 
# Т.е если применить множитель то получим 91.2:100.8 
battvolts = 1.9:2.1
Опишем некоторые параметры для использования:
[ups_name] - имя используется как адрес вашего UPS. Вы можете его изменить на любое произвольное имя.

driver - драйвер, используемый для работы с UPS.

port - порт, на котором висит UPS (для подключения через USB, UPS вставляет это значение в auto). - Для snmp-ups: имя хоста SNMP агента - Для newhidups: значение "auto" для автоматического соединения с USB UPS.

desc - описание устройства для себя, чтобы не забыть.

sdorder - необязательный элемент. При наличии нескольких UPS подключенных к серверу можно выключать в определенном порядке. используя upsdrvctl можно выключить все 0s или 1s, 2s и тд. Для исключения последовательной остановки используйте -1.

nolock - необязательный элемент, его не рекомендуется использовать в его этом конфиге. Он служит для отключения блокировки порта при пользовании утилитой.

maxstartdelay - необязательный элемент. Может быть, задан, как глобальная переменная выше вашего первого UPS. Это значение определяет, сколько upsdrvctl будет ожидать окончания запуска драйвера. Данная возможность предоставляет стабильность в работе. Значение по умолчанию равно 45 секундам.

cable - Если драйвер UPS требует дополнительных параметров, вы можете указать их здесь. Это индекс вашего кабеля и вы можете посмотреть его тут /usr/local/share/doc/nut/cables. Вы можете не указывать это значение, если ваше подключение к UPS стандартно.



upsd.conf
upsd отвечает за передачу данных от драйвера клиентским программам в сети.
upsd должен находится под управлением и по возможности, как единственный источник состояния и мониторинга клиентов, таких как upsmon.
upsd использует этот файл для контроля доступа к серверу и для установки других значений различных конфигурации.
Этот файл содержит подробные сведения об управлении доступом, таким образом, обеспечивается безопасность.
В идеальном случае, только процесс upsd должны иметь возможность прочитать данные из этого файла. Создадим конфигурационный файл.


# cp upsd.conf.sample upsd.conf 
Добавим следующие значения:

LISTEN 127.0.0.1 LISTEN 192.168.0.2
Опишем параметры использования:
MAXAGE - по умолчанию 15 секунд. Это частота обновления данных клиентов после остановки драйвера UPS. Следует использовать только в том случае, если у вас трудности с обновлением данных. См syslog.

LISTEN - здесь указывается адрес и порт 3493 (по умолчанию) для прослушивания подключений.

MAXCONN - по умолчанию используется 1024 подключений. Каждый UPS, каждого LISTEN адреса и каждого клиента считается как одно подключение. Если на сервере заполнятся количество подключений, он больше не будет принимать новых входящих клиентских подключений.

upsd.users
Контроль доступа для UPS демона (профили пользователей).
Именно в этом файле вы указываете, кто и в какой мере будет контролировать и работать с утилитой.

# cp upsd.users.sample upsd.users 
# cat upsd.users 
[admin] 
password = admin 
actions = SET 
instcmds = ALL 
 
[monmaster] 
password = bsd 
upsmon master
 
[monslave] 
password = win2k3 
upsmon slave 
Значения:
password - пароль пользователя
allowfrom - откуда разрешено подключатся

Каждый UPS монитор может определяться как один из трех возможных типов:
upsmon master - полные полномочия управлением питания подключенных к системе UPS под управлением upsmon, эта система отвечает за выключение разряженного аккумулятора.
Выключение происходит после безопасного выключения всех Slave систем.
Если ваш UPS подключен непосредственно к системе через последовательный порт,
то для upsmon системы следует определить этот UPSкак Master.

upsmon slave - эта система, под управлением upsmon и она не выключается непосредственно. Операционная система будет выключена перед отключением питанияMaster.
Используйте этот режим при запуске монитора на других компьютерах работающих на том же UPS.
И очевидно, что только один сервер может быть подключен к последовательному порту на UPS,
коим будет является Master. Все остальные сервера будут Slave.

upsmon monitor-only - при этом режиме будут создаваться уведомления о состоянии или изменении работы батареи, переключении на линию и т.д., но не завершать работу системы.

actions - Действия пользователя с применением upsd.
- SET - изменить значения определенных переменных в UPS
- FSD - установка флага "принудительного выключения" для UPS

instcmds - разрешения пользователю на инициирование конкретных команд.
Применяя "ALL" вы разрешаете использовать все команды,
Существует множество команд выполните 'upscmd -l' чтобы увидеть, что ваше оборудование поддерживает.
Вот, к примеру, несколько команд.
- test.panel.start - старт теста передней панели
- test.battery.start - старт теста батареи
- test.battery.stop - остановка теста батареи
- calibrate.start - запуск калибровки батареи
- calibrate.stop - остановка калибровки батареи

upsmon.conf
upsmon предоставляет основные функции, которая собирается найти в программе мониторинга UPS, например это безопасное завершений работы при сбое питания.
В многоуровневой схеме утилиты NUT это клиент.

#cp upsmon.conf.sample upsmon.conf  
#cat upsmon.conf
MONITOR Luxeon_2000LE@localhost 1 monmaster bsd master
MINSUPPLIES 1
SHUTDOWNCMD "/sbin/shutdown -p now"
POLLFREQ 5
POLLFREQALERT 5
HOSTSYNC 15
DEADTIME 15
POWERDOWNFLAG /etc/killpower 
NOTIFYMSG ONLINE "UPS %s on line power" 
NOTIFYMSG ONBATT "UPS %s on battery" 
NOTIFYMSG LOWBATT "UPS %s battery is low" 
NOTIFYMSG FSD "UPS %s: forced shutdown in progress" 
NOTIFYMSG COMMOK "Communications with UPS %s established" 
NOTIFYMSG COMMBAD "Communications with UPS %s lost" 
NOTIFYMSG SHUTDOWN "Auto logout and shutdown proceeding" 
NOTIFYMSG REPLBATT "UPS %s battery needs to be replaced" 
NOTIFYMSG NOCOMM "UPS %s is unavailable" 
NOTIFYMSG NOPARENT "upsmon parent process died - shutdown impossible" 
RBWARNTIME 43200 
NOCOMMWARNTIME 300
FINALDELAY 5 
Мы добавили MONITOR в котором указали наши значения.
Формат таков:
MONITOR system powervalue username password type MINSUPPLIES - указываем количество блоков питания которые должны получать мощность сохраняя систему запущенной. Большинство систем имеют один БП. Но дорогие сервера, например HP NetServer LH4 могут работать с 2 из 4 БП и ему нужно ставить 2.

SHUTDOWNCMD - upsmon выполняет эту команду, когда системе необходимо выключить.

NOTIFYCMD - upsmon отправляет сообщение при происшествиях.

POLLFREQ - опрос мониторами с частотой (измеряется в секундах) для обычной деятельности. Вы можете отрегулировать это частоту опроса, чтобы upsmon не “зашумлял”вашу сеть, но не вносите слишком большие значения тк. оно может пропустить отключение питания.

POLLFREQALERT - опрос UPS с частотой в секундах. Можно сделать значение поменьше, чем POLLFREQ для лучшей чувствительности работы батареи.

HOSTSYNC - как долго upsmon будет ждать перед переходом к следующему upsmon. master upsmon использует это число при ожидании slaves чтобы отключиться после того как он установил флаг принудительное завершение работы (FSD). И если slaves не отключаться после этого тайм аута, то выключение продолжится без них.

DEADTIME - интервал ожидания перед объявлением статуса UPS как «мертвый» upsmon требует, чтобы UPS предоставлял свою статус информацию, каждые несколько секунд (см. POLLFREQ и POLLFREQALERT). Если статус загрузки, UPS помечен fails. И если оно остается fails более чем DEADTIME секунд, то UPS помечается «мертвый».

POWERDOWNFLAG - флаг файла для форсирования завершения работы UPS в master системе.

NOTIFYMSG - изменение сообщения, отправленные upsmon при возникновении определенных событий.

NOTIFYFLAG - изменение поведения upsmon при возникновении событий NOTIFY.

RBWARNTIME - предупреждение замены аккумулятора в секундах.

NOCOMMWARNTIME - предупреждение по времени при не общении к UPS в секундах.

FINALDELAY - процент батареи, при котором происходит завершение работы системы.


Разрешения
Проверьте разрешения на директорию /var/db/nut,
текущий пользователь должен быть uucp(или другой NUT_USER) и права 0750:

# ls -ld 
drwxr-x--- 2 uucp wheel 512 Apr 28 16:16 /var/db/nut/ 
Измените разрешения на конфигурационные файлы: они должны читаться пользователем uucp(или другим пользователем NUT_USER):

# chown uucp:wheel upsd.conf upsd.users upsmon.conf
# chmod 0640 upsd.conf upsd.users upsmon.conf


Запуск сервиса

# /usr/local/etc/rc.d/nut start
...
Смотрим, что все запустилось нормально и UPS подхватился, все правила подключились и порт слушается. =)
Теперь помотрим, запустился ли демон.

# ps -ax|grep nut
73068 ?? Ss 2:36.08 /usr/local/libexec/nut/megatec -a Luxeon_2000LE
Все замечательно, демон находится в памяти и ведет логи.
Теперь проверим свой UPS

# /usr/local/bin/upsc Luxeon_2000LE@localhost
battery.charge: 100.0
battery.voltage: 109.44
driver.name: megatec
driver.parameter.battvoltmult: 48
driver.parameter.battvolts: 1.9:2.1
driver.parameter.mfr: Luxeon
driver.parameter.model UPS-2000LE
driver.parameter.pollinterval: 2
driver.parameter.port: /dev/cuad0
driver.version: 2.4.1
driver.version.internal: 1.6
input.frequency: 50.1
input.voltage: 216.8
input.voltage.fault: 354.4
input.voltage.maximum: 246.0
input.voltage.minimum: 176.5
output.voltage: 221.0
ups.beeper.status: disabled
ups.delay.shutdown: 0
ups.delay.start: 2
ups.load: 59.0
ups.mfr: Luxeon
ups.model:UPS-2000LE
ups.serial: unknown
ups.status: OL
ups.temperature: 38.0
ups.type: online
Значение статуса
ups.status:
OL - система работает на линии (on line power)
OB - система работает от батареи (on battery)
LB - система работает от севшей батареи (low battery)

Когда upsmon необходимо быстро выключить локальную систему, она устанавливает флаг "FSD" (forced shutdown - принудительное отключение) для любых UPS, на котором она выполняется в master режиме.
Данная возможность используется и для синхронизации slaves компьютеров в том случае,если master UPS передает событие и всем рассылается сообщение о немедленном прекращении работы.
Можно вручную вызвать этот режим на master upsmon, запустив другой экземпляр с флагом '-c fsd '. Это полезно, когда вы хотите инициировать shutdown перед критическим этапом.

Эмулируем падение мощности:

# upsmon -c fsd
Если система корректно выключилась, то все в порядке.


RC.CONF
Для запуска NUT при старте FreeBSD добавляем в /etc/rc.conf следующее:

nut_enable="YES"
nut_upslog_enable="YES"
nut_upslog_ups="Luxeon_2000LE" #Указываю явным образом, с какого UPS снимать статистику.
nut_upsmon_enable="YES"


Дополнительно
Некоторые UPS умеют отдавать статистику по SNMP.
К сожалению описать данный вариант съема статистики не смогу, т.к. этот UPS не умеет.

Также можно выдавать статистику на Web.
При установке можно выбрать установку upsstats (более детально можно посмотреть Network UPS Tools)

У меня статистика снимается при помощи cacti, поэтому имеет смысл туда и прикрутить...

Скрипты для съема статистики:

Статус UPS (рисует линию, которая может имеет три значения):

#cat ups_status.sh
#!/bin/sh
# Input
# 1- Luxeon_2000LE
# 2- 192.168.100.8
# 3- 3493
#
# Output
# State of UPS
# 1 - OB On Battery
# 2 - OL On line
# 3 - LB Bypass mode

state=`/usr/local/bin/upsc $1@$2:$3 | /usr/bin/grep ups.status | /usr/bin/awk '{print $2}'`

case $state in
OB) newstate=1
;;
OL) newstate=2
;;
BL) newstate=3
;;
LB) newstate=3
;;
esac

echo $newstate

Загрузка UPS:

#cat ups_load.sh
#!/bin/sh
# 1- Luxeon_2000LE
# 2- 192.168.100.8
# 3- 3493
/usr/local/bin/upsc $1@$2:$3 | /usr/bin/grep ups.load | /usr/bin/awk '{print $2}'

Остальные скрипты пишутся аналогично.


Логи
По-умолчанию логи драйвера вылетают на консоль, а это нам не нужно.

#cat /etc/syslog.conf
!megatec
*.* /var/log/ups_mon.log

#cat /etc/newsyslog.conf
# UPS
/var/log/ups.log   600 7 100 * JC
/var/log/ups_mon.log  666 7 100 * JC

Прикручивание бесперебойника Smart-UPS APC-1500 к FreeBSD
Установка и настройка apcupsd на FreeBSD
apcupsd
Apcupsd manual
Network UPS Tools
Восстановление аккумулятора в бесперебойнике
Man по драйверу megatec
Подключение UPS Ippon в Linux и Windows. NUT+Windows (Рассматривается куча утилит для этого)

Комментариев нет:

Отправить комментарий