以下是一个大概思路.若有更好的建议,欢迎留言或私信.
原理
交换机未接ups,停电的时候,交换机关机,esxi的网卡是down掉的
ESXI开启ssh,写一个检测脚本,定期检测网卡状态,如果网卡down掉(检测3次,间隔10s,结果全部为down),可以判断为市电停了,执行关机操作.
esxi相关命令(esxi 5/6)
vim-cmd vmsvc/getallvms #获取虚拟机列表
vim-cmd vmsvc/power.getstate vm_id #获取虚拟机状态
vim-cmd vmsvc/power.off vm_id #关闭虚拟机
poweroff #关闭物理机
esxi相关Tips
- esxi开启ssh功能
- 硬盘路径:/vmfs/volumes
- esxi的数据放在数据盘上,否则重启丢失
- 解决时区的问题:linux找一个localtime文件,复制到esxi的/etc下
- esxi添加开机启动路径/etc/rc.local.d/local.sh,创建定时任务
脚本
/etc/rc.local.d/local.sh
/bin/cp /vmfs/volumes/datastone3/Scripts/localtime /etc/
/bin/touch /vmfs/volumes/datastone3/Scripts/rc_check
/bin/chmod +w /var/spool/cron/crontabs/root
/bin/kill $(cat /var/run/crond.pid)
/bin/echo '*/5 * * * * /vmfs/volumes/datastone3/Scripts/check_nic.sh' >> /var/spool/cron/crontabs/root
/bin/crond
exit 0
/vmfs/volumes/datastone3/Scripts/check_nic.sh
#!/bin/sh
nic_stat=`esxcfg-nics -l | grep vmnic0 | awk '{print $4}'`
date=`date +'%Y/%m/%d %H:%M:%S'`
ok='test ok'
bad='test bad'
BASE_DIR=`pwd`
log=$BASE_DIR/log/check.log
if [ -f "rc_check" ];then #启动时延迟十分钟检测
sleep 600
rm -f rc_check
fi
if [ "$nic_stat" == "Down" ];then
sleep 1
echo "$date : $bad">>$log
if [ "$nic_stat" == "Down" ];then
sleep 1
echo "$date : $bad">>$log
if [ "$nic_stat" == "Down" ];then
echo "$date : $bad">>$log
fi
fi
else
echo "$date : $ok">>$log
fi