您的位置:首页 > 其它

Exsi主机判断UPS状态自动进行关机的讨论

2018-02-08 11:59 281 查看
小公司很少有能力购买大型的UPS,但是绝大多数的小品牌UPS,都只有自己的监控程序,一般都是运行在xp系统上的,很少有能直接支持exsi的,这就有个问题,如何才能让exsi主机在断电的时候自动的进行判断,然后按照设定的顺序依次关闭虚拟机然后自己关机以保护硬盘数据,这就成了一个问题
解决思路
1. 在exsi上运行一个xp虚拟机,然后将ups的usb连接至exsi主机,并映射此usb设备至这台xp虚拟机
2. 在这台xp虚拟机上安装ups自带的监控软件,并设置如果市电断电超过2分钟,这台虚拟机就自动关机
3. 在exsi上运营一个脚本,每隔3分钟就ping一次这个xp虚拟机,如果发现失败了,就说明这个虚拟机关机了,说明市电断电,那么开始依次的执行其他虚拟机的关闭命令,并且关闭此Exsi主机

实际操作流程(参考)
1. 在Exsi上安装xp虚拟机(最小配置即可)和UPS监控程序,这里跳过,每个人购买的UPS品牌不同,按照说明书设置即可。
2. 用vSphere登录Exsi主机,打开SSH功能



打开之后,用PuTTY登录, (可以在很多地方找到下载)
使用root账户登录



登录之后,会用到下面的命令
ls   //这个是列出当前目录下的文件
cd 目录名   //进入某一个目录
现在就利用上面两个命令,进入磁盘目录
cd vmfs/volumes
进入这个目录之后,后面的每个人应该就不一样了,这个时候需要使用 ls 命令



我这个机器,可以看到下面这些内容,其中这个比较亮的字,就是存储,再次使用cd命令进入这个目录



可以看到进入之后,目录显示的是上面那个字符串,这个不用管他,进来了就行。然后再次使用 ls 命令,看看这个目录下面都有啥



可以看到,这个存储下面,是我们在这台Exsi主机上运行的一些虚拟机,(忽略其他的几个,关注ups目录)
这个“ups”目录是我们目前需要建立的,我这个是因为已经弄好了,所以会有这个目录,一般情况下是没有的。
使用  “mkdir ups” 这个命令来建立一个ups文件夹,然后用  cd ups 进入此文件夹



进入之后,我们需要建立3个文件,我分别说明一下他们三个都是什么
apc.sh   //这个是一个可以执行的脚本,作用是判断xp虚拟机是否可以ping通,如果不行,就按照这个脚本里面的内容执行exsi的关机操作
ups.log  //这个是日志文件,记录apc.sh这个脚本的执行的情况,方便日后查看到底是什么时间断电的
ups_shouhu.sh  //这是一个守护,目的是判断apc.sh是否在运行,如果没有,就执行它
在建立这些文件之前,我们需要先获取一些信息,需要知道当前主机都运行了哪些虚拟机,以及他们的编号都是多少
vim-cmd vmsvc/getallvms //列出当前主机所有的虚拟机



看到类似于上面这个结果,这里面是你当前所有这个主机上的虚拟机,前面的Vmid就是他们的编号,记下来这个编号,后面会用到

好了,下面开始依次建立这三个文件
在exsi下建立文件,需要用到 vi 这个命令(这是个linux下的文本编辑器,不展开说了,想要详细了解的话自己去百度即可,这里仅仅介绍用得到的功能)
用vi建立文件,命令是下面这个
vi apc.sh
输入上面这个之后,就会启动一个vi编辑器,这个时候千万别蒙,因为从现在开始,你的键盘的反馈和之前是完全不一样了,所以别随便按任何键。
我下面这个文件已经编辑完了,看上去有内容,如果是第一次建立这个文件,实际上应该是空的,会在屏幕一侧看到全是那个“~”符号



这个时候你需要首先按键盘上的“Insert”按键一次,注意看这里,现在是“-”,当你按了“Insert”他就变成“I”了。当变成“I”的时候,意思就是可以开始编辑了。这个时候鼠标是不管用的,需要完全使用键盘的上下左右来操作



拷贝下面的这段代码,到记事本,然后需要根据你自己的实际情况进行一些编辑,我尽量在每一行代码下面都做了详细的说明, 在exsi的shell脚本中, #后面的就是注释,所以下面的代码中,所有#开头的,就是注释了。
#!/bin/sh
while
ping -c 1 192.168.0.4 > /dev/null #这个ip地址是你运行xp的那台虚拟机的ip地址,需要改成你自己的
[ $? -eq 0 ];
# $? 是最后一个命令执行状态的返回标记,0代表成功,1代表失败,这一行的作用是判断上面的ping命令是否成功执行了
do

echo ' AC Power OK ! ' >> /vmfs/volumes/datastore1/ups/ups.log;date >> /vmfs/volumes/datastore1/ups/ups.log
#意思是向后面这个文件中写入一句log,并且记录当前时间,echo 的意思是向指定的io输出一系列的字符等,
#上面这行代码里面的datastore1是我的机器路径,需要改成你自己的,后面所有的路径都同理

sleep 180 #暂停180秒,这个数字是可以根据自己的实际修改

done
#上面这一段的作用是每隔180秒,就ping一次xp虚拟机的ip如果成功了,那么就向log里面写入一条记录然后一直循环下去
#如果上面这一段执行失败了,也就是说ping命令没有成功执行,那么就停止循环,开始执行下面的代码

echo ' AC Power maybe off, checking again after 1 minutes ! ' >> /vmfs/volumes/datastore1/ups/ups.log;date >> /vmfs/volumes/datastore1/ups/ups.log
#向log文件中写入这次异常并记录时间

sleep 60
#等待60秒,可以根据你自己的需要修改

ping -c 1 192.168.0.4 > /dev/null
#ping那个运行xp的虚拟机

if [ $? -eq 0 ]
#判断上面这个ping语句是否执行成功了,如果成功了则执行then后面这句代码并结束此脚本
#如果上面这次ping失败了,那就说明在前面那个循环失败之后60秒再次尝试,又失败了,说明应该是关机了开始执行else后面的代码
then
echo ' Checkagain, AC Power OK ! ' >> /vmfs/volumes/datastore1/ups/ups.log;date >> /vmfs/volumes/datastore1/ups/ups.log
#
else

echo ' AC Power is already off, shut down Esxi Now! ' >> /vmfs/volumes/datastore1/ups/ups.log;date >> /vmfs/volumes/datastore1/ups/ups.log
#向log文件中写入,市电已经断掉了,现在开始执行关机

vim-cmd vmsvc/power.shutdown 12
#这是一个关键的命令,这个exsi用来关闭虚拟机的命令行,后面的数字,就是刚刚我们前面说的Vmid
#也就是说,想要关闭哪台虚拟机,就写哪个数字

Sleep 300
#暂停300秒,主要是关闭虚拟机需要时间,所以在这里要停一停等一下再关闭exsi主机,可以根据你的经验和UPS的容量自行调整时间

/bin/shutdown.sh #关闭exsi主机
halt
fi #是和上面的if对应的,语法需要,不用在意
将上面这些代码,拷贝到记事本,根据自己的实际需求进行编辑修改之后,再拷贝,然后到刚刚的PuTTY窗口,那个窗口现在应该是vi编辑器,这个时候在窗口中按鼠标的右键,就应该直接将代码黏贴上了。黏贴之后,应该是类似于下面这样的



这个时候需要保存这个文件,首先按一下esc, 然后按一下“:”这个时候光标会跑到最下面,等待你输入,输入“w”然后回车,是保存这个文件, 然后再按“:”输入“q”回车,退出vi编辑器



这个时候你再用“ls”命令,应该可以看到一个apc.sh文件,但是你的这个文件可能和我的不太一样,不是绿色的,因为他现在还不是可执行文件,没有权限,需要用下面的这个命令来给它一个执行权限,
chmod 777 apc.sh
执行完上面的命令之后,再用“ls”命令看,应该就是绿色的了。
然后用相同的方法,建立ups.log文件,只不过这是一个空文件,不容写内容
下面一步是建立一个守护,来判断apc.sh是否正在执行中,如果没有执行,就执行它。
NUM=`ps -c | grep apc.sh | grep -v grep |wc -l`
echo ${NUM}
#
if [ "${NUM}" -lt "1" ];then
/vmfs/volumes/datastore1/ups/apc.sh &
echo ' UPS shouhu start' >> /vmfs/volumes/datastore1/ups/ups.log;date >> /vmfs/volumes/datastore1/ups/ups.log
fi
exit 0

同样的原理,将这段代码中, 路径的 “datastore1”换成你自己的路径,其他不用变
下面我们建立一个计划任务,每3分钟执行这个守护程序一次,这个时候需要用到exsi下面的计划任务程序,叫“cron”(别问这是啥,如果你不知道没关系,只要按照下面的步骤做就可以了,这个就是一个类似于win的计划任务的东西)
首先用下面的命令打开这个计划任务的列表文件
vi /var/spool/cron/crontabs/root
这个时候vi编辑器就打开了一个文件



你看到的和我看到的应该差不多,但是没有最下面这一行,用上面说的编辑方法,将这一行内容添加进去,注意“datastore1”要改成你自己的路径,然后保存、退出
这个时候已经完成了99%了,唯一的问题是,当exsi重启之后,它会重置这个计划任务,这个文件里面的内容又擦除掉了,所以我们需要让它每次启动的时候,都将这句话自动的写在这个文件里面,下面介绍
首先用下面的命令进入 ect目录
cd /etc
因为rc.local 是只读文件,现要修改一下权限
chmod 777 rc.local
然后用vi编辑器打开rc.local文件
vi rc.local在打开的文件的最下面加上下面三行代码(将datastore1路径改为你自己的)
/bin/kill $(cat /var/run/crond.pid)
/bin/echo '*/3 * * * * /vmfs/volumes/datastore1/ups/ups_shouhu.sh' > /var/spool/cron/crontabs/root
/bin/busybox crond

然后保存退出
验证一下 apc.sh是否在执行。使用下面这行,如果结果是“1”,就说明正在运行中
ps -c | grep apc.sh | grep -v grep |wc -l
看看日志文件是否正常记录了。(先要进入到ups.log所在的目录,方法看前面)
cat ups.log

希望这个对大家有帮助,网上看了很多文章都没有留联系方式,有些问题想要问问作者也不知道找谁,我留个联系方式吧,有问题可以给我发邮件 nizongdai@gmail.com 我看到的话尽量解答。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: