Настройка работы VMWare ESXi с источником бесперебойного питания (UPS)

Есть сервер виртуализации с VMWare ESXi, работающий через источник бесперебойного питания APC Smart-UPS SC1500. Так же есть задача научить этот сервер корректно выключаться (и не менее корректно выключать все виртуалки) при отключении электричества. При этом на сервере есть виртуалка с установленным Ubuntu Server 12.04. Так, как непосредственно ESXi нельзя научить работать с упсом, то именно эта виртуалка и будет заниматься мониторингом UPS.
Решение этой задачи делится на несколько этапов.

1. Установка VMWare tools на Ubuntu Server
Если этого не сделать, то корректного выключения виртуалки средствами ESXi просто не получится. Без VMWare tools выключение будет сродни вырубанию питания. И так, ставим VMWare tools.
Переходим в меню «Virtual Machine» — «Install VMware Tools» (или «VM» — «Install VMware Tools»).
Создаем каталог для монтирования образа:
sudo mkdir /mnt/cdrom

Монтируем образ:
sudo mount /dev/cdrom /mnt/cdrom

Распаковываем пакет во временный каталог
tar xzvf /mnt/cdrom/VMwareTools-x.x.x-xxxx.tar.gz -C /tmp/

Переходим туда
cd /tmp/vmware-tools-distrib/

И устанавливаем VMWare tools
sudo ./vmware-install.pl -d

Далее нужно перезагрузить наш сервер.
Если есть еще какие-то виртуальные сервера, то устанавливаем VMWare tools на все.

2. Установка и настройка apcupsd
Для мониторинга UPS чаще всего используется NUT, но так как у нас бесперебойник APC, то воспользуемся утилитой apcupsd, которая значительно проще в настройке. Для начала ее установим:
# apt-get install apache2 apcupsd apcupsd-cgi

Без apache2 и apcupsd-cgi в принципе можно обойтись. Непосредственно для работы они не нужны. Но вот посмотреть состояние UPS через веб-интерфейс приятно, да и быстрее, чем логиниться в консоль сервера и смотреть там. По этому ставим все три пакета.
Теперь нужно соединить UPS кабелем с сервером VMWare ESXi и пробросить USB-устройство на виртуалку с Ubuntu.
01.png
Обратите внимание! Для того, что бы пробросить по USB UPS на виртуальный сервер, обязательно в устройствах виртуалки должен быть установлен USB контроллер. Если его нет, но вначале необходимо его добавить, а потом перезагрузить виртуалку.
После этого, в списке USB-устройств должен появиться наш UPS. Так, как APC Smart-UPS SC1500 для соединения использует кабель типа serial-to-usb, то у нас устройство будет отображаться следующим образом:
yakim@server:~$ lsusb
Bus 002 Device 004: ID 067b:2303 Prolific Technology, Inc. PL2303 Serial Port


После присоединения кабеля в системе должно появиться нужное устройство с именем ttyUSBxxx. У меня это оказалось /dev/ttyUSB0. У вас, естественно, имя может оказаться немного другим. Именно его и будем использовать при настройке apcupsd.
Переходим к настройке apcupsd. Для этого в файле /etc/apcupsd/apcupsd.conf прописываем:
UPSNAME Server-UPS # Тут даем произвольное имя нашему беспередойнику
UPSCABLE smart
UPSTYPE apcsmart
DEVICE /dev/ttyUSB0 #Имя устройства соединения с UPSCABLE


Параметры выключения системы в этом файле настраиваем по собственному усмотрению.
У меня это:
BATTERYLEVEL 15
MINUTES 25


Остальные настройки можно оставить по умолчанию.
Проверить доступность UPS можно командой:
$ apcaccess

Если настройки apcupsd правильные, то на выходе мы должны увидеть параметры
состояния UPS:
APC : 001,049,1240
DATE : 2013-11-01 13:56:52 +0200
HOSTNAME : backup
VERSION : 3.14.10 (13 September 2011) debian
UPSNAME : Server-UPS
CABLE : Custom Cable Smart
DRIVER : APC Smart UPS (any)
UPSMODE : Stand Alone
STARTTIME: 2013-10-30 12:45:49 +0200
MODEL : Smart-UPS SC1500
STATUS : ONLINE
LINEV : 232.0 Volts


И так далее...
Будет выведено несколько страниц параметров состояния UPS'а

3. Настройка соединения с ESXi Server
На сервере ESXi нужно обязательно включить доступ по SSH, если вы этого не сделали ранее.
Для этого в консоли управления (vSphere Client) перейдем на вкладку "Configuration".
Далее выберем пункт "Security Profile" и нажмем "Properties".
02.png
В появившемся списке найдем SSH и, если он не запущен (в колонке «Daemon» прописано не «Running»), то для его конфигурирования нажмем кнопку «Options».
03.png
Установим режим запуска сервиса SSH на ESXi и включим его кнопкой Start:
04.png
При критическом значении параметров бесперебойника нам будет нужно на сервере ESXi выполнить команду выключения как виртуалок, так и самого сервера. Делать это мы будем по SSH. Так, как все действия будут выполняться в фоновом режиме, то парольная авторизация нас не устраивает. Нужно сделать авторизацию по ключу. Для этого на сервере Ubuntu Генерируем ключ авторизации:
Заходим на свою машину с правами root:
$sudo su

Вводим свой пароль.
Генерируем RSA ключи:
#ssh-keygen -t rsa

Отвечаем на вопросы:
1. Enter file in which to save the key (/root/.ssh/id_rsa): — соглашаемся на значение по умолчанию.
2. Enter passphrase (empty for no passphrase): — Оставляем значение пустым. Паролем пользоваться не будем.
3. Enter same passphrase again: — Снова оставляем значение пустым.

Скрипт создал 2 ключа: приватный и публичный.
Your identification has been saved in /root/.ssh/id_rsa. — секретный приватный ключ для декодирования.
Your public key has been saved in /root/.ssh/id_rsa.pub. — публичный ключ для кодирования.

Будьте внимательны! Ключи нужно генерировать именно для пользователя root, так как именно с правами этого пользователя и работает демон apcupsd.
Сейчас нужно скопировать на ESXi сервер наш публичный ключ:
#ssh-copy-id -i ~/.ssh/id_rsa.pub root@server_ESXi

Обратите внимание! Даже после этого зайти на сервер ESXi без пароля мы не можем. Это связано с тем, что в настройках ssh на ESXi прописан параметр :
AuthorizedKeysFile /etc/ssh/keys-%u/authorized_keys

То есть ключи авторизации хранятся не в домашнем каталоге пользователя, а в специфическом, который прописан в настройках.
Для того, что бы авторизация по ключу все-таки заработала залогинимся на ESXi
$ ssh root@server_ESXi

И скопируем файл с ключами на нужное место
~ # cp /.ssh/authorized_keys /etc/ssh/keys-root/authorized_keys

После этого мы сможем заходить без пароля с сервера Ubuntu на сервер ESXi.
В корне файловой системы сервера виртуализации (хотя это можно сделать и в любом другом каталоге) создадим скрипт выключения всех виртуальных серверов и самого сервера ESXi:
~ # vi ups_down.sh

И запишем в него:
#!/bin/sh
# Получаем ID всех виртуалок
VMID=$(/usr/bin/vim-cmd vmsvc/getallvms | grep ^[0-9] | awk '{print $1}')
# Просматриваем все виртуалки в цикле
for i in $VMID
do
# Получаем их состояние (turned on, off, whatever)
STATE=$(/usr/bin/vim-cmd vmsvc/power.getstate $i | tail -1 | awk '{print $2}')
# Если виртуалка запущена - выключить
if [ $STATE == on ]
then
/usr/bin/vim-cmd vmsvc/power.shutdown $i
fi
done
#Делаем паузу в ожидании, пока виртуалки погаснут
sleep 180
# Теперь выключаем и сам сервер виртуализации.
/sbin/shutdown.sh
/sbin/poweroff

После этого не забываем сделать скрипт исполняемым:
~ # chmod +x ups_down.sh

4. Окончательная настройка apcupsd
Остался последний шаг. Заставить apcupsd выполнить скрипт ups_down.sh на сервере ESXi.
Для этого открываем файл /etc/apcupsd/apccontrol, ищем в нем:
doshutdown)
echo "UPS ${2} initiated Shutdown Sequence" | ${WALL}
${SHUTDOWN} -h now "apcupsd UPS ${2} initiated shutdown"


И в этом блоке заменяем строку
${SHUTDOWN} -h now "apcupsd UPS ${2} initiated shutdown"

на
/usr/bin/ssh root@server_ESXi /ups_down.sh

На этом основная настройка закончена. При пропадании питания корректно выключится как сам сервер виртуализации, так и все виртуальные сервера.

5. Настройка веб-интерфейса состояния
По умолчанию веб-интерфейс apcupsd доступен по ссылке:
http://Ubuntu-server/cgi-bin/apcupsd/multimon.cgi

Пользоваться такой ссылкой не очень удобно. По этому подредактируем файл /var/www/index.html и приведем его к следующему виду:
<meta http-equiv="refresh" content="0;url=http://Ubuntu-server/cgi-bin/apcupsd/multimon.cgi">
<html><body><h1 APC UPS Statistic /h1>
</body></html>


Здесь мы сделали всего-навсего переадресацию на адрес веб-интерфейса apcupsd.
Теперь при заходе на http://Ubuntu-server/ мы увидим статистику состояния источника бесперебойного питания.
05.png
Перейдя по ссылке System можно увидеть подробный статус нашего устройства.
06.png

Возврат к списку