Check HDD SMART ESXi host from linux guest script bash

ByDmitriy Altuhov

Check HDD SMART ESXi host from linux guest script bash

Гипервизор (сервер виртуальных машин) VMware ESXi установлен на несерверном оборудовании с обычными жесткими дисками (без RAID в режиме AHCI).

Также имеется Linux-машина (Ubuntu server).

Требуется максимально просто мониторить состояние жестких дисков (SMART) на хосте VMware ESXi.
Для это нам потребуется добавить нижеприведённый скрипт (с исправлением нужных переменных) в планировщик cron.

На ESXi host должен быть включен SSH
С Linux-машины должен быть настроен беспарольный доступ по SSH на ESXi хост.
Об этом писал тут: http://it74.net/techblog/vyklyuchaem-vmware-esxi-host-iz-gostevoj-ubuntu/

#!/bin/bash

#admin email
adminemail=root

#set this to the count of disk in your ESXi host
devicescount=2

#set this to ssh ESXi source
#datasource="cat smtest"
datasource="ssh root@10.0.0.4 /usr/lib/vmware/vm-support/bin/smartinfo.sh"

#minimal and maximal HDD temps
hddtempmin=25
hddtempmax=35

#hostname
hostname=esxi1

#Magick begins
deviceindex=0

while read data; do

data_device="^Device:[[:space:]]+(.*)$"
if [[ $data =~ $data_device ]]; then
((deviceindex++))
device[$deviceindex]=${BASH_REMATCH[1]}
fi

data_health="^Health Status[[:space:]]+([[:alnum:]]+)[[:space:]]"
if [[ $data =~ $data_health ]]; then
health[$deviceindex]=${BASH_REMATCH[1]}
if [ "${health[$deviceindex]}" != 'OK' ]; then
message="$message Health status on drive ${device[$deviceindex]} is NOT OK \n"
fi
fi

data_realoc="^Reallocated Sector Count[[:space:]]+([[:digit:]]+)[[:space:]]"
if [[ $data =~ $data_realoc ]]; then
realoc[$deviceindex]=${BASH_REMATCH[1]}
if [[ "${realoc[$deviceindex]}" -lt "100" ]]; then
message="$message Reallocated Sector Count on drive ${device[$deviceindex]} = ${realoc[$deviceindex]} is less than 100 \n"
fi
fi
data_ponhours="^Power-on Hours[[:space:]]+([[:digit:]]+)[[:space:]]"
if [[ $data =~ $data_ponhours ]]; then
ponhours[$deviceindex]=${BASH_REMATCH[1]}
if [[ "${ponhours[$deviceindex]}" -lt "30" ]]; then
message="$message Power-on Hours on drive ${device[$deviceindex]} = ${ponhours[$deviceindex]} is less than 30 \n"
fi
fi

data_temper="^Drive Temperature[[:space:]]+([[:digit:]]+)[[:space:]]"
if [[ $data =~ $data_temper ]]; then
temper[$deviceindex]=${BASH_REMATCH[1]}
if [[ "${temper[$deviceindex]}" -lt "$hddtempmin" ]] || [[ "${temper[$deviceindex]}" -gt "$hddtempmax" ]]; then
message="$message TEMP on drive ${device[$deviceindex]} = ${temper[$deviceindex]} is OUT OF RANGE $hddtempmin and $hddtempmax \n"
fi
fi

done < <($datasource)

#Overall checks
if [ "$deviceindex" -ne $devicescount ]; then
message="$message MISSING HDD DRIVE! Devicescount = $devicescount and devices reported by smart = $deviceindex \n"
fi

#send mail to admin
if [ -n "$message" ]; then
#echo -e $message
echo -e $message | mail -s "ESXi host $hostname" $adminemail
#exit 1
#else
#exit 0
fi

About the author

Dmitriy Altuhov administrator