前言
这篇文章主要讲解 VMware ESXi 下安装 NUT 客户端实现断电自动关机,同样的,NUT 在 ESXi 下也提供了现成的软件包,我们只需要安装并配置好就行了,我这里采用的 ESXi 版本是 VMware ESXi 6.7.0 Update 3,其他版本应该也是通用的。
注意:UPS是连接群晖,开启 网络UPS服务器功能。

准备工作
ESXi 默认是关闭主机 SSH 功能的,但是我们后续会使用到,所以我们首先要去 WEB 后台开启,进入 WEB 后台,打开 管理后,切换到 服务 选项卡,最后找到列表中的 TSM 和 TSM-SSH 服务将其启动,这样 SSH 功能就临时可以用了。

另外需要修改 ESXi 的默认软件安装策略,否则会阻止软件的安装,进入 WEB 后台后,打开 管理,切换到 安全和用户 选项卡,点击左侧的 接受级别 会弹出软件接受级别的设置,我们将其修改为 社区。

接着,我们下载 ESXi 平台下的 NUT 客户端软件包(下载地址:NutClient-ESXi-2.1.0.tar.gz )注:新版本会一直更新根据最新为准。,将下载好的软件包上传到 ESXi 的 /tmp 目录待安装使用。
下载地址:http://rene.margar.fr/download/1483/
软件下载地址:http://rene.margar.fr/download/1483/NutClient-ESXi-2.1.0.tar.gz

安装 NUT 客户端
通过 SSH 连接到 ESXi 主机,然后进入到 /tmp 目录后,解压缩 NUT 软件包,最后执行安装脚本 upsmon-install.sh,返回如下的安装信息代表安装成功了。

$ cd /tmp
$ tar -xzvf NutClient-ESXi-2.1.0.tar.gz
$ sh upsmon-install.sh
Installation Result
   Message: Operation finished successfully.
   Reboot Required: false
   VIBs Installed: Margar_bootbank_upsmon_2.7.4-2.1.0
   VIBs Removed:
   VIBs Skipped:

配置 NUT 客户端
NUT 客户端安装成功后,我们返回到 ESXi 的 WEB 后台,打开 管理后,切换到 系统 选项卡,在 高级设置 菜单的右边列表中找到 NUT 相关的设置项,可以直接在右上角的搜索中输入 NUT 进行快速查找,一共有6个参数设置,如果没有,可以尝试重启 ESXi 主机后再看,如下图所示:

各参数作用说明:

UserVars.NutFinalDelay:关闭 ESXi 前的等待时间,单位为秒。
UserVars.NutMailTo:接收邮件通知的邮箱地址,如果没有开启邮件通知,这里不用设置。
UserVars.NutPassword:密码,如果没有在群晖上修改过,这里统一填:secret
UserVars.NutSendMail:关机前是否发送邮件通知(0:不发送,1:发送)
UserVars.NutUpsName:监听的网络 UPS 服务器,例子:ups@192.168.99.10(这里填写你们自己群晖地址)
UserVars.NutUser:用户名,如果没有在群晖上修改过,这里统一填:monuser

参数配置完成后,需要重新启动 NutClient 服务,进入 WEB 后台,打开 管理后,切换到 服务 选项卡,找到 NutClient 服务,然后点击上方的 重新启动 按钮,以后每次修改配置参数后,都需要重启该服务,另外需将该服务设置为 随主机启动和停止。

到这里,我们的 ESXi 服务器已经可以实现断电自动关机了,但是 ESXi 平台上的虚拟机并不会安全的关闭,我们还需要在 ESXi 上设置虚拟机在主机关闭前自动关机,在主机启动后自动开机,前提条件是虚拟机已经安装好了 VMware Tools,设置方法:进入 WEB 后台,打开 管理后,切换到 系统 选项卡,打开左侧的 自动启动 菜单,然后点击最上方的 编辑设置,按下图设置:

上面的设置只是系统一个总的自动启动停止开关,我们还需要对每台虚拟机进行启用设置,依次点击列表里的虚拟机进行 启用。

注意:
上述执行完后可以通过ssh命令读取是否可以取到相关ups的数值:/opt/nut/bin/upsc ups@192.168.2.88
都完成后建议重启esxi
最后验证防火墙设置,执行 esxcli network firewall ruleset list,如果看到 NutServer 为 ture
则表示正常,最后在 ESXi 的服务里面设置 Network UPS Tools client 服务随系统启动即可!
注:计算时间当UPS进入供电状态及开始倒计时关机
注意:NUT是当UPS低于设定低电量的时候才会发送报警信息,然后ESXI进行关机操作。
battery.charge.low: 20,电量低于20才进行报警信息.这样会导致设备长时间一直在使用UPS的电量

我现在的操作方式是将群晖设置为1分钟后进入安全模式(ESXI的 UserVars.NutFinalDelay 设定为默认的5秒),然后勾选上(当系统进入安全模式时将不断电系统关机),实际测试可以在充足的时间将ESXI关机并且UPS断电。(将ESXI 虚拟机 的关机延迟时间尽量设置成最短的时间 建议(3-20内)数据无关紧要的设置1-2秒即可

当以上按我的设置好后,实现原理如下:
当群晖延迟2分钟后进入安全模式后会发送低电量即将关机信息,这中间会有1分30秒(时间一到群晖会发送命令给UPS直接断电)左右的时间给ESXI关机。所以我在ESXI设置的延迟时间是5秒。让ESXI的系统可以有足够的时间关机。如果时间不足的情况下会导致ESXI未关机UPS就已经断电了。(全程3分30秒左右所有设备关闭并且断电。来电后群晖自动开机)

参考:(具体还是要根据设备来灵活调整)


需要接入homeassistant可以参考以下链接:
https://bbs.hassbian.com/thread-9894-1-1.html
其他参考
https://www.mobibrw.com/2019/18598