Dans le but de pouvoir stopper proprement un hyperviseur VMware et ses machines virtuelles en cas d’alerte onduleur, voici une solution pour intégrer un client NUT (Network UPS Tools) natif à vSphere Hypervisor (ESXi 5.0, 5.1, 5.5, 6.0, 6.5, 6.7, 7.0, 8.0 testés). Le client NUT est installé dans l’hyperviseur et peut être contrôlé et paramétré depuis l’interface de configuration de ESXi ou depuis le vCenter s’il est géré.
Réflexion du 30/05/2024 : Broadcom a racheté VMware et a fait un grand ménage dans les formules commerciales. La plus impactante pour ce projet est l’arrêt des licences gratuites pour ESXi. Aujourd’hui les versions 7 et 8 sont celles qui continuaient d’être activement supportées par VMware. Aussi longtemps que je serai en mesure d’exécuter ESXi dans mon lab je continuerai de mettre à jour le client NUT pour ESXi.
Mise en garde 01/11/2023 : Sous ESXi 8.0 et à partir de la version 2.5.0 du client Nut, dans l’interface client HTML, vous ne verrez pas les descriptions associées aux UserVars du client NUT à jour tant que le host ESXi n’aura pas rebooté.
Mise à jour du 19/10/2022 : ESXi 8.0 est sorti ce 11/10/2022, seules les versions du module avec un numéro de version supérieur à 2.3.2 pourront s’installer sur cette nouvelle version de ESXi (abandon du support des binaires 32-bits et checksum SHA256 requis dans la signature du module).
Principe
La procédure consiste à installer dans l’hyperviseur les binaires et scripts nécessaires à la réception des alertes onduleur. Le schéma classique minimal des connexions entre les éléments d’un réseau électrique protégé par un onduleur est le suivant :
Cette solution n’est pas officiellement supportée par VMware et elle ne s’applique qu’à des hyperviseurs standalone. Elle ne peut pas convenir pour des fermes d’hyperviseurs en cluster de haute disponibilité sous le contrôle d’un vCenter. Seul le client NUT est ajouté à l’hyperviseur, l’onduleur doit être surveillé par un serveur NUT indépendant.
Caractéristiques et fonctionnalités
- La méthode d’installation utilise un fichier VIB (vSphere Installation Bundle). Il n’y a rien d’autre ce qui permet une installation rapide et sûre et une désinstallation propre en utilisant les standards de VMware.
- La compatibilité du module a été assurée pour qu’il fonctionne sur toutes les versions de ESXi entre 5.0 et 8.0. Cependant pour les versions 5.x l’installation automatique par déploiement de ViB n’est pas possible, il faut l’installer manuellement en suivant les instructions ci-dessous et passer outre les avertissements de sécurité. A partir de la version 6.0 de ESXi il n’y a plus ce soucis.
- C’est un client NUT 2.8.1 qui est inclus dans le paquetage. Il peut se connecter aux serveurs avec une version plus ancienne (disons 2.6.4 mais je n’ai pas testé les serveurs plus anciens).
- Actuellement seule la version pour processeur x86 est disponible. Il n’y a pas de version pour ESXi ARM (je n’ai ni le besoin ni la plateforme de test/développement pour ça).
- Le client (secondary dans la terminologie NUT) peut se connecter au serveur (primary) en privilégiant une connexion SSL/TLS si elle est disponible. Il ne sera pas fait de vérification de validité de certificat serveur et il n’y a pas de certificat client configurable.
- Le client peut envoyer un mail très succinct à une adresse configurable lors de la réception d’un évènement onduleur (perte du secteur, batterie faible, engagement de l’arrêt, retour du secteur). L’outil mail est très simple et il récupère les informations pour l’envoi des messages du DNS (enregistrements MX). Vous pouvez aussi utiliser un relais SMTP personnel.
- Le client peut se connecter à plusieurs serveurs NUT s’il y a plusieurs onduleurs (cas des serveurs avec une redondance d’alimentation). Il utilisera le même compte et le même mot de passe pour se connecter aux différents serveurs NUT. A vous de déclarer ce compte sur tous les serveurs NUT.
- Normalement il est possible de préciser le port TCP de connexion au serveur NUT sous la forme onduleur@serveur:port mais ESXi impose des règles de firewall pour le trafic sortant et seul le port 3493 est autorisé. C’est le port par défaut des serveurs NUT.
- Il est possible de demander l’arrêt du système ESXi après un laps de temps sur batterie configurable. Le client reste à l’écoute de l’évènement batterie faible et le système entamera sa procédure d’arrêt soit après le temps imparti soit sur évènement de batterie faible, au premier des deux qui surviendra quand le système est sur batterie. L’attente est interrompue si le courant secteur est rétabli entre temps, mais si la procédure d’arrêt a déjà été initiée, elle ira jusqu’à l’extinction du host ESXi.
- Le redémarrage du serveur après une coupure de courant est aussi une phase importante mais c’est à vous de le prévoir avec d’autres outils. Personnellement (mais ce n’est qu’une suggestion) j’aime bien l’idée d’un chef d’orchestre qui redémarre automatiquement. Il surveille le retour des services tels que le réseau, le serveur NUT etc… et il envoie des trames WOL pour réveiller les machines dans l’ordre désiré. Configurez votre serveur NUT pour qu’il ordonne à l’onduleur de couper effectivement le courant pendant un petit laps de temps même si le courant est revenu pendant la procédure d’arrêt. La plupart des onduleurs ont cette fonction avec les libellés « Interval to wait after shutdown with delay command » et « Interval to wait before (re)starting the load ». Certains onduleurs ont aussi une valeur « Minimum battery level for restart after power off » qui est interessante pour attendre que l’onduleur ait suffisamment rechargé ses batteries avant de faire redémarrer le système. Le risque est de se retourner dans une situation où un second arrêt propre serait impossible si une nouvelle coupure de secteur se produit juste après le redémarrage (ce qui est plutôt fréquent).
- Le client tourne avec le compte root. C’est habituellement déconseillé par la documentation du projet NUT mais l’hyperviseur a un nombre très limité de comptes locaux. Ce nombre de compte s’est beaucoup réduit au fil des versions. Des comptes restants, root est le seul encore utilisable.
Téléchargement du module
Pour toutes les versions de ESXi, l’installation peut se faire en ligne de commande sur l’hyperviseur : un fichier TAR compressé doit être déposé sur l’hyperviseur.
Téléchargez ici le fichier
Télécharger “NutClient-ESXi (binaires)” NutClient-ESXi-2.8.2-2.6.2.x86_64.tar.gz – 821,90 Ko
A partir de ESXi 6.0 vous pouvez utiliser le bundle offline pour une installation en ligne de commande en appelant la commande « esxcli software vib install -d » . Ou par le manager de mises à jour du vCenter si vous en avez un.
Téléchargez ici le bundle offline.
Télécharger “NutClient-ESXi (offline bundle)” NutClient-ESXi-2.8.2-2.6.2-offline_bundle.zip – 823,83 Ko
Vous pouvez créer votre propre package personnalisé à partir des sources. Elles sont distribuées sous licence GPLv3 (GNU Public License version 3). Utilisez un environnement de développement linux 64 bits tel que CentOS 7 avec les outils de compilation et développement C habituels. Un fichier INSTALL décrit la procédure. Les sources sont disponibles également dans un dépot git publique : NutClient-ESXi
Téléchargez ici les sources
Télécharger “NutClient-ESXi (sources)” NutClient-ESXi-2.8.2-2.6.2-src.tar.gz – 121,64 Ko
Installation
Activez l’accès ssh à votre host ESXi si ce n’est pas déjà fait. Cela est fait à partir de l’interface d’administration ESXi ou de la console DCUI. A partir de l’interface d’administration : dans la rubrique gérer de votre hôte, onglet services, dans la liste sélectionnez TSM-SSH et démarrez le service. Le service ssh sera actif jusqu’au prochain reboot de l’hyperviseur ou pendant un temps limité selon la version de votre ESXi.
Copiez le fichier NutClient-ESXi-2.8.2-2.6.2.x86_64.tar.gz dans le répertoire /tmp du host ESXi. Ici je vous donne l’exemple depuis une machine linux (remplacez 10.0.0.8 par l’adresse IP du host ESXi ou son nom FQDN). Depuis Windows vous pouvez utiliser l’outil gratuit WinSCP.
[root@linux ~]# scp NutClient-ESXi-2.8.2-2.6.2.x86_64.tar.gz root@10.0.0.8:/tmp The authenticity of host '10.0.0.8 (10.0.0.8)' can't be established. RSA key fingerprint is 89:49:ce:6d:... ...:40:76:7a:4a:fe. Are you sure you want to continue connecting (yes/no)? yes Warning: Permanently added '10.0.0.8' (RSA) to the list of known hosts. Password: (saisir le mot de passe administrateur ESXi) NutClient-ESXi-2.8.2-2.6.2.x86_64.tar.gz 100% 869KB 1.9MB/s 00:00
Passez votre hyperviseur au niveau d’acceptance Communauté si ce n’est pas déjà fait !
Connectez-vous root en ssh à l’hôte ESXi et tapez la suite de commandes suivantes pour installer le VIB (l’opération peu être longue si votre système est installé sur une clé USB lente) :
~ # cd /tmp /tmp # tar -xzf NutClient-ESXi-2.8.2-2.6.2.x86_64.tar.gz /tmp # sh upsmon-install.sh Installation Result Message: Operation finished successfully. Reboot Required: false VIBs Installed: Margar_bootbank_upsmon_2.8.2-2.6.2 VIBs Removed: VIBs Skipped:
Vous n’avez pas besoin de rebooter pour commencer à utiliser le client NUT sur votre système. Vous devez toutefois le configurer avant son premier lancement.
Vous pouvez supprimer les fichiers qui ont été créés dans /tmp et désactiver le service SSH
Configuration
A l’aide de l’interface d’administration du ESXi, rendez-vous dans la rubrique gérer de l’hôte. Sélectionnez les paramètres avancés de l’onglet Système et filtrez la liste sur UserVars.Nut, vous avez 8 variables à configurer :
- UserVars.NutUpsName : Nom de l’onduleur sur le serveur NUT (sous la forme nom_onduleur@nom_ou_ip_serveur). Plusieurs onduleurs peuvent être saisis séparés par un espace. Il n’y aura pas d’arrêt système tant que le dernier onduleur encore debout n’aura pas donné l’ordre d’arrêt.
- UserVars.NutUser : Nom du compte de connexion au serveur NUT
- UserVars.NutPassword : Mot de passe du compte de connexion au serveur NUT
- UserVars.NutFinalDelay : Secondes qu’il faudra attendre après la réception de l’événement batterie faible pour procéder à l’arrêt du système
- UserVars.NutOnBatteryDelay : Délai en secondes après le début du passage sur batterie de l’onduleur pour stopper le système. Si la valeur est 0 alors le client NUT attendra l’évènement batterie faible pour stopper le système. La valeur par défaut est 0, c’est le fonctionnement normal pour garder le système en fonctionnement le plus longtemps possible. Si l’onduleur repasse sur secteur avant la fin du délai, le système ne sera pas stoppé.
- UserVars.NutSendMail : A mettre à 1 pour que le client NUT envoie un e-mail à chaque évènement important de l’onduleur. La valeur 2 permet d’avoir dans le mail l’état des l’onduleurs lors de l’évènement.
- UsersVars.NutSmtpRelay : Nom ou IP d’un relai SMTP pour y faire transiter le mail. Laisser vide ou saisissez none pour ne pas utiliser de relai (none par défaut).
- UserVars.NutMailTo : Adresse e-mail à laquelle envoyer les évènements de l’onduleur
- UserVars.NutMinSupplies : Pour les systèmes multi onduleurs. Le nombre d’onduleurs qui doivent être en capacité d’alimenter le système avant d’entamer un arrêt. Ce nombre doit être inférieur ou égal au nombre d’onduleurs définis dans UserVars.NutUpsName. Si vous ne respectez pas cette contrainte, le client ne démarrera pas. Avec un seul onduleur, laissez la valeur à 1.
Notez qu’à chaque modification de ces paramètres il sera nécessaire de faire un arrêt/relance du service pour leur prise en compte.
Lancement du service
A l’aide de l’interface d’administration du ESXi, rendez-vous dans la rubrique gérer de l’hôte. Sélectionnez l’onglet Services, trouvez et sélectionnez le service NutClient dans la liste:
Dans les actions du service, choisissez la stratégie démarrage (Démarrer et arrêter avec l’hôte me semble un bon choix). Vous pouvez également le démarrer immédiatement ou l’arrêter.
Astuces
Utilisez la rubrique démarrage automatique de l’onglet Système de l’hôte ESXi pour décider de l’ordre de démarrage et d’arrêt (ou suspension) des machines virtuelles. Cet ordre sera respecté par la procédure d’arrêt sur alerte onduleur. Un bug de ESXi fait que les valeurs par défaut ne sont pas respectées. Vous devez configurer ces paramètre pour chaque VM au moins une fois (quitte à la dé-configurer ce qui la fera réellement suivre les règles par défaut).
Important : L’arrêt propre des OS dans les machines virtuelles n’est possible que si les vmware tools sont installées. Sinon l’arrêt sera brutal, préférez alors une suspension dans la configuration d’arrêt de la VM.
Là encore je rappelle que cette solution n’est pas adaptées aux fermes cluster avec haute disponibilité. Si HA est activé sur la machine hôte le mécanisme d’arrêt propre des VM n’est plus respecté et l’arrêt sera brutal pour toutes les VM.
UEFI secure boot
Si votre hôte ESXi est configuré pour booter en mode UEFI secure boot, l’installation du ViB restera compatible avec cette configuration. En revanche vous ne pouvez pas descendre le niveau d’acceptation à CommunitySupported quand secure boot est activé. Vous devrez :
- rebooter pour aller dans les paramètres UEFI de votre carte mère
- désactiver le secure boot dans les paramètres UEFI de votre carte-mère
- booter (sans secure boot)
- descendre le niveau d’acceptation à CommunitySupported
- Rebooter une seconde fois pour retourner dans les paramètres UEFI
- réactiver le secure boot
- booter (avec secure boot).
Vous aurez secure boot actif et le niveau d’acceptation minimal à CommunitySupported.
Désinstallation
Pour désinstaller le client NUT, utilisez le script upsmon-remove qui se trouve dans le fichier que vous avez téléchargé :
/tmp # sh upsmon-remove
Test
Pour estimer le temps nécessaire au serveur pour s’éteindre sur alerte onduleur tapez la commande « /opt/nut/sbin/upsmon -c fsd » sur le host ESXi (par ssh ou sur la console). La procédure d’arrêt est immédiatement lancée (ne faites pas ça si vous n’aviez pas prévu d’arrêter votre machine).
Many thanks, René!
As I can see the upsmon.conf file is (re)created each time NUT client service starts. And NUT client service builds upsmon.conf based on upsmon.conf.template. How can I change this file (upsmon.conf.template)? I tried (by SSH) chmod 666 and gained access rights to upsmon.conf.template (-rw-rw-rw-) but vi still says « Operation not permitted » (NUT client service was stopped).
Sorry, I’ve just found the author’s comment about VIB repack.
You are right, upsmon file is recreated each time the service starts. You can’t modify upsmon.conf.template an even if you can changes will be lost on each reboot because file is extracted from package on every boot. You need to extrac file from ViB, edit the file and repack the Vib file. There is a comment up there describing the procedure (in french)
Hi René thanks for your post just a little problem. My UPS ( APC smart 1500) is connected by USB cable to a synology NAS and it is working fine, so i have added 2 ips in the list of clients that can connect to NUT server.
I need my esxi server to stop when UPS goes on battery. For testing NAS environment i have installer Win NUT client on a vm and setting proper parameters i’m able to connect to nut server and see UPS status.
Now i’ve installed NUT client on my esxi 5.0 without any problem, service is running but i’m not able to connect using upsc ups@NAS_IP. the strange is that esxi IP is listed in the client list and also another win nut istallation ( even listed in clients list) doesn’t connect ti nut server, in windows nut client i do not use any user/passwd to connect to nut server so what should i verify ? Thanks.
You may be using default user/password for the nut server. Try to apply these values to esxi nut client and restart the service.
hi thanks form response. i’m still working on this, in NUT server
upsmon.conf contains
MONITOR ups@localhost 1 monuser secret master
on nut client windows i have no username/passwd declaration but it stil works ( maybe because this windows server is the domain controller and NAs authent is this windows domain ?)
on esxi nut client upsmon.conf
MONITOR ups@192.168.167.56 1 monuser secret slave
in nut server host.deny i have
upsd: ALL EXCEPT 127.0.0.1 192.168.167.1 192.168.167.2 192.168.167.55 192.168.167.56
where
192.168.167.2 is the first windows nut client thet is able to connect
192.168.167.1 is the second windows nut client that is not able to connect
192.168.167.55 is esxi server
192.168.167.56 is Synology NAS (nut server)
From esxi
/etc/ups # upsc ups@192.168.167.56
Error: Connection failure: Connection timed out
Thanks
Are you able to ping NAS from esxi ? If no, check network settings (netmask) or NAS firewall configuration.
Hi, yes i can ping one from another
Renè i’ve found something strange, i’m trying to connect from esxi to nas using ssh ( just to verify) and also this connection was timed-out so i tried ssh to another sshd server ( our database server) and also in this test the connection was timedout so looking at firewall rules i saw outgoing conection on port 22 are closed and opening them i’m able to connect on port 22 with other server. Do i need to create a firewall rule for connection using NUT port (3493) ? and how can i do this ? Thanks
You don’t need to open outgoing tcp ports for nut client in esxi. Package installation procedure does it for you
Renè this is the problem; following a post on how to enable port on esxi firewall (http://kb.vmware.com/selfservice/microsites/search.do?language=en_US&cmd=displayKC&externalId=2008226) i went to /etc/vmware/firewall and i saw that in service.xml file there are no rules about 3493 port and 25 ( for emailing) while there is a file called upsmon.xml for those port as somethings went wrong during install. Should i insert upsmon.xml into service.xml taking care of to be in thecorrent sequence ? Thanks
Hi, nothing modified, just an « esxcli network firewall refresh » and now i see rules on firewall settings and upsc ups@…. is now working… so i thinks this is the last step. I’ll do a test tomorrow and if i well understand NUT client will receive UPS status and alert so that with the same setting on NUT server ( 5 minutes) it will stop esxi.
Isn’t it ?
First when NUT server switches to battery it will notify all clients. Then when battery runtime goes low it will send to all clients a battery low event and NUT client on ESXi will start a clean shutdown. Don’t forget to set on ESXi preferences what should be done on each VM on host shutdown (standby, OS shutdown or power off, I use standby because it’s clean and faster than OS shutdown and my applications can handle that).
Thanks for you idea Rene, but about esxi (not for each VM) where should i set the shutdown oparation ? I mean in which file on NUT configuration have i to set « shutdown » after receiving « on battery » status ?
Thanks
You have nothing to configure on NUT client. This is the normal behavior to shutdown on « battery low » event.
Thanks Rene! But i have a problem, nut client service don’t start with esxi 5.1 after reboot. vSphere/configuration/security profile/properties/nut client/options, i selected « start and stop with host », but after poweroff/reboot again « start and stop manually ».
Tout d’abord merci pour le portage!
Même problème sur un ESXi 5.1. /var/log/syslog.log contient le message: « NUT: NUT client is not running ». Le service démarre normalement et fonctionne correctement lorsque lancé à partir de vSphere Client
Philippe
I know that there is a display bug in vSphere client. You need to do a refresh in properties before opening nut client service window. You may try and tell me.
Indeed just a display issue, thanks for super quick reply. Works like a charm!
Thanks Rene, again! Really just a bug!
Bonjour René, j’aimerais savoir s’il est possible d’avoir les paramètres que tu as appliqué au client NUT exemple le délais avant avant que la procédure d’arrêt soit lancé lors d’une coupure etc. ?
Les autres paramètres qui sont en dur dans le fichier de configuration sont les suivants :
POLLFREQ 5
POLLFREQALERT 5
HOSTSYNC 15
DEADTIME 15
RBWARNTIME 43200
NOCOMMWARNTIME 300
FINALDELAY 5
The default SHUTDOWNCMD is « poweroff » but it does not gracefully shutdown the guest vm. Should you try « shutdown.sh » instead?
The upsmon.conf is not adjustable as it is preset as in the VIB…
I don’t agree. The poweroff command does shut down gracefully all VM if you configured them to shutdown or to suspend in the global startup/shutdown VM configuration.
I believe it is a bug or somewhat mis-behaviour in ESXi 5.0
When you « poweroff », the system initiate the VM power off sequence as well as the subsystem shutdown sequence. Usually the host will ultimately power down before the VM power off sequence gracefully complete.
It is not relay to the « Shutdown Delay sec » in VM configuration.
You may be talking about default VM behaviour on ESXi host shutdown. Don’t rely on it ! You must set a VM in auto startup/shutdown and then set it back to default if you want this VM to follow the default behavior. If not it will be powered off immediately . It looks like a bug, it’s in ESXi as far as I know (since ESXi 3.5)
René, first of all, thank you for porting NUT to ESXi. I have one question: could you make esxi-shutdown more configurable by adding one variable for esxi shutdown-delay (I think it is « -d » switch)?
Reason is following: I can not shutdown VMs from ESXi, because I do not have vmtools installed (it requires modular linux kernel, which imho is kind of « opened door »). So I’d like to install upsmon in slave-mode in all VMs and let themselves shut down, before esxi-host shuts down (at that time, with no VM running, not even the one with upsmon/master running). That is the reason I need shutdown-delay for ESXi: to wait ~30 seconds before all VMs do their own shut-down procedure…
I think this is a possible feature to add. Probably in next release in a few weeks
Merci pour ce travail si utile pour bon nombre d’entre nous. Tout roule plutôt bien sur un ESXi 5.1 et 5.1 U1.
Bien moins fastidieux que d’autres solutions…
Seul point que je trouve gênant, mais surement paramétrable, c’est que souvent la VM qui fait serveur NUT lance son propre shutdown avant les clients et du coup, ils attendent le finaldelay ou je ne sais plus quoi.. et du coup ça coupe relativement tard.
Autre point, je n’ai pas encore pigé comment régler justement les valeurs de charge max ou runtime max pour lancer le shutdown, RTFM à mon avis est une réponse adéquate… 🙂
Quand le serveur donne l’ordre à ses clients d’effectuer un shutdown c’est du chacun pour soit pour la suite. Pour moi le finaldelay est une pause à faire avant d’entamer la procédure d’arrêt. Sur le serveur nut ça a du sens surtout s’il ordonne à l’onduleur de couper l’alimentation. Sur un client on peut le laisser à une valeur minimale.
Pour le seuil de déclenchement de l’arrêt pour ma part je le paramètre directement sur l’onduleur. J’ai pris une marge de 7 minutes d’autonomie car l’arrêt propre de tous les systèmes alimentes peut durer 5 minutes. La suite NUT complète contient un utilitaire qui permet de connaître les paramètres de l’onduleur et de les changer pour certains mais cela dépend du modèle d’onduleur. Sinon avec un serveur Apache il y a des CGI de NUT qui permetent de visualiser et modifier ces paramètres par une interface web.
René, thank you for all the time you’ve taken to develop this. It is awesome. I have been dragging my feet for a year putting something in place due to either the cost or complexity of other options for a Linux neophyte.
My power died in my home lab yesterday and didn’t come back up before the batteries were exhausted. All the vm’s went down hard because I had no clean shutdowns. So, I went looking for a solution again and resolved to spend the days needed to learn everything I had to in order to get a clean shutdown routine in place.
Thankfully, I ran across your solution buried in a user forum somewhere and in a couple hours I’m up and running.
THANK YOU!
Mise en ligne du client NUT pour ESXi version 1.2.0 :
– Date conforme a la RFC-2822 dans les mails envoyés
– Paramètre FinalDelay configurable
Thank you very much!