Как корректно завершить работу ESXi при отключении электричества?
На работе была поставлена следующая задача: при отключении электричества все серверы должны корректно завершить свою работу и отключиться. Все серверы подключены к бесперебойнику APC Smart-UPS XL Modular 3000VA, который позволяет мониторить своё состояние через SNMP-подключение:
И для серверов, работающих на типовых операционных системах Windows/Linux/FreeBSD, решением является замечательная программа Apcupsd. В настройках подключения к ИБП надо прописать строчки:
UPSTYPE snmp
DEVICE 10.100.xx.xx:161:APC:public
Ну и указать параметры BATTERYLEVEL и MINUTES под себя.
И всё становится хорошо: серверы мониторят UPS по SNMP, и когда заряд батареи подходит к концу, программа Apcupsd инициирует корректное завершение работы ОС. Вот только проблема в том, что есть серверы ESXi, на которые Apcupsd не установить. А их тоже как-то надо выключать. Решение довольно простое. Для начала надо включить SSH-доступ на ESXi-сервере:
А дальше требуется найти какой-нибудь линуксовый сервер, на котором стоит Apcupsd и который будет выключаться параллельно с сервером ESXi. В моём случае это машина с Debian. На этой машине устанавливаю пакет plink:
apt install putty-tools
plink (PuTTY Link) является консольной заменой приложения PuTTY и входит в состав его дистрибутива. Теперь пробую через него подключиться по SSH к серверу ESXi:
plink root@10.100.xx.xx
Можно немедленно закрыть соединение. Цель состоит в том, чтобы сохранить ключ хоста, чтобы plink не запрашивал его снова, когда он будет запускаться через скрипт.
Теперь надо отредактировать файл /etc/apcupsd/apccontrol. В нём надо найти секцию doshutdown и добавить одну строчку. Это должно выглядеть так (выделил зелёным добавленное):
doshutdown)
echo "UPS ${2} initiated Shutdown Sequence" | ${WALL}
# сначала завершить работу сервера ESXi
/usr/bin/plink -batch root@10.100.xx.xx -pw <пароль рута от ESXi> "/sbin/poweroff"
/bin/sleep 5
${SHUTDOWN} -h now "apcupsd UPS ${2} initiated shutdown"
;;
Всё. Теперь сервер с Debian, увидев, что заряд батареи в ИБП низкий, сначала подключится по SSH к серверу ESXi и отправит ему команду завершения работы, затем уже сам завершит работу.
Что же касается завершения работы виртуальных машин, работающих на ESXi, то они тоже мониторят бесперебойник по SNMP, и здесь просто надо правильно настроить время завершения работы, чтобы сначала выключились виртуальные машины, а уже после них завершали работу «железные» серверы. Ну например, чтоб на виртуалках были параметры: BATTERYLEVEL 12 и MINUTES 10, а на «железных» серверах были параметры BATTERYLEVEL 10 и MINUTES 8.
Донаты принимаются на кошельки:
Yoomoney:
4100118091867315
BTC:
bc1qzw9vam8mv6derwscxl0vrnd6m9t2rpjg273mna
ETH / BNB BSC / Polygon MATIC:
0x5cc07FF76490350ac6112fbFdA1B545Bc794602F
Tron:
TJUz8sJr9XYMjVqzmFNnCzzRWfPa57X2RV
USDT/USDC в сетях ETH/BSC/Polygon:
0x5cc07FF76490350ac6112fbFdA1B545Bc794602F
USDT в сети TRX (Tron):
TJUz8sJr9XYMjVqzmFNnCzzRWfPa57X2RV
LTC:
LRMZaFCSyCT6FUF62WEX1BokWV7v2dh2zo
Doge:
DTEnGLZRps9XaWNtAhchJWSeD4uTNDRxg7
XMR:
4A6uP1WxEc7HktToZFyiJuK6YmjdL8bSn2aY653qPwABhT4Y56iFuedgHcmpvLwWE55u8qkjGc715ZJs761FqedA8gkgznr
TON:
UQAdSPiWIDx2Q1VIeezkUV3s4sNlZM90w2ohSO6bD2-okwgY