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).
Hi,
Is there a way to test if the client is seeing the master correctlty? I want to to a plug test, but want to verify if all communication is working first.
Thank you for your hard work on this.
First you can check in the system log file for error messages. Just grep upsmon in /var/log/syslog.log in ESXi shell. If everything is OK you should get :
2020-07-27T08:05:43Z upsmon[36384643]: Startup successful
2020-07-27T08:05:43Z upsmon[36384643]: Warning: running as one big root process by request (upsmon -p)
If you have wrong parameters or network settings you will have error messages :
2020-07-27T08:05:43Z upsmon[36384643]: UPS [myups@mywrongserver]: connect failed: No such host
2020-07-27T08:05:43Z upsmon[36384643]: Communications with UPS myups@mywrongserver lost
2020-07-27T08:05:48Z upsmon[36384643]: UPS [myups@mywrongserver]: connect failed: No such host
2020-07-27T08:05:53Z upsmon[36384643]: UPS [myups@mywrongserver]: connect failed: No such host
...
Then you can check thet the client is able to read the server : on ESXi shell execute /opt/nut/bin/upsc upsname@upsserver (replace this last by your config names). This should give you the attributes of your UPS.
I was able to see the UPS data, and did a plug test and all went smoothly. Windows events show clean shutdown.
One more question. Is there a way to configure the client to shut down on a ‘OB’ event instead of a ‘OB + LB’ event?
I have multiple ESXi hosts, and want to do a staggered shutdown to keep critical infrastructure on the longest, while shutting down the non-critical infra first.
Thanks Again!
I don’t understand why so many people are asking me to shutdown when UPS goes ont battery. If you have a 1 second power cut it will shutdown everything even is the battery has been able to hide the power loss. Your UPS will also enter ONBATT if the input voltage is out of a configurable range, this is not a power loss. Here is what I already wrote in a previous comment :
You need to understand how NUT works. First, on power loss, the NUT server will send to NUT clients (ESXi) a ONBATT event to tell that the power is now from the UPS battery. Then, at a configurable % value of remaining time or battery charge, the NUT server will send a LOWBATT event to clients. This is to inform the clients it is time to start a SHUTDOWN. The threshold level to send the LOWBATT event depends on the UPS. Some can be configured using the upsrw tool on the NUT server. On your uspc output command you can see this value named battery.runtime.low (if UPS calculates the remaining runtime depending on the charge, mostly high-end UPSes) or battery.charge.low (if UPS only know about the battery charge and you have to estimate the remaining runtime before complete power loss).
If power is back before the reaching this low level. The server will send the ONLINE event and no shutdown will be started. Command upsrw on server is part of NUT project, you should consider reading the NUT documentation.
I thought my description was pretty clear.
Thanks again for your time.
For the staging shutdown of several ESXi, this is not doable with the current VIB NUT client as each ESXi is not aware of the others. Maybe possible with multiple NUT server configurations but this is a NUT project question and I can’t answer for them.
Great info, Rene
What would happen if everything is shutdown (after LoBat) and the power comes back on ? You said ONLINE is send out but what if everything is already shutdown?
In this particuliar case where, no luck, the power comes up again after sending the LOWBATT event, the shutdown has already started. The rule is to continue shutdown for all the NUT clients and also for the NUT server. At the end, just before the NUT server goes off, it has to send the POWERKILL message to the UPS to tell that everything has been shut down. The UPS should then electrically stop powering all the machines connected to it and then bring the power on again after a configurable delay (a real power cycle). There are 2 parameters usually for that: ups.delay.shutdown which gives how many seconds to wait to power off the UPS output sockets when the server sends the powerkill event. And ups.delay.start, the minimum time to wait in seconds to bring the power back. Some UPSes have even a parameter to prevent to restart if the battery is too low and servers will be unable to boot and shutdown properly in case of a second power disaster (batery.charge.restart is minimum % battery level on APC). Then, when the power is back the hosts should be configured to auto start in their BIOS configuration.
Any chance there is a download link that still works for this? Would love to use it again but don’t have the files anymore.
Look for the big blue buttons in the article
Both of them just redirect to https://rene.margar.fr/ without downloading any files.
That’s very strange I just saw the redirect and had someone else test who also saw the redirect. However now it appears to be working fine. Thanks!
Bonjour René,
Tout d’abord merci beaucoup pour ce super boulot 🙂
J’ai le même problème que Bedard, impossible de télécharger le fichier 🙁 Retour direct sur la page d’accueil du blog.
Avez vous essayé de vider le cache du navigateur puis recharger la page ?
Hi, your download-link seems to be broken. I just get forwarded to http://rene.margar.fr when clicking on one of the blue boxes…
I would appear that you need to remove the trailing slash in the download links to get them to work. That’s what did it for me. Thanks!
the download link is dynamically generated. I would need to modify third party code in php to fix this
for those who had download problems, I pasted the url in the browser and I downloaded the file. the url is: https://rene.margar.fr/download/1483/
regards
Hello, the download link is not working to the NUT Client.
Regards, Janne.
What is your internet browser? I have made tests with safari and firefox and I cannot reproduce this problem.
I installed everything on the latest vSphere 7 environment and all went smoothly but at the end on the ESXi command line I just cannot execute the « upsc » command because it is missing. It’s just giving me the following output:
« -sh: upsc: not found »
I was looking inside « /opt/nut/sbin » but there is only the « upsmon » command. Did something change about the « upsc » command? Where is the location of « upsc » supposed to be on ESXi’s file system?
The upsc command is in /opt/nut/bin, you can use the full path to execute it. The vmware standard for additional packages does not allow to install binaries in /usr/bin
Thanks, that worked. Another question: I mentioned I can configure an E-Mail notification by UserVars. But where can I configure the according SMTP server settings? Or does it take a default SMTP server to send mails? If yes, which one?
It will use the MX server associated to the destination domain as declared in DNS records.
Sorry, I don’t get it. Somewhere I have to put my user credentials for SMTP server setting so the ESXi will be able to send mails.
There is no SMTP credentials. The SMTP client embedded in the ViB is not that smart. It’s a very simple and straightforward tool called smtpblast. It will assume that the destination SMTP server can be accessed and will allow mail delivery to mailbox with no credential.
OK, got it now. So just for testing I tried to execute the smtpblast as described here:
https://www.linuxcertif.com/man/1/smtpblast/
Like this in my case:
./smtpblast -r « mySMTPServer.myDomain.com » -p « 2500 » -f « » -t « foo@bar.com »
but the connection times out everytime. Firewall on SMTP server side and on ESXi side is temporarly disabled for troubleshooting purposes.
The SMTP server is working as I am using it for a lot of other SMTP clients.
Don’t know what is wrong. Am I missing something?
This will not work as only default port 25 is used by the ViB. It does not expect to connect to an SMTP relay. You may not be able to use this feature.
Just wanted to say thank you for putting this together and maintaining it. Just got this working on my solitary 6.7 (free – no real license) box. Using a Raspberry PI as the « server » to monitor the UPS. Those of us running « free » ESXi in homelabs etc. are very limited of course by what is supported via API etc. (not much of course without $$$).
So nice to finally have ESXi shut itself down cleanly.
Bonjour René,
Cela fait plus de trois ans que j’utilise votre méthode pour gérer l’extinction de mon esxi depuis mon nas synology. Et cela fonctionne bien, je vous en remercie.
Toutefois j’ai quelques questions à vous poser :
– j’utilise une version assez ancienne du client nut esxi et je voulais savoir si la mise à jour du client nécessitait une procédure particulière.
– mon serveur nut est mon nas synology. L’inconvénient c’est qu’il doit être dans le même endroit que mon esxi pour gérer l’onduleur. Quel autre serveur nut puis-je utiliser et est-il possible de virtualiser ce serveur nut pour qu’il soit sur l’esxi à gérer.
– enfin est-ce que votre méthode se limite à une connexion usb ou rs232
ou bien les onduleurs avec carte réseau sont aussi gérables ainsi ?
Merci pour votre retour
Bonnes fêtes de fin d’année
Taxi
La procédure de mise à jour est décrite dans le fichier readme.txt inclus. Le paramètres seront préservés. Un exemple de petit serveur NUT est d’utiliser un raspberry pi. J’en utilise et c’est très économique. Virtualiser le serveur Nut oblige à une certaine gymnastique au niveau configuration. C’est possible mais je ne le recommande pas. Le type de liaison (rs232, usb, …) n’est limité que par la capacité du serveur Nut. Le client s’en moque.