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,
On esxi 6.7 update 2 notification doesn’t work :
in syslog :
2019-05-03T17:02:10Z upsmon[2099497]: UPS UPS@172.31.31.250 on battery
2019-05-03T17:02:10Z upsmon[2099497]: Can’t fork to notify: Operation not permitted
2019-05-03T17:02:40Z upsmon[2099497]: UPS UPS@172.31.31.250 on line power
2019-05-03T17:02:40Z upsmon[2099497]: Can’t fork to notify: Operation not permitted
Thanks.
Thank you for reporting this. I will take a look
What is the upsmon VIB version you have installed ? I have just updated my test env to 6.7 update02 + patch ESXi670-201904001 and I don’t have this problem. The notify commands are executed and mail is sent.
I can’t speak for Ludo but I also see this error on
version: 6.7.0 Update 1 (Build 13004448)
Is there any debugging that may help?
upsmon: NutClient-ESXi-2.0.0
Also, thank you for your work.
It took me some time… The problem is related with the secpolicy in ESXi. The strange thing is that there is no problem if you install 6.7 and then upgrade to update 1 or 2. I finally reproduced the problem installing directly 6.7u2. I found the solution for the « can’t fork issue ». You can download the 2.0.1 version of the VIB and update your Nut client on ESXi. Tell me if it works now for you.
Ludo, try the brand new 2.0.1 version and let me know if it’s ok now
Hi René,
Wonderful, i will test that !
Ludovic.
Hi Rene,
would you mind turning SHUTDOWNCMD and NOTIFYCMD into esxi variables so we can adapt the scripts?
best regards
Christian
I’m working on another solution for « expert users » not using UserVars…
Hi René,
I have made full tests, and it is working without problem now on my fresh esxi 6.7u2 with new 2.0.1 version.
Thanks a lot !
Ludovic.
Today released 2.1.0 that fixes a compliance problem with Community Supported VIB (sources also available for download)
Salut Rêne,
I would like to change the upsmon.conf to trigger other scripts;
SHUTDOWNCMD « /scratch/call/my/sript.sh »
NOTIFYCMD « /opt/nut/etc/notify.sh »
but the files get reset every to
SHUTDOWNCMD « poweroff »
NOTIFYCMD « /opt/nut/etc/notify.sh »
time I boot. Is there a location where I can change it to press through boots?
The only way to change those settings in upsmon.conf is to edit upsmon.conf.template in the VIB file. You need to extract the files, do your changes, rebuild the VIB and reinstall the VIB. All changes made to upsmon.conf in ESXi are lost on next reboot since this file is created at boot time from the template.
merci pour ta response prompte.
I was wondering if it makes sense to combine your nut vib with this script https://github.com/sixdimensionalarray/esxidown as it seems to work wiithout vmware tools and also put the host into maintenance mode.
Well, in my opinion, there is no need to use this script. The auto start/shutdown configuration in ESXi host will do the trick on a simple poweroff call. Of cause, if you want a clean shutdown VMware tools have to be installed in each VM. Personally I prefer to suspend a VM when the embedded application allows it. I don’t see the interest to put the host in maintenance mode. A power failure is not really a maintenance operation. And, most important, when power comes back I want the ESXi to be able to power on my virtual servers automatically. If ESXi is booting in maintenance mode, VM can’t start.
You may want to edit the upsmon.conf.template yourself. Sources are now available for download.
Hi René,
First of all, thanks for all your effort – it’s been a lifesaver on our ESXi 6.5 server. As you mentioned in your response to Christian, we made changes in the upsmon.conf.template to call our own customised notification script. However, what we realised is that we needed a bit more flexibility, and the ability to reconfigure behaviour without having to rebuild the package and re-install it every time we made a change. We also wanted to be able to shutdown when the UPS went on battery rather than waiting for low battery (since we have more critical systems that need to run longer, and if we have a lot of VMs running it can take a long time to suspend them all).
So what we did was to modify the upsmon-install/remove/update scripts to include 5 additional UserVars:
NutXBootConfig – full pathname to a customised script or archive of scripts
NutXBootConfigSig – sha-256 digest of NutXBootConfig to verify NutXBootConfig
NutXShutdownOnBattery – 1 if you want a shutdown when the system goes on battery, 0 otherwise
NutXOnBatteryDelayTimer – if NutXShutdownOnBattery is set, number of seconds to wait when ONBATT is received before initiating shutdown (to account for transient events)
NutXShutdownGraceTimer – if NutXShutdownOnBattery is set, number of seconds to allow any cleanup to run (such as
suspend or shutdown VMs)
All that is needed is to then *carefully* edit /etc/rc.local.d/local.sh to check for and validate the extension (in our case a tar archive containing multiple commands, which local.sh installs) to make sure that changes are reapplied automatically after reboot. This way, we have a configuration that we can change very easily without needing to rebuild the package.
Mark
Oops…. see https://kb.vmware.com/s/article/2043564 for caveats
Regards,
Mark
Hi Rêne,
Thanks for your help to get my installation working.
Perhaps a naïve question, but how do I test that my VMs are being gracefully shutdown? I expected to be able to watch VmSphere, see the machines shutdown and then be disconnected. My impression is it disconnects and then (hopefully) powers each machine down.
Even after looking in the logs (vmkernel.log) I’m not sure things are behaving as they should do.
Any pointers as how to check this?
Thanks!
To be gracefully shutdown you will need your VM to configure the autostart section of your ESXi. Don’t rely on the default, configure each virtual machine to shutdown or suspend on power off. To use shutdown you will have to install the VMware tools in the VM. If you don’t install the VMware tools or if you don’t configure the autostart the VM will be stopped brutally. Personally I prefer the suspend solution as it does not need vmware tools but somme application don’t like this.
Regards
Thanks! Yes, I’ve configured each machine and installed the VMware tools. What I’m trying to test if whether it is working as predicted. In other words, while the settings seem to be right how can I make sure it is actually gracefully (versus brutally) shutting things down? Is there something in one of the Vmware logs for example that will help me confirm?
Best, James
While initiation an FSD, you should see every vm powering off while connected to VMware UI. And at the end the hypervisor will shutdown.
I followed all the steps, set FinalDelay to 20, then I unplugged the UPS. I waited 1 minute and nothing happens.
When I run cat /etc/ups/upsmon.conf,
no such directory or file
When I run upsc ups@10.0.1.22
-sh: upsc: not found
Configuration file is under /opt/nut/etc/upsmon.conf and you also need to specify full path to /opt/nut/bin/upsc
Don’t forget that the final delay starts when the client receives the low battery event and the shutdown script has ended. Maybe is you are on ups for only one minute the battery is not low enough to get this event.
Hi Rene,
I SSH into the ESXi and in that /opt/nut/bin/ folder, when I run upsc ups@192.168.2.243, it still shows: -sh: upsc: not fould…
Can you help me out? Thanks.
Come on, it’s a matter of path. Enter full path to invoke upcs command
Hi,
currently my UPS is connected to my NAS (NUT Master) and ESXi is configured as NUT slave. On the NAS I can just enter a fixed time, e.g. 5 minutes. So after 5 minutes the NAS does a shutdown. So the NUT master is away and ESXi will never get a « low battery » information and therefore does not do shutdown.
Is there a way to simply set a fixed shutdown time on ESXi as well?
e.g. NAS: 5min and ESXi 4min, something like that.
Or as an (better) alternative: when ESXi knows it runs on battery and losts connection to the master (because the master has shutdown) ESXi does immediately a shutdown too.
It seems that your NAS has a limited implementation of the NUT server that does not match the prerequesites for a NUT slave. Using a timer as a trigger for shutdown is not a good solution as the available time on battery may vary a lot depending on the real load of the UPS. Sorry but there is no timer feature on the ESXi NUT client. As an alternative you may want to download the sources and modify the client for configuration.
Hi Rene, thank you for a ESXi NUT client.
My question is, does it work on ESXi 6.7 Update 3?
Thanks.
Yes it does work on ESXi 6.7u3
Thank you for a quick answer, I hope you will have time for another one.
Do you allow questions like mine, about versions compatibility after every ESXi update, or we can update our hypervisors with no worries about stability of ESXi.
Thanks.
It should work on every 6.x versions unless VMware changes drastically the ESXi internal security fences.
Hello Rene,
I have adapted the source package to be able to configure a smtp host and port. I thought this was missing from the notify.sh script which one cannot edit once installed.
If you are interested in the 2.1.1 version I built, let me know.
For the rest: very useful package!
Arjen.
This is done voluntarily: the SMTP server has to be configured in the DNS MX record. Using something other than the default port is giving yourself work and risk. Source code is not only published to comply with GPL, you can make the changes you want and that’s great.
Hi,May I connect apc smart ups to esxi 6.7 update 3 by RS232 and work with nut client. let apc ups can safe shutdown esxi. thanks!
No, package only contains NUT client, not the UPS driver.
Hi,
sorry for the layman-qustion but when i try to install the vib on ESX 6.7.0 free i get « VIBs Skipped: Margar_bootbank_upsmon_2.7.4-2.1.0 ».
What could be the problem here?
Thank you in advance.
Regards,
Denny
what is the command used to install the vib ?
[root@hypervisor:/tmp] sh upsmon-install.sh
esxcli software vib install –no-sig-check -v /tmp/upsmon-2.7.4-2.1.0.i386.vib