Linux ups nut snmp: различия между версиями
Sirmax (обсуждение | вклад) |
Sirmax (обсуждение | вклад) |
||
(не показано 19 промежуточных версий этого же участника) | |||
Строка 2: | Строка 2: | ||
[[Категория:UPS]] |
[[Категория:UPS]] |
||
[[Категория:NUT]] |
[[Категория:NUT]] |
||
+ | |||
− | [[Категория:Zabbix]] |
||
=NUT + SNMP= |
=NUT + SNMP= |
||
− | Хочется тушить стойку после того как пропало питание, через |
+ | Хочется тушить стойку после того как пропало питание, через определенное время (в процессе настройки я его несколько раз уменьшал), при этом безперпебойник доступен по сети (SNMP) |
<BR> |
<BR> |
||
+ | Классический сценарий подразумевает что УПС сообщит о том что батарея "уже почти все" (LB) и тогда только сушить весла. |
||
− | Возможно настроить на каждом сервере отдельный экзкмпляр NUT или опрашивать по сети один |
||
+ | <BR> |
||
+ | Возможно настроить на каждом сервере отдельный экзкмпляр NUT или опрашивать по сети один NUT работающий в режиме сервера - я выбрал сценарий с клиент-сервером |
||
+ | <BR> |
||
+ | |||
+ | При этом виртуальные машины, запущенные на хосте выключаются через [[ACPI|обработку виртуальной кнопки ACPI]] |
||
+ | =<code>NUT</code> серверная часть= |
||
− | =NUT= |
||
==Driver (<code>nut-driver.service</code>) <code>ups.conf</code>== |
==Driver (<code>nut-driver.service</code>) <code>ups.conf</code>== |
||
Предельно простая настройка - нужно знать только адрес и community в файле <code>ups.conf</code> |
Предельно простая настройка - нужно знать только адрес и community в файле <code>ups.conf</code> |
||
Строка 32: | Строка 37: | ||
===<code>upsd.conf</code>=== |
===<code>upsd.conf</code>=== |
||
− | Так как предпологается что |
+ | Так как предпологается что запрос будут приходить с других серверов, то нужно разрешить слушать на всех интерфейсах |
<PRE> |
<PRE> |
||
LISTEN 0.0.0.0 3493 |
LISTEN 0.0.0.0 3493 |
||
Строка 45: | Строка 50: | ||
</PRE> |
</PRE> |
||
+ | ==Проверка работы== |
||
− | ==11== |
||
+ | Локально проверить можно так |
||
+ | <PRE> |
||
+ | upsc UPS6000XL@localhost |
||
+ | </PRE> |
||
+ | <PRE> |
||
+ | Init SSL without certificate database |
||
+ | ambient.1.humidity.alarm.high: 60.00 |
||
+ | ambient.1.humidity.alarm.low: 30.00 |
||
+ | ambient.1.temperature.alarm.high: 40.00 |
||
+ | ambient.1.temperature.alarm.low: 10.00 |
||
+ | battery.charge: 49.00 |
||
+ | battery.charge.restart: 0 |
||
+ | battery.date: 02/07/15 |
||
+ | battery.packs: 1.00 |
||
+ | battery.runtime: 360.00 |
||
+ | battery.runtime.low: 120 |
||
+ | battery.voltage: 218.10 |
||
+ | device.mfr: APC |
||
+ | device.model: Smart-UPS RT 6000 RM XL |
||
+ | device.serial: Q123 |
||
+ | device.type: ups |
||
+ | driver.name: snmp-ups |
||
+ | driver.parameter.pollfreq: 15 |
||
+ | driver.parameter.pollinterval: 2 |
||
+ | driver.parameter.port: 10.72.0.8 |
||
+ | driver.parameter.snmp_version: v1 |
||
+ | driver.parameter.synchronous: no |
||
+ | driver.version: 2.7.4 |
||
+ | driver.version.data: apcc MIB 1.2 |
||
+ | driver.version.internal: 0.97 |
||
+ | input.frequency: 50.00 |
||
+ | input.sensitivity: UNKNOWN |
||
+ | input.transfer.high: 253 |
||
+ | input.transfer.low: 161 |
||
+ | input.transfer.reason: rateOfVoltageChange |
||
+ | input.voltage: 213.10 |
||
+ | input.voltage.maximum: 216.00 |
||
+ | input.voltage.minimum: 210.20 |
||
+ | output.current: 5.20 |
||
+ | output.frequency: 50.00 |
||
+ | output.voltage: 231.60 |
||
+ | output.voltage.nominal: 230 |
||
+ | ups.delay.shutdown: 20 |
||
+ | ups.delay.start: 0 |
||
+ | ups.firmware: 452.19.W |
||
+ | ups.id: UPS_IDEN |
||
+ | ups.load: 23.00 |
||
+ | ups.mfr: APC |
||
+ | ups.mfr.date: 07/07/14 |
||
+ | ups.model: Smart-UPS RT 6000 RM XL |
||
+ | ups.serial: QS1428270733 |
||
+ | ups.status: OL |
||
+ | ups.temperature: 18.40 |
||
+ | ups.test.date: 04/13/2024 |
||
+ | ups.test.result: Ok |
||
+ | </PRE> |
||
+ | На этом серверная часть +/- настроена, и можно переходить к настройке клиентской |
||
+ | |||
+ | =<code>NUT</code>Сетевые клиенты= |
||
+ | <PRE> |
||
+ | apt install nut-client |
||
+ | </PRE> |
||
+ | ==<code>/etc/nut/nut.conf</code>== |
||
+ | Одна строчка: |
||
+ | <PRE> |
||
+ | MODE=netclient |
||
+ | </PRE> |
||
+ | |||
+ | ==<code>/etc/nut/upsmon.conf</code>== |
||
+ | <PRE> |
||
+ | RUN_AS_USER root |
||
+ | MONITOR UPS6000XL@10.72.0.14:3493 1 upsmon pass master |
||
+ | |||
+ | MINSUPPLIES 1 |
||
+ | SHUTDOWNCMD "/sbin/shutdown -h +0" |
||
+ | |||
+ | POLLFREQ 1 |
||
+ | POLLFREQALERT 1 |
||
+ | HOSTSYNC 15 |
||
+ | DEADTIME 15 |
||
+ | |||
+ | POWERDOWNFLAG /etc/killpower |
||
+ | |||
+ | |||
+ | RBWARNTIME 43200 |
||
+ | NOCOMMWARNTIME 300 |
||
+ | FINALDELAY 5 |
||
+ | |||
+ | |||
+ | NOTIFYCMD /usr/sbin/upssched |
||
+ | NOTIFYFLAG ONLINE SYSLOG+WALL+EXEC |
||
+ | NOTIFYFLAG ONBATT SYSLOG+WALL+EXEC |
||
+ | NOTIFYFLAG LOWBATT SYSLOG+WALL+EXEC |
||
+ | NOTIFYFLAG FSD SYSLOG+WALL+EXEC |
||
+ | NOTIFYFLAG COMMOK SYSLOG+WALL+EXEC |
||
+ | NOTIFYFLAG COMMBAD SYSLOG+WALL+EXEC |
||
+ | NOTIFYFLAG SHUTDOWN SYSLOG+WALL+EXEC |
||
+ | NOTIFYFLAG REPLBATT SYSLOG+WALL+EXEC |
||
+ | NOTIFYFLAG NOCOMM SYSLOG+WALL+EXEC |
||
+ | NOTIFYFLAG NOPARENT SYSLOG+WALL+EXEC |
||
+ | </PRE> |
||
+ | |||
+ | ===Краткое описание=== |
||
+ | |||
+ | * <code>RUN_AS_USER root</code> - от какого пользователя запускать |
||
+ | * <code>MONITOR UPS6000XL@10.72.0.14:3493 1 upsmon pass master</code> - описание УПСа |
||
+ | ** <code>UPS6000XL@10.72.0.14:3493</code> - Имя и адрес УПСа который мониторится |
||
+ | ** <code> 1 </code> - число блоков питания на этой системе которые подключены к выбранному УПСу (на предмет тушить или нет систему если УПс говорит что пора, если установить 0 то состояние УПСа можно игнорировать) |
||
+ | ** <code> upsmon pass</code> - логин/пароль которые определены на сервере |
||
+ | ** <code> master</code> # "master" means this system will shutdown last, allowing the slaves time to shutdown first. "slave" means this system shuts down immediately when power goes critical. (А откуда он узнает про другие системы? И как?) |
||
+ | * <code>MINSUPPLIES 1</code> - указываем количество блоков питания которые должны получать мощность сохраняя систему запущенной. Это значит что для серверов с 2 блоками питания которые заведены на 2 разных UPS и оба из которых мониторятся, команда на выключение будет подана только при условии что оба УПСа сообщат о том что у них низкий заряд батарей. За неимением 2 УПСов проверить этот сценарий я пока не могу. |
||
+ | * <code>SHUTDOWNCMD "/sbin/shutdown -h +0"</code> |
||
+ | * <code>POLLFREQ 1</code>опрос мониторами с частотой (измеряется в секундах) для обычной деятельности. Вы можете отрегулировать эту частоту опроса, чтобы upsmon не “зашумлял” вашу сеть, но не вносите слишком большие значения тк. оно может пропустить отключение питания; |
||
+ | * <code>POLLFREQALERT 1</code> опрос UPS с частотой в секундах когда пропало питание. Можно сделать значение поменьше, чем POLLFREQ для лучшей чувствительности работы батареи, а можно и не делать; |
||
+ | * <code>HOSTSYNC 15</code> как долго upsmon будет ждать перед переходом к следующему upsmon. master upsmon использует это число при ожидании slaves чтобы отключиться после того как он установил флаг принудительное завершение работы (FSD). И если slaves не отключаться после этого тайм аута, то выключение продолжится без них; (что бы это не значило) |
||
+ | |||
+ | * <code>DEADTIME 15</code>интервал ожидания перед объявлением статуса UPS как «мертвый». Upsmon требует, чтобы UPS предоставлял свою статус информацию, каждые несколько секунд (см. POLLFREQ и POLLFREQALERT). Если статус загрузки, UPS помечен fails. И если оно остается fails более чем DEADTIME секунд, то UPS помечается как «мертвый». Выставляйте значение этой переменной в несколько (в три и более раза пойдет) раз больше чем POLLFREQ и POLLFREQALERT; |
||
+ | * <code>POWERDOWNFLAG /etc/killpower</code> |
||
+ | * <code>NOTIFYFLAG</code> - изменение поведения upsmon при возникновении событий NOTIFY; другиим словами что делать при наступлении события |
||
+ | * <code>RBWARNTIME</code> - предупреждение замены аккумулятора в секундах; |
||
+ | * <code>NOCOMMWARNTIME</code> - предупреждение по времени при не общении к UPS в секундах; |
||
+ | * <code>FINALDELAY</code> - через сколько выполнить SHUTDOWNCMD. |
||
+ | |||
+ | * <code>NOTIFYCMD /usr/sbin/upssched</code> - какую команду дернуть при событии (если для события есть флаг EXEC) |
||
+ | * <code>NOTIFYFLAG ONLINE SYSLOG+WALL+EXEC</code> для всех событий действия одинаковы - записать в сислог, выслать сообщение на консоль (коммандой wall) и вызвать бинарник указанный в <code>NOTIFYCMD</code> |
||
+ | * <code>NOTIFYFLAG ONBATT SYSLOG+WALL+EXEC</code> |
||
+ | * <code>NOTIFYFLAG LOWBATT SYSLOG+WALL+EXEC</code> |
||
+ | * <code>NOTIFYFLAG FSD SYSLOG+WALL+EXEC</code> |
||
+ | * <code>NOTIFYFLAG COMMOK SYSLOG+WALL+EXEC</code> |
||
+ | * <code>NOTIFYFLAG COMMBAD SYSLOG+WALL+EXEC</code> |
||
+ | * <code>NOTIFYFLAG SHUTDOWN SYSLOG+WALL+EXEC</code> |
||
+ | * <code>NOTIFYFLAG REPLBATT SYSLOG+WALL+EXEC</code> |
||
+ | * <code>NOTIFYFLAG NOCOMM SYSLOG+WALL+EXEC</code> |
||
+ | * <code>NOTIFYFLAG NOPARENT SYSLOG+WALL+EXEC</code> |
||
+ | ==<code>/etc/nut/upssched.conf</code>== |
||
+ | Этот файл представляет собой описание в формате |
||
+ | |||
+ | * <code>AT ONBATT</code> событие |
||
+ | * <code>*</code> для какого бесперебойника если их несколько (у меня он один - и тут "для любого") |
||
+ | * <code>START-TIMER timer_onbatt_10_sec 10</code> - действие, запустить таймер с именем <code>START-TIMER timer_onbatt_10_sec</code> который завершиться через <code>10</code> секунд, после чего будет вызван скрипт определенный в <code>CMDSCRIPT</code> с параметром - именем таймера |
||
+ | * <code>EXECUTE onbatt</code> - немедленно вызывать скрипт определенный в <code>CMDSCRIPT</code> c параметром (в этом примере) <code>onbatt</code> |
||
+ | |||
+ | <PRE> |
||
+ | CMDSCRIPT /etc/nut/bin/upssched-cmd |
||
+ | |||
+ | #PIPEFN /run/nut/upssched/upssched.pipe |
||
+ | #LOCKFN /run/nut/upssched/upssched.lock |
||
+ | |||
+ | PIPEFN /tmp/upssched.pipe |
||
+ | LOCKFN /tmp/upssched.lock |
||
+ | |||
+ | AT ONBATT * START-TIMER timer_onbatt_10_sec 10 |
||
+ | AT ONBATT * EXECUTE onbatt |
||
+ | |||
+ | AT ONLINE * CANCEL-TIMER timer_onbatt_10_sec |
||
+ | AT ONLINE * EXECUTE online |
||
+ | |||
+ | AT LOWBATT * EXECUTE lowbatt |
||
+ | |||
+ | AT FSD * EXECUTE fsd |
||
+ | |||
+ | AT COMMBAD * EXECUTE commbad |
||
+ | AT COMMBAD * START-TIMER timer_commbad_400_sec 400 |
||
+ | |||
+ | AT COMMOK * EXECUTE commok |
||
+ | AT COMMOK * CANCEL-TIMER timer_commbad_400_sec |
||
+ | |||
+ | |||
+ | AT SHUTDOWN * EXECUTE shutdown |
||
+ | AT REPLBATT * EXECUTE replbatt |
||
+ | AT NOCOMM * EXECUTE nocomm |
||
+ | AT NOPARENT * EXECUTE noparent |
||
+ | </PRE> |
||
+ | ===Краткое описание=== |
||
+ | * <code>CMDSCRIPT /etc/nut/bin/upssched-cmd</code> - скрипт-обработчик |
||
+ | * <code>AT ONBATT * START-TIMER timer_onbatt_10_sec 10</code> - запустить таймер, по истечении котрого вызвать комманду <code>/etc/nut/bin/upssched-cmd </code> |
||
+ | * <code>AT ONBATT * EXECUTE onbatt</code> - немедленно по наступлению события вызвать комманду <code>/etc/nut/bin/upssched-cmd onbatt</code> |
||
+ | * <code>AT ONLINE * CANCEL-TIMER timer_onbatt_10_sec</code> - отменить запущенный таймер если питание вернулось до его истечения |
||
+ | Далее аналогично, рписывать все параметры смысла нет(а что такое NOPARENT я и не знаю) |
||
+ | |||
+ | ==<code>/etc/nut/bin/upssched-cmd</code>== |
||
+ | Это просто скрипт который смотрит на параметр и в зависимости от этого выполняет какие-то действия |
||
+ | <BR> |
||
+ | В моем случае при истечении 10-секундного таймера <code>timer_onbatt_10_sec</code> данные о том что сервер выключается и показатели УПСа (<code>UPS="UPS6000XL@10.72.0.14:3493"</code>) будут запиисаны в файл (<code>SHUTDOWN_REASON_FILE="/etc/shutdown_reason"</code>) после чего запущена команда на выключение (<code>/sbin/shutdown -h +0 2>&1 | logger -t "upsmon[upssched][timer_onbatt_10_sec]"</code>) |
||
+ | |||
+ | <PRE> |
||
+ | #!/bin/sh |
||
+ | echo "[$(date)] [${@}]" | logger -t "upsmon[upssched][upssched-cmd] Start" |
||
+ | |||
+ | SHUTDOWN_REASON_FILE="/etc/shutdown_reason" |
||
+ | UPS="UPS6000XL@10.72.0.14:3493" |
||
+ | |||
+ | case $1 in |
||
+ | timer_onbatt_10_sec) |
||
+ | echo "[$(date)]upsmon[upssched][timer_onbatt_10_sec] Executing /sbin/shutdown -h +0" > ${SHUTDOWN_REASON_FILE} |
||
+ | upsc ${UPS} 2>&1 >>${SHUTDOWN_REASON_FILE} |
||
+ | |||
+ | /sbin/shutdown -h +0 2>&1 | logger -t "upsmon[upssched][timer_onbatt_10_sec]" |
||
+ | ;; |
||
+ | onbatt) |
||
+ | echo "UPS status is ${@}"| logger -t "upsmon[upssched]" |
||
+ | upsc ${UPS} 2>&1 | logger -t "upsmon[upssched][onbatt]" |
||
+ | ;; |
||
+ | online) |
||
+ | echo "UPS status is ${@}"| logger -t "upsmon[upssched]" |
||
+ | upsc ${UPS} 2>&1 | logger -t "upsmon[upssched][online]" |
||
+ | ;; |
||
+ | lowbatt) |
||
+ | echo "UPS status is ${@}"| logger -t "upsmon[upssched]" |
||
+ | upsc ${UPS} 2>&1 | logger -t "upsmon[upssched][lowbatt]" |
||
+ | ;; |
||
+ | fsd) |
||
+ | echo "UPS status is ${@}"| logger -t "upsmon[upssched]" |
||
+ | upsc ${UPS} 2>&1 | logger -t "upsmon[upssched][fsd]" |
||
+ | ;; |
||
+ | commbad) |
||
+ | echo "UPS status is ${@}"| logger -t "upsmon[upssched]" |
||
+ | upsc ${UPS} 2>&1 | logger -t "upsmon[upssched][commbad]" |
||
+ | ;; |
||
+ | commok) |
||
+ | echo "UPS status is ${@}"| logger -t "upsmon[upssched]" |
||
+ | upsc ${UPS} 2>&1 | logger -t "upsmon[upssched][commok]" |
||
+ | ;; |
||
+ | shutdown) |
||
+ | echo "UPS status is ${@}"| logger -t "upsmon[upssched]" |
||
+ | upsc ${UPS} 2>&1 | logger -t "upsmon[upssched][shutdown]" |
||
+ | ;; |
||
+ | replbatt) |
||
+ | echo "UPS status is ${@}"| logger -t "upsmon[upssched]" |
||
+ | upsc ${UPS} 2>&1 | logger -t "upsmon[upssched][replbatt]" |
||
+ | ;; |
||
+ | nocomm) |
||
+ | echo "UPS status is ${@}"| logger -t "upsmon[upssched]" |
||
+ | upsc ${UPS} 2>&1 | logger -t "upsmon[upssched][nocomm]" |
||
+ | ;; |
||
+ | noparent) |
||
+ | echo "UPS status is ${@}"| logger -t "upsmon[upssched]" |
||
+ | upsc ${UPS} 2>&1 | logger -t "upsmon[upssched][noparent]" |
||
+ | ;; |
||
+ | *) |
||
+ | echo "Unknown State, ERROR"| logger -t "upsmon[upssched] $@" |
||
+ | ;; |
||
+ | esac |
||
+ | </PRE> |
Текущая версия на 16:21, 6 мая 2024
NUT + SNMP
Хочется тушить стойку после того как пропало питание, через определенное время (в процессе настройки я его несколько раз уменьшал), при этом безперпебойник доступен по сети (SNMP)
Классический сценарий подразумевает что УПС сообщит о том что батарея "уже почти все" (LB) и тогда только сушить весла.
Возможно настроить на каждом сервере отдельный экзкмпляр NUT или опрашивать по сети один NUT работающий в режиме сервера - я выбрал сценарий с клиент-сервером
При этом виртуальные машины, запущенные на хосте выключаются через обработку виртуальной кнопки ACPI
NUT
серверная часть
Driver (nut-driver.service
) ups.conf
Предельно простая настройка - нужно знать только адрес и community в файле ups.conf
[UPS6000XL] driver = snmp-ups port = 10.72.0.8 desc = "Smart-UPS RT 6000 RM XL" community = public snmp_version = v1 pollfreq = 15
community = public
заменить на актуальное значение
Сервер (nut-server.service
)nut.conf
upsd.conf
upsd.users
nut.conf
Тут настраивается режим сервера, в этом случае
MODE=netserver
upsd.conf
Так как предпологается что запрос будут приходить с других серверов, то нужно разрешить слушать на всех интерфейсах
LISTEN 0.0.0.0 3493
upsd.users
[admin] password = admin actions = SET instcmds = ALL
Проверка работы
Локально проверить можно так
upsc UPS6000XL@localhost
Init SSL without certificate database ambient.1.humidity.alarm.high: 60.00 ambient.1.humidity.alarm.low: 30.00 ambient.1.temperature.alarm.high: 40.00 ambient.1.temperature.alarm.low: 10.00 battery.charge: 49.00 battery.charge.restart: 0 battery.date: 02/07/15 battery.packs: 1.00 battery.runtime: 360.00 battery.runtime.low: 120 battery.voltage: 218.10 device.mfr: APC device.model: Smart-UPS RT 6000 RM XL device.serial: Q123 device.type: ups driver.name: snmp-ups driver.parameter.pollfreq: 15 driver.parameter.pollinterval: 2 driver.parameter.port: 10.72.0.8 driver.parameter.snmp_version: v1 driver.parameter.synchronous: no driver.version: 2.7.4 driver.version.data: apcc MIB 1.2 driver.version.internal: 0.97 input.frequency: 50.00 input.sensitivity: UNKNOWN input.transfer.high: 253 input.transfer.low: 161 input.transfer.reason: rateOfVoltageChange input.voltage: 213.10 input.voltage.maximum: 216.00 input.voltage.minimum: 210.20 output.current: 5.20 output.frequency: 50.00 output.voltage: 231.60 output.voltage.nominal: 230 ups.delay.shutdown: 20 ups.delay.start: 0 ups.firmware: 452.19.W ups.id: UPS_IDEN ups.load: 23.00 ups.mfr: APC ups.mfr.date: 07/07/14 ups.model: Smart-UPS RT 6000 RM XL ups.serial: QS1428270733 ups.status: OL ups.temperature: 18.40 ups.test.date: 04/13/2024 ups.test.result: Ok
На этом серверная часть +/- настроена, и можно переходить к настройке клиентской
NUT
Сетевые клиенты
apt install nut-client
/etc/nut/nut.conf
Одна строчка:
MODE=netclient
/etc/nut/upsmon.conf
RUN_AS_USER root MONITOR UPS6000XL@10.72.0.14:3493 1 upsmon pass master MINSUPPLIES 1 SHUTDOWNCMD "/sbin/shutdown -h +0" POLLFREQ 1 POLLFREQALERT 1 HOSTSYNC 15 DEADTIME 15 POWERDOWNFLAG /etc/killpower RBWARNTIME 43200 NOCOMMWARNTIME 300 FINALDELAY 5 NOTIFYCMD /usr/sbin/upssched NOTIFYFLAG ONLINE SYSLOG+WALL+EXEC NOTIFYFLAG ONBATT SYSLOG+WALL+EXEC NOTIFYFLAG LOWBATT SYSLOG+WALL+EXEC NOTIFYFLAG FSD SYSLOG+WALL+EXEC NOTIFYFLAG COMMOK SYSLOG+WALL+EXEC NOTIFYFLAG COMMBAD SYSLOG+WALL+EXEC NOTIFYFLAG SHUTDOWN SYSLOG+WALL+EXEC NOTIFYFLAG REPLBATT SYSLOG+WALL+EXEC NOTIFYFLAG NOCOMM SYSLOG+WALL+EXEC NOTIFYFLAG NOPARENT SYSLOG+WALL+EXEC
Краткое описание
RUN_AS_USER root
- от какого пользователя запускатьMONITOR UPS6000XL@10.72.0.14:3493 1 upsmon pass master
- описание УПСаUPS6000XL@10.72.0.14:3493
- Имя и адрес УПСа который мониторится1
- число блоков питания на этой системе которые подключены к выбранному УПСу (на предмет тушить или нет систему если УПс говорит что пора, если установить 0 то состояние УПСа можно игнорировать)upsmon pass
- логин/пароль которые определены на сервереmaster
# "master" means this system will shutdown last, allowing the slaves time to shutdown first. "slave" means this system shuts down immediately when power goes critical. (А откуда он узнает про другие системы? И как?)
MINSUPPLIES 1
- указываем количество блоков питания которые должны получать мощность сохраняя систему запущенной. Это значит что для серверов с 2 блоками питания которые заведены на 2 разных UPS и оба из которых мониторятся, команда на выключение будет подана только при условии что оба УПСа сообщат о том что у них низкий заряд батарей. За неимением 2 УПСов проверить этот сценарий я пока не могу.SHUTDOWNCMD "/sbin/shutdown -h +0"
POLLFREQ 1
опрос мониторами с частотой (измеряется в секундах) для обычной деятельности. Вы можете отрегулировать эту частоту опроса, чтобы upsmon не “зашумлял” вашу сеть, но не вносите слишком большие значения тк. оно может пропустить отключение питания;POLLFREQALERT 1
опрос UPS с частотой в секундах когда пропало питание. Можно сделать значение поменьше, чем POLLFREQ для лучшей чувствительности работы батареи, а можно и не делать;HOSTSYNC 15
как долго upsmon будет ждать перед переходом к следующему upsmon. master upsmon использует это число при ожидании slaves чтобы отключиться после того как он установил флаг принудительное завершение работы (FSD). И если slaves не отключаться после этого тайм аута, то выключение продолжится без них; (что бы это не значило)
DEADTIME 15
интервал ожидания перед объявлением статуса UPS как «мертвый». Upsmon требует, чтобы UPS предоставлял свою статус информацию, каждые несколько секунд (см. POLLFREQ и POLLFREQALERT). Если статус загрузки, UPS помечен fails. И если оно остается fails более чем DEADTIME секунд, то UPS помечается как «мертвый». Выставляйте значение этой переменной в несколько (в три и более раза пойдет) раз больше чем POLLFREQ и POLLFREQALERT;POWERDOWNFLAG /etc/killpower
NOTIFYFLAG
- изменение поведения upsmon при возникновении событий NOTIFY; другиим словами что делать при наступлении событияRBWARNTIME
- предупреждение замены аккумулятора в секундах;NOCOMMWARNTIME
- предупреждение по времени при не общении к UPS в секундах;FINALDELAY
- через сколько выполнить SHUTDOWNCMD.
NOTIFYCMD /usr/sbin/upssched
- какую команду дернуть при событии (если для события есть флаг EXEC)NOTIFYFLAG ONLINE SYSLOG+WALL+EXEC
для всех событий действия одинаковы - записать в сислог, выслать сообщение на консоль (коммандой wall) и вызвать бинарник указанный вNOTIFYCMD
NOTIFYFLAG ONBATT SYSLOG+WALL+EXEC
NOTIFYFLAG LOWBATT SYSLOG+WALL+EXEC
NOTIFYFLAG FSD SYSLOG+WALL+EXEC
NOTIFYFLAG COMMOK SYSLOG+WALL+EXEC
NOTIFYFLAG COMMBAD SYSLOG+WALL+EXEC
NOTIFYFLAG SHUTDOWN SYSLOG+WALL+EXEC
NOTIFYFLAG REPLBATT SYSLOG+WALL+EXEC
NOTIFYFLAG NOCOMM SYSLOG+WALL+EXEC
NOTIFYFLAG NOPARENT SYSLOG+WALL+EXEC
/etc/nut/upssched.conf
Этот файл представляет собой описание в формате
AT ONBATT
событие*
для какого бесперебойника если их несколько (у меня он один - и тут "для любого")START-TIMER timer_onbatt_10_sec 10
- действие, запустить таймер с именемSTART-TIMER timer_onbatt_10_sec
который завершиться через10
секунд, после чего будет вызван скрипт определенный вCMDSCRIPT
с параметром - именем таймераEXECUTE onbatt
- немедленно вызывать скрипт определенный вCMDSCRIPT
c параметром (в этом примере)onbatt
CMDSCRIPT /etc/nut/bin/upssched-cmd #PIPEFN /run/nut/upssched/upssched.pipe #LOCKFN /run/nut/upssched/upssched.lock PIPEFN /tmp/upssched.pipe LOCKFN /tmp/upssched.lock AT ONBATT * START-TIMER timer_onbatt_10_sec 10 AT ONBATT * EXECUTE onbatt AT ONLINE * CANCEL-TIMER timer_onbatt_10_sec AT ONLINE * EXECUTE online AT LOWBATT * EXECUTE lowbatt AT FSD * EXECUTE fsd AT COMMBAD * EXECUTE commbad AT COMMBAD * START-TIMER timer_commbad_400_sec 400 AT COMMOK * EXECUTE commok AT COMMOK * CANCEL-TIMER timer_commbad_400_sec AT SHUTDOWN * EXECUTE shutdown AT REPLBATT * EXECUTE replbatt AT NOCOMM * EXECUTE nocomm AT NOPARENT * EXECUTE noparent
Краткое описание
CMDSCRIPT /etc/nut/bin/upssched-cmd
- скрипт-обработчикAT ONBATT * START-TIMER timer_onbatt_10_sec 10
- запустить таймер, по истечении котрого вызвать комманду/etc/nut/bin/upssched-cmd
AT ONBATT * EXECUTE onbatt
- немедленно по наступлению события вызвать комманду/etc/nut/bin/upssched-cmd onbatt
AT ONLINE * CANCEL-TIMER timer_onbatt_10_sec
- отменить запущенный таймер если питание вернулось до его истечения
Далее аналогично, рписывать все параметры смысла нет(а что такое NOPARENT я и не знаю)
/etc/nut/bin/upssched-cmd
Это просто скрипт который смотрит на параметр и в зависимости от этого выполняет какие-то действия
В моем случае при истечении 10-секундного таймера timer_onbatt_10_sec
данные о том что сервер выключается и показатели УПСа (UPS="UPS6000XL@10.72.0.14:3493"
) будут запиисаны в файл (SHUTDOWN_REASON_FILE="/etc/shutdown_reason"
) после чего запущена команда на выключение (/sbin/shutdown -h +0 2>&1 | logger -t "upsmon[upssched][timer_onbatt_10_sec]"
)
#!/bin/sh echo "[$(date)] [${@}]" | logger -t "upsmon[upssched][upssched-cmd] Start" SHUTDOWN_REASON_FILE="/etc/shutdown_reason" UPS="UPS6000XL@10.72.0.14:3493" case $1 in timer_onbatt_10_sec) echo "[$(date)]upsmon[upssched][timer_onbatt_10_sec] Executing /sbin/shutdown -h +0" > ${SHUTDOWN_REASON_FILE} upsc ${UPS} 2>&1 >>${SHUTDOWN_REASON_FILE} /sbin/shutdown -h +0 2>&1 | logger -t "upsmon[upssched][timer_onbatt_10_sec]" ;; onbatt) echo "UPS status is ${@}"| logger -t "upsmon[upssched]" upsc ${UPS} 2>&1 | logger -t "upsmon[upssched][onbatt]" ;; online) echo "UPS status is ${@}"| logger -t "upsmon[upssched]" upsc ${UPS} 2>&1 | logger -t "upsmon[upssched][online]" ;; lowbatt) echo "UPS status is ${@}"| logger -t "upsmon[upssched]" upsc ${UPS} 2>&1 | logger -t "upsmon[upssched][lowbatt]" ;; fsd) echo "UPS status is ${@}"| logger -t "upsmon[upssched]" upsc ${UPS} 2>&1 | logger -t "upsmon[upssched][fsd]" ;; commbad) echo "UPS status is ${@}"| logger -t "upsmon[upssched]" upsc ${UPS} 2>&1 | logger -t "upsmon[upssched][commbad]" ;; commok) echo "UPS status is ${@}"| logger -t "upsmon[upssched]" upsc ${UPS} 2>&1 | logger -t "upsmon[upssched][commok]" ;; shutdown) echo "UPS status is ${@}"| logger -t "upsmon[upssched]" upsc ${UPS} 2>&1 | logger -t "upsmon[upssched][shutdown]" ;; replbatt) echo "UPS status is ${@}"| logger -t "upsmon[upssched]" upsc ${UPS} 2>&1 | logger -t "upsmon[upssched][replbatt]" ;; nocomm) echo "UPS status is ${@}"| logger -t "upsmon[upssched]" upsc ${UPS} 2>&1 | logger -t "upsmon[upssched][nocomm]" ;; noparent) echo "UPS status is ${@}"| logger -t "upsmon[upssched]" upsc ${UPS} 2>&1 | logger -t "upsmon[upssched][noparent]" ;; *) echo "Unknown State, ERROR"| logger -t "upsmon[upssched] $@" ;; esac