Настройка UPS в VMWare ESXi через Ubuntu-сервер

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

Решение этой задачи делится на несколько этапов.

Установка 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.

 

Обратите внимание! Для того, что бы пробросить по 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".  

  В появившемся списке найдем SSH и, если он не запущен (в колонке «Daemon» прописано не «Running»), то для его конфигурирования нажмем кнопку «Options».

  

Установим режим запуска сервиса SSH на ESXi и включим его кнопкой Start:

  

   При критическом значении параметров бесперебойника нам будет нужно на сервере 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/ мы увидим статистику состояния источника бесперебойного питания.

  

    Перейдя по ссылке System можно увидеть подробный статус нашего устройства.