ESXi 6.5 och UPS-hantering via NUT

15 Sep 2019

apc ups

För galningar som jag som kör ett mindre datacenter hemma och dessutom bor på landet (med allt vad det innebär i form av ett elnät som både ger och tar…) kan det vara trevligt att ha batteribackuper till sina servrar och lagringsenheter, en så kallad UPS. Enligt alla former av gängse tradition och standard köper man givetvis UPS:er från APC när sånt ska göras och jag har tre stycken sådana kopplade till mina servrar. APC är trevliga eftersom de fungerar med i princip allt, från macOS till Linux och FreeBSD stödjer dem utan minsta bråk.

Det finns dock en plattform som är lite bråkig när det gäller att prata med UPS:er via USB-anslutning och det är VMware:s virtualiseringsplattform ESXi. Inte för att VMware är elaka på något sätt (åtminstone inte i detta avseende) men de tar sina grejer på allvar och därför anser de att man ska prata via sina UPS:er via nätverkskablage istället för USB. Lite underligt kanske med tanke på att du faktiskt kan tappa nätverket vid ett strömavbrott, men den diskussionen lämnar vi till ett annat tillfälle.

Det finns dock vägar runt detta. Systemet heter Network UPS Tools, NUT, och fungerar i praktiken som en brygga mellan dina UPS:er, som du ansluter till en dator (det kan vara en lagringsserver som kör FreeNAS eller en Raspberry Pi med Linux på, för att ta två exempel) via USB och sedan pratar andra enheter, exempelvis din brandvägg som kör PFSense, lagringsenhet som kör FreeNAS, valfri server som kör Windows eller Linux eller vad du vill, med denna NUT-server via en klientprogramvara. Känner NUT-servern av att din UPS körs på batterier kommer den tala om det för alla NUT-klienter som pratar med denna server och sedan kan de agera utifrån de inställningar du gett dem. I praktiken är detta det VMware vill göra med nätverksanslutna UPS:er men det går via en tredje part i form av en separat serverdator.

I mitt fall har jag valt att ansluta en av mina UPS:er till en av mina servrar som kör FreeNAS. På denna server har jag sedan konfigurerat upp en master för NUT. Detta finns väl dokumenterat så det är inget jag tänker gå in på närmare här (förutom att du inte ska glömma att ange LISTEN IP-adress-till-freenas-servern i fältet för Auxilary Parameters (upsd.conf)).

Nä, det roliga kommer när vi ska få igång detta på ESXi 6.5, som jag kör. Anledningen till att jag inte kör något nyare är dels för att mina servrar är till åren komna och inte stödjer något nyare, och dels gillar jag att ligga några versioner bakom för stabilitetens skull. Webbgränssnittet i ESXi 6.5 är så pass bra så det fungerar utan Flash eller nåt annat trams även i webbläsaren på en Mac eller i Linux vilket är uppskattat så jag har i praktiken ingen anledning att uppgradera till något nyare.

Det första man gör är att ladda ner programvaran för ESXi i form av klienten för NUT. Jag har lagt den på min server så du hittar den här. Som filnamnet antyder så är denna VIB, som insticksprogrammen för ESXi kallas, skriven för ESXi 5.0 men den fungerar utmärkt även med ESXi 6.5 med ett par förbehåll som jag återkommer till. Slå på SSH i din ESXi-server och sedan laddar du upp filen via SCP till /tmp. Packa upp med <br /> tar -xvzf NutClient-ESXi-2.1.0.tar.gz.

I paketet finns det ett script som installerar NUT-klienten, men det är saker du behöver göra innan du kör igång det.

Först och främst finns ett antal parametrar att mata in via esxcfg-advcfg-kommandot. Innan du gör det så måste du tala om för ESXi att du accepterar tredjepartsprogram med detta kommando:

esxcli software acceptance set --level=CommunitySupported

Därefter kan du sätta igång och skicka in följande kommandon:

esxcfg-advcfg -A NutUpsName -T string -E &#039;upsmon&#039; -F [email protected]
esxcfg-advcfg -A NutUser -T string -E &#039;upsmon@stor05&#039; -F upsmon
esxcfg-advcfg -A NutPassword -T string -E &#039;upsmon&#039; -F upsmon
esxcfg-advcfg -A NutFinalDelay -T int -E &#039;120&#039; -N 0 -M 120 -F 60000
esxcfg-advcfg -A NutMailTo -T string -E &#039;ange-mail-adress&#039; -F ange-mail-adress
esxcfg-advcfg -A NutSendMail -T int -E &#039;NUT send mail notification (1=yes 0=no)&#039; -N 0 -M 1 -F 0

Dessa kommandon kan du givetvis också mata in i scriptet som du ska köra nedan om du ska göra denna installation på flera servrar.

Därefter kör du installationsscriptet:

sh upsmon-install.sh

Om du som jag gillar att spara på el så kanske du inte har några hårddiskar i din ESXi-server utan kör den från ett USB-minne. Det kan, givetvis, diskuteras hur smart detta är med tanke på att USB-minnen knappast har en obegränsad livslängd vid återkommande skrivningar men om man som jag skickar alla loggar till en Syslog-server och i praktiken aldrig skriver på USB-stickan så håller det ganska länge. I mitt fall var det dock en av mina ESXi-servrar som gav följande felmeddelande:

[root@vh02:/tmp] sh upsmon-install.sh
Installation Result
   Message: WARNING: Only live system was updated, the change is not persistent.
   Reboot Required: false
   VIBs Installed: Margar_bootbank_upsmon_2.7.4-2.1.0
   VIBs Removed:
   VIBs Skipped:
   ```

Detta innebär i praktiken att det du "skrivit" till ditt USB-minne kommer vara borta vid nästa omstart. Dags att installera om med andra ord.

<img src="https://www.melin.org/assets/article_images/service.png" width="650px">

Om du däremot haft en lyckad installation av detta kommer tjänsten dels dyka upp som en tjänst i ESXi:s webbgränssnitt och dels, efter omstart, kan du också in och pilla på inställningarna för tjänsten under avancerade tjänster (System -> Advanced Settings) där du kan leta efter strängar som UserVars.Nut... så hittar du allt.

<img src="https://www.melin.org/assets/article_images/advanced.png" width="650px">

Vi är dock inte klara där.

<img src="https://www.melin.org/assets/article_images/nutserviceenable.png" width="650px">

Glöm inte att se till att NUT-tjänsten också startas när din ESXi-server startas.

Du behöver skapa filen <code>/etc/ups/upsmon.conf</code>.  Denna ska skapas vid installation av tjänsten men det sker inte, inte heller katalogen <code>/etc/ups</code> skapas.  Filen ser ut så här och skapas enklast med vi:

MONITOR [email protected] 1 upsmon upsmon slave

Syntaxen är alltså monitor upsnamn@upserver nummer på UPS (oftast 1), användarnamn, lösenord och att detta är en slav.

Om allt är som det ska kan du nu testa kommunikationen med UPS:en. Gå till katalogen <code>/opt/nut/bin</code> och kör <code>./upsc [email protected]</code>.

Fungerar allt kommer du få uppföljande:

[root@vh03:/opt/nut/bin] ./upsc [email protected]
battery.charge: 100
battery.charge.low: 10
battery.charge.warning: 50
battery.mfr.date: 2006/11/11
battery.runtime: 540
battery.runtime.low: 120
battery.temperature: 38.7
battery.type: PbAc
battery.voltage: 27.1
battery.voltage.nominal: 24.0
device.mfr: American Power Conversion
device.model: Smart-UPS 1000
device.serial: AS0646123225
device.type: ups
driver.name: usbhid-ups
driver.parameter.pollfreq: 30
driver.parameter.pollinterval: 2
driver.parameter.port: /dev/ugen1.3
driver.parameter.synchronous: no
driver.version: 2.7.4
driver.version.data: APC HID 0.96
driver.version.internal: 0.41
input.sensitivity: high
input.transfer.high: 253
input.transfer.low: 208
input.voltage: 236.1
output.current: 1.70
output.frequency: 50.0
output.voltage: 236.1
output.voltage.nominal: 230.0
ups.beeper.status: enabled
ups.delay.shutdown: 20
ups.delay.start: 30
ups.firmware: 652.13.I
ups.firmware.aux: 7.3
ups.load: 48.7
ups.mfr: American Power Conversion
ups.mfr.date: 2006/11/11
ups.model: Smart-UPS 1000
ups.productid: 0002
ups.serial: AS0646123225
ups.status: OL
ups.test.result: No test initiated
ups.timer.reboot: -1
ups.timer.shutdown: -1
ups.timer.start: -1
ups.vendorid: 051d

Har du kommit så här långt så har du nu en fungerade UPS-lösning för ESXi 6.5.  Glöm inte att faktiskt *testa* det hela också genom att helt sonika dra strömkabeln på UPS:en och kontrollera så allt stängs ner ordentligt.