Super question. It is actually possible to do this quite nicely - at least on some setups. I have tried the following recipe on a number of ESXi 5.5 hosts. Basically, the solution goes like this:
- Enable SSH access on your ESXi host
- Create a Linux VM - I use Ubuntu. You only need a very minimal setup - no GUI or anything.
- Connect your APC device via USB to the ESXi host and pass it through to the Linux VM.
- Make sure that the USB controller you add to the VM matches the actual, physical USB controller the APC device is connected to, i.e. only add an XHCI controller if the physical device is a USB3 device. Mismatches seem to cause odd problems in the Linux USB device driver.
- If things aren't working out and you see errors like
ctrl urb status -62
indmesg
, chances are the physical controller doesn't match the one in your VM. If they do match - well then it's a problem. I have one setup with this sort of problem and no real solution to it.
- Install
apcupsd
on the Linux VM - in Ubuntu, you can dosudo apt-get install apcupsd
to install the latest version. The NUT project is also nice but I am a traditionalist. - Install the plink utility by doing
sudo apt-get install putty-tools
- Connect to your ESXI host by doing
plink root@
. You can close the connection immediately. The objective is to get the host key saved so plink won't prompt for it again when we run it via a script - Edit
/etc/apcupsd/apcupsd.conf
and change the items below so they match:UPSNAME < the name you'd like your UPS to have >UPSCABLE usbUPSTYPE usb
Also make sure that/etc/default/apcupsd
hasISCONFIGURED=yes
- Edit
/etc/apcupsd/apccontrol
and scroll to thedoshutdown
case. Make it look like this:doshutdown) echo "UPS ${2} initiated Shutdown Sequence" | ${WALL} # Shut down indirectly by triggering the ESXi host to do the # shutdown via VMWare tools /usr/bin/plink root@< your ESXi host IP > -pw Cde32wsx "/sbin/shutdown.sh && /sbin/poweroff";;
- Restart apcupsd using
sudo service apcupsd restart
and see if things are working by invokingapcaccess
. If not, check logs and dmesg - Make sure all VMs that need to shut down nicely in case of a power failure have VMWare Tools installed. Also make sure that they are part of the VM startup/shutdown list (in the vSphere Web Client, go to:
vCenter -> -> Manage -> Settings -> VM Startup/Shutdown
). Make sure that the shutdown action is to shut down the guest OS.
Once you have these things running, the doshutdown
scriptlet from step 8 gets invoked on a power failure. This is turn invokes the shutdown.sh script on the ESXi host, which signals the VMWare Tools package in each VM on your host to do a clean shut down via the guest OS. In my experience, it works better than the PowerChute software from APC.
If you like to monitor things from your VMs, you can setup slave apcupsd instances on them that connect to the master UPS control Linux VM. Your slave apcupsd.conf files should have an entry like this:UPSTYPE net < your UPS control VM IP >:3551
Entries like UPSCABLE
and such do not matter in this case. This works with the Windows version of apcupsd
(available here) as well. You can use the included apctray.exe
to check out the current status of things.
That pretty much covers it, I think.