ESXi crontab(基于网络接口监控的UPS供电自动关机方案/nic-monitor.sh)

Posted catoop

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ESXi crontab(基于网络接口监控的UPS供电自动关机方案/nic-monitor.sh)相关的知识,希望对你有一定的参考价值。

在ESXi主机中,并不支持直接像普通 Linux 那样直接配置 cron 计划任务。
ESXi 本质上是有 cron 定时需求的,只不过它的配置存放路径在 /var/spool/cron/crontabs/root,我们可以通过直接在这个文件中添加我们的脚本来实现自定义定时任务脚本。

比如以持续监测网口状态,实现一个基于UPS供电自动关机的方案:

场景说明:
1、路由器连接市电(停电就会挂的意思)
2、服务器连接UPS(停电后持续供电,不会立刻挂掉)
3、路由器一根网线和服务器 vmnic0 网口连接(停电后因为路由器挂掉了,所以这个网口状态也就Down了)

方案流程图

#!/bin/bash

WORK_DIR=$(cd $(dirname $0); pwd)
vmnic0DownFile=$WORK_DIR/vmnic0-down
LOG_FILE=$WORK_DIR/nic_monitor.log
# 只记录最后一次检测Up的时间
LOG_FILE_LASTUP=$WORK_DIR/nic_monitor_lastUp.log

# 关机阀值时间(秒),因为定时任务的执行周期为1分钟执行一次,所以最大关机误差为(阀值+59)秒
TIME_MAX_SECONDS=300

# 获取相应网卡状态
nic_stat=`esxcfg-nics -l | grep vmnic0 | awk '{print $4}'`

# 判断网络接口状态
if [[ "$nic_stat" == "Down" ]]; then
    # 再判断文件是否存在
    if [ ! -f "$vmnic0DownFile" ]; then  # 文件不存在,创建文件并写入当前时间戳(秒)
        echo "$(date) 首次检测到网络接口状态为Down" >> $LOG_FILE
        echo `date +%s` > $vmnic0DownFile
    else # 文件存在
        echo "$(date) 再次检测到网络接口状态为Down" >> $LOG_FILE
        # 读取文件内容(时间戳),和当前时间对比
        TIME_BEFORE=`cat $vmnic0DownFile`
        TIME_NOW=`date +%s`
        TIME_DIFF=$(($TIME_NOW-$TIME_BEFORE))
        if [ $TIME_DIFF -ge $TIME_MAX_SECONDS ]; then # 断开状态超过阀值
            echo "$(date) Down状态持续时间超过阀值$TIME_DIFF秒,触发关机" >> $LOG_FILE
            # 删除vmnic0-down
            rm -rf ${WORK_DIR}/vmnic0-down
            # 关闭机器
            poweroff
        fi
    fi    
else # 状态为Up
    echo "$(date) 检测到当前网络接口状态为Up" > $LOG_FILE_LASTUP
    # 删除vmnic0-down
    if [ -f "$vmnic0DownFile" ]; then
        echo "$(date) 状态从Down变为Up" >> $LOG_FILE
        rm -rf ${WORK_DIR}/vmnic0-down
    fi
fi

将脚本保存到你的数据目录中,因为你如果放到 ESXi 系统相关目录中,当你重启后文件就会被还原掉(丢失),只有数据盘文件不会被还原。放在数据盘中也利于我们管理(推荐)。

使用 SSH 登录 ESXi ,在 /etc/rc.local.d/local.sh 中的 exit 0 之前添加以下命令:

/bin/kill $(cat /var/run/crond.pid)
/bin/echo "*/1   *    *   *   *  /bin/sh /vmfs/volumes/616789c4-9876543-6a6d-842be956782f22/esxi-shell/nic-monitor/nic-monitor.sh" >> /var/spool/cron/crontabs/root
/usr/lib/vmware/busybox/bin/busybox crond

保存退出 /etc/rc.local.d/local.sh 文件之后需要执行一次 /sbin/auto-backup.sh 脚本,local.sh 文件才会正真地保存成功,否则立刻重启后可能还会丢失(auto-backup.sh 默认一分钟会自动执行一次,为了保险我们手工执行一下没坏处)。

之所以在 local.sh 中添加配置是为了在开机后自动执行,主要还是因为 ESXi 重启后会还原相关配置(如果你手工直接修改 /var/spool/cron/crontabs/root 在重启后就没了)。

自动开机方案,详见博文《CentOS、OpenWrt 批量网络唤醒持续至开机正常》


(END)

以上是关于ESXi crontab(基于网络接口监控的UPS供电自动关机方案/nic-monitor.sh)的主要内容,如果未能解决你的问题,请参考以下文章

Zabbix 3.0 添加监控 esxi 主机

vmware api开发之快照管理

什么是机房环境监控

VMWARE 之 分布式网络交换机

vmware api开发之克隆虚拟机

Zabbix 监控ESXi服务器非虚拟机CPU内存硬盘网络带宽