NUT - zarządzanie UPSami

Zarządzanie zasilaczami awaryjnymi za pomocą NUT pozwala uniknąć stosowania nietypowego oprogoramowania i pozwala na udostępnieniu informacji o zasilaniu awaryjnym dowolnemu systemowi operacyjnemu.

Rozpocznyamy od instalacji serwera NUT na urządzeniu, które będzie bezpośrednio podłączonego do UPSa (zakładamy, że na tym urządzeniu będzie Debian).

apt install nut nut-client nut-server

Konfiguracja UPSa

Sprawdzamy czy UPS jest poprawnie podłączony i jaki ma idetyfikator na magistrali USB

lsusb

Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 003: ID 17ef:60ee Lenovo TrackPoint Keyboard II
Bus 001 Device 002: ID 0463:ffff MGE UPS Systems UPS
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

W tym przypadku jest to 0463:ffff

Pobieramy informacje o zasilaczu używając nut-scanner, otrzymane informacje ułatwią znacznie konfigurację.

nut-scanner -U

SNMP library not found. SNMP search disabled.
Neon library not found. XML search disabled.
IPMI library not found. IPMI search disabled.
Scanning USB bus.
[nutdev1]
        driver = "usbhid-ups"
        port = "auto"
        vendorid = "0463"
        productid = "FFFF"
        bus = "001"

Konfiguracja przechowywana jest w /etc/nut/ups.conf
Dobrze skopiować pierwotny plik konfiguracyjny, by móc do niego wrócić a nową konfigurację stworzyć w kompletnie nowym pliku, zatem:

cp /etc/nut/ups.conf /etc/nut/ups.example.conf

Poniżej nowy plik konfiguracyjny

pollinterval = 1
maxretry = 3

[ups1]
        driver = usbhid-ups
        port = auto
        desc = "Nasz UPS1"
        vendorid = 0463
        productid = FFFF

Plik może zawierać wiele sekcji dla różnych UPSów.

Konfiguracja UPSmon

Podobnie jak wcześniej kopiujemy na zaś pierwotny plik w bezpieczne miejsce.

Zawartość pliku uspmon.conf powinna wyglądać tak:

RUN_AS_USER root

MONITOR ups1@localhost 1 admin secret master

gdzie:
ups1@localhost wskazuje na wcześniej skonfigurowany zasilacz
1 to ilość podłączonych UPSów
admin użytkownik
secret hasło
master oznacza, że ten UPS jest fizycznie podłączony do tej maszyny

Jeżeli mamy podpiętych więcej UPSów to każdy dodajemy w kolejnej linii zaczynając od MONITOR.

upsd.conf

Jak poprzednio zabezpieczamy pierwotny plik.

Zawartość pliku może wyglądać tak:

LISTEN 0.0.0.0 3493

Pozwoli to na dostęp z wszystkich komputerów do danych o UPSach.

Jeżeli zamierzmy korzystać z tych danych jedynie na maszynie podłaczonej fizycznie do UPSa plik może wyglądać jak poniżej:

LISTEN 127.0.0.1 3493

nut.conf

MODE=netserver

gdzie MODE może mieć wartości: standalone - klient i serwer NUT na tej samej maszynie netserver - udostępnianie informacji innym maszynom netclient - tylko pobieranie informacji z serwera nutdev1

upsd.users

Ustawiamy dane użytkowników, którch będzie obsługiwał nasz serwer NUT

[monuser]
  password = secret
  admin master

W ten sposób utworzyliśmy użytkownika admin o haśle secret

Uruchamianie NUT z nową konfiguracją

Mamy dwie opcje - prostsza - restart maszyny
Trudniejsza - ponowne uruchomienie wszystkich procesów związanych z NUT i przeładowanie sterowników:

service nut-server restart
service nut-client restart
systemctl restart nut-monitor
upsdrvctl stop
upsdrvctl start

Wykonanie każdego z tych poleceń może chwilkę zająć.

Testowanie połączenia

Uruchamiamy upsc podając nazwę zasilacza i maszyny, która go monitoruje

upsc ups1@localhost

Powinniśmy otrzymać informacje o stanie zasilacza:

Init SSL without certificate database
battery.charge: 81
battery.runtime: 2131
battery.type: PbAc
device.mfr: EATON
device.model: 5E 850i
device.type: ups
driver.name: usbhid-ups
driver.parameter.pollfreq: 30
driver.parameter.pollinterval: 1
driver.parameter.port: auto
driver.parameter.productid: FFFF
driver.parameter.synchronous: no
driver.parameter.vendorid: 0463
driver.version: 2.7.4
driver.version.data: MGE HID 1.40
driver.version.internal: 0.41
input.voltage: 236.0
outlet.1.status: on
outlet.desc: Main Outlet
outlet.id: 1
outlet.switchable: no
output.frequency: 49.9
output.frequency.nominal: 50
output.voltage: 236.0
output.voltage.nominal: 230
ups.beeper.status: enabled
ups.delay.shutdown: 20
ups.firmware: 03.08.0018
ups.load: 10
ups.mfr: EATON
ups.model: 5E 850i
ups.power.nominal: 850
ups.productid: ffff
ups.start.battery: yes
ups.status: OL
ups.timer.shutdown: -1
ups.vendorid: 0463

Możemy pytać o konkretne parametry - np.: o stan naładowania:

upsc ups1@localhost battery.charge
Init SSL without certificate database
81

webnut - kontener docker prezentujący informacje o zasilaczach

Tworzymy plik docker-compose.yml o zawartości:

version: "3.1"
services:
  nut:
    image: teknologist/webnut
    container_name: webnut
    environment:
      - UPS_HOST=192.168.x.y
      - UPS_PORT=3493
      - UPS_USER=admin
      - UPS_PASSWORD=secret
    restart: unless-stopped
    security_opt:
      - no-new-privileges:true
    ports:
      - 6543:6543

Następnie wydajemy polecenie:

docker-compose up -d --force-recreate

Wgląd do stanu UPSa z Windows

Pobieramy WinNUT-client z github albo stąd: WinNUT

NUT client na osobnej maszynie

Zaczynamy od tego, że musimy mieć zainstalowany pakiet nut-client:

apt install nut-client

Przystępujemy do edycji /etc/nut/upsmon.conf

RUN_AS_USER root

MONITOR ups1@192.168.x.y 1 admin secret slave

MINSUPPLIES 1
SHUTDOWNCMD "/sbin/shutdown -h now"
NOTIFYCMD /usr/sbin/upssched
POLLFREQ 2
POLLFREQALERT 1
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"

NOTIFYFLAG ONLINE     SYSLOG+WALL
NOTIFYFLAG ONBATT     SYSLOG+WALL
NOTIFYFLAG LOWBATT    SYSLOG+WALL
NOTIFYFLAG FSD        SYSLOG+WALL
NOTIFYFLAG COMMOK     SYSLOG+WALL
NOTIFYFLAG COMMBAD    SYSLOG+WALL
NOTIFYFLAG SHUTDOWN   SYSLOG+WALL
NOTIFYFLAG REPLBATT   SYSLOG+WALL
NOTIFYFLAG NOCOMM     SYSLOG+WALL
NOTIFYFLAG NOPARENT   SYSLOG+WALL

RBWARNTIME 43200

NOCOMMWARNTIME 600

FINALDELAY 5

Konfigurujemy /etc/nut/nut.conf

MODE=netclient

Konfigurujemy /etc/nut/upssched.conf

CMDSCRIPT /etc/nut/upssched-cmd
PIPEFN /etc/nut/upssched.pipe
LOCKFN /etc/nut/upssched.lock

AT ONBATT * START-TIMER onbatt 30
AT ONLINE * CANCEL-TIMER onbatt online
AT ONBATT * START-TIMER earlyshutdown 30
AT LOWBATT * EXECUTE onbatt
AT COMMBAD * START-TIMER commbad 30
AT COMMOK * CANCEL-TIMER commbad commok
AT NOCOMM * EXECUTE commbad
AT SHUTDOWN * EXECUTE powerdown
AT SHUTDOWN * EXECUTE powerdown

Konfigurujemy /etc/nut/upssched-cmd

#!/bin/sh
 case $1 in
       onbatt)
          logger -t upssched-cmd "UPS running on battery"
          ;;
       earlyshutdown)
          logger -t upssched-cmd "UPS on battery too long, early shutdown"
          /usr/sbin/upsmon -c fsd
          ;;
       shutdowncritical)
          logger -t upssched-cmd "UPS on battery critical, forced shutdown"
          /usr/sbin/upsmon -c fsd
          ;;
       upsgone)
          logger -t upssched-cmd "UPS has been gone too long, can't reach"
          ;;
       *)
          logger -t upssched-cmd "Unrecognized command: $1"
          ;;
 esac

Dla pliku /etc/nut/upssched-cmd doodajemy flage pozwalającą go uruchamiać:

chmod a+x /etc/nut/upssched-cmd

Restartujemy klienta NUT

systemctl restart nut-client

Testujemy konfigurację wysyłając żądnie informacji o stanie UPSa:

upsc ups1@192.168.x.y

Testowanie

By sprawdzić czy klienci właściwie zareagują możemy zrestartować serwer NUT na maszynie do której fizycznie podłączone są zasilacze awaryjne:

systemctl restart nut-server

Na maszynach z klientami powinny pojawić się komunikaty o utracie łączności po czym komunikaty o odzyskaniu łączności.

Poprzedni wpis Następny wpis