Pull to refresh

Источник бесперебойного питания и ESXi 5.5

Не так давно столкнулся с такой проблемой: очень мало материала на тему того как «подружить» источник бесперебойного питания и сервер виртуализации на базе ESXi.

Исходные данные


  • Источник бесперебойного питания Makelsan Power Pack 3kVA (далее ИБП)
  • SNMP карта HDL801
  • Сервер на платформе SuperMicro с установленным ESXi 5.5

Задача


При отключении питания в сети 220в ИБП посылает сингал на сервер виртуализации. Сервер его принимает, завершает работу виртуальных машин (в моем случае порядок выключения не имеет значения) и далее сам завершает работу.

Решение


Описывать процесс по установке ИБП в стойку, установку SNMP карты и прочие мелочи не буду. Перейду к сути.

Первое, что было сделано, это развернута еще одна виртуальная машина. На ней Ubuntu Server 15.10. Обновляем, устанавливаем VMWare tools (обязательно):

Устанавливаем Linux Header командой:

sudo apt-get update && sudo apt-get install build-essential linux-headers-$(uname -r)

Подключаем диск с VMWareTools и распаковываем:

sudo mount /dev/cdrom /mnt
sudo tar xvfz /mnt/VMwareTools-*.tar.gz -C /tmp/

Запускаем установку, после которой нужно перезагрузить виртуальную машину:

sudo perl /tmp/vmware-tools-distrib/vmware-install.pl

После этого нам потребуется установка apcupsd:

sudo apt-get install apcupsd

Делаем настройку конфига /etc/apcupsd/apcupsd.conf. Для нас важны параметры:

  • UPSCABLE: ставим smart
  • UPSTYPE: ставим snmp, ибо именно по этому протоколу мы будем получать данные
  • DEVICE: пишем xxx.xxx.xxx.xxx:161:RFC:private, тут остановлюсь немного. Первое- ip- адрес, второе- стандартный порт, тут все понятно.

    В третьем блоке есть выбор между APC (если ваш ибп соответствующего бренда), RFC (RFC1628, используется для некоторых не APC ИБП, наш случай), MGE (MGE ИБП- для ИБП этой фирмы). Четвертый блок указывает режим коммуникации (private означает чтение/запись, public — только чтение, autodetect — автоопределение).
  • BATTERYLEVEL и MINUTES — указываем на свое усмотрение, в зависимости от ваших ресурсов (минимальный уровень батареи и время в минутах, соответственно).

На этом настройка конфига завершена. Для проверки вводим:

apcaccess

В выводе будут сведения об вашем ИБП:

примерно так
APC : 001,018,0453
DATE : 2016-05-05 17:52:35 +0300
HOSTNAME : ibpcontroller
VERSION : 3.14.12 (29 March 2014) debian
UPSNAME : ibpcontroller
CABLE : Ethernet Link
DRIVER : SNMP UPS Driver
UPSMODE : Stand Alone
STARTTIME: 2016-05-05 16:42:51 +0300
STATUS :
MBATTCHG : 15 Percent
MINTIMEL : 15 Minutes
MAXTIME : 0 Seconds
NUMXFERS : 0
TONBATT : 0 Seconds
CUMONBATT: 0 Seconds
XOFFBATT : N/A
STATFLAG : 0x05000000
END APC : 2016-05-05 17:52:39 +0300
и т.д...


На этом моменте мы имеем «подруженный» ИБП с виртуальной машиной. Далее нам требуется наладить взаимодействие виртуальний машины с физической. Для начала надо сделать авторизацию. Для этого я выбрал авторизацию по сертификату. Подразумевается что на физическом хосте у вас доступ по SSH уже включен.

Итак, для начала проваливаеимся в рута:

sudo su

Генерим сертификаты:

ssh-keygen -t rsa

На все вопросы можно соглашаться и в результате мы получим два файла:

/root/.ssh/id_rsa — приватный ключ
/root/.ssh/id_rsa.pub — публичный

Теперь нам надо скопировать ключи на наш физический сервер и скопировать их в папку где ESXi хранит все ключи (он их хранит не в домашнем каталоге):

sudo ssh-copy-id -i ~/.ssh/id_rsa.pub root@server_address
ssh root@server_address
sudo cp /.ssh/authorized_keys /etc/ssh/keys-root/authorized_keys

После этих манипуляций виртуальная машина под рутом может заходить на физический сервер без авторизации. Для проверки введите:

sudo ssh root@server_address

Последним этапом у нас будет скрипт который, собственно будет выключать виртуальные машины. Для тех кто плохо разбиратеся поясню как он работает: смотрит список виртуальных машин, проверяет их статус, если виртуальная машина включена он шлет команду для завершения ее работы. Обращу внимание, что на всех машинах должен стоять VMWare tools, иначе вместо завершения работы произойдет резкое отключение машины. Чем это черевато пояснять не буду.

Итак, сам скрипт запишем в файлик gasim_mashini.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 gasim_mashini.sh

И последний штрих: настраиваем чтоб виртуальная машина в случае завершения работы от сигнала с ИБП запучкала наш скрипт на физическом сервере. Для этого чуть подправим конфиг на виртуальной машине /etc/apcupsd/apccontrol.

Меняем строки:

echo "UPS ${2} initiated Shutdown Sequence" | ${WALL}
${SHUTDOWN} -h now "apcupsd UPS ${2} initiated shutdown"

На

echo "UPS ${2} initiated Shutdown Sequence" | ${WALL}
/usr/bin/ssh root@server_address/gasim_mashini.sh

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

Если у кого то есть замечания или добавления — пишите в комментариях. С радостью протестирую ваши предложения и внесу поправки в статью.
Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.