В маленьких инсталляциях VMware, которые располагаются не в ЦОД, а в своих серверных, где питание хостов реализовано через UPS, нужно контролировать работу этих самых UPS, чтобы в случае пропадания питания и разряда батареи виртуальные машины выключились корректно.
В данной статья рассматривается UPS от компании APC.
Для решения этой задачи есть несколько вариантов:
Я выбрал последний вариант, как самый простой и легковесный.
И так нам понадобится любая ВМ с Linux для установки apcupsd, у меня это машина с ZABBIX.
К этой машине нужно подключить UPS, сделать это как минимум двумя способами:
Т.к. менеджмент платы у мня не было, то был выбран вариант с USB, нужно подключить UPS в нужных хост ESXi, на него нужно смигрировать виртуальную машину, к которой будем пробрасывать устройство. При добавлении устройства обязательно ставим галочку "Enable vMotion", что позволит потом мигрировать эту машину на другой хост, при этом устройство останется подключенным, магия да? ;-)
В настройках это будет отображено так:
Тут все просто:
# yum install apcupsdПравим конфиг /etc/apcupsd/apcupsd.conf по своему усмотрению, у меня такой:
UPSCABLE usbUPSTYPE usbDEVICELOCKFILE /var/lockSCRIPTDIR /etc/apcupsdPWRFAILDIR /etc/apcupsdNOLOGINDIR /etcONBATTERYDELAY 6BATTERYLEVEL 5MINUTES 7TIMEOUT 0ANNOY 300ANNOYDELAY 60NOLOGON disableKILLDELAY 0NETSERVER onNISIP 0.0.0.0NISPORT 3551EVENTSFILE /var/log/apcupsd.eventsEVENTSFILEMAX 10UPSCLASS standaloneUPSMODE disableSTATTIME 300STATFILE /var/log/apcupsd.statusLOGSTATS offDATATIME 0Тут есть два интересных параметра:
MINUTES 7 - Говорит о том, что когда UPS перейдет на работу от батарей и при текущей нагрузке он сообщает, сколько еще сможет протянуть и вот когда остается 7 минут, то начинаем выключение. Тут нужно учитывать, что когда машины будут выключаться или "засыпать" нагрузка увеличится и 7 минут могут легко превратиться в 4 например.
TIMEOUT 0 - альтернативный вариант настройки, если тут указать таймаут в секундах, то после этого времени он будет произведено выключение, если указано 0, то такое поведение отключено.
Запускаем сервис и добавляем в автозагрузку:
# service apcupsd start# chkconfig apcupsd onВот так можно проверить, что все работает:
[root@srv-zabbix-01 /]# cat /var/log/apcupsd.statusAPC : 001,027,0691DATE : 2018-08-23 13:41:31 +0300HOSTNAME : srv-zabbix-01.psf.localVERSION : 3.14.14 (31 May 2016) redhatUPSNAME : srv-zabbix-01.psf.localCABLE : USB CableDRIVER : USB UPS DriverUPSMODE : Stand AloneSTARTTIME: 2018-08-23 09:22:30 +0300MODEL : Smart-UPS C 1500STATUS : ONLINEBCHARGE : 100.0 PercentTIMELEFT : 65.0 MinutesMBATTCHG : 5 PercentMINTIMEL : 7 MinutesMAXTIME : 0 SecondsALARMDEL : No alarmBATTV : 27.3 VoltsNUMXFERS : 0TONBATT : 0 SecondsCUMONBATT: 0 SecondsXOFFBATT : N/ASTATFLAG : 0x05000008MANDATE : 2017-06-15SERIALNO : AS1724341480NOMBATTV : 24.0 VoltsFIRMWARE : UPS 10.0 / ID=1005END APC : 2018-08-23 13:41:31 +0300Сгенерируйте ключ, если не делали это ранее:
# ssh-keygenпереходим в каталог
# cd .ssh/и копируем ключ на ESXi хост, да ssh-copy-id тут не сработает, поэтому так:
# cat id_rsa.pub | ssh root@srv-esx-01 'cat >>/etc/ssh/keys-root/authorized_keys'Эту операцию проводим со всеми хостами. Теперь можем ходить на хосты ESXi по SSH без пароля.
Сделамем скрипт для завершения работы VM
#!/bin/shvms=('srv-ts-01' 'srv-ts-02' 'srv-sql-01' 'srv-fs-01' 'srv-adds-02' 'srv-veeam-01' 'srv-vcsa-01' 'srv-adds-01' 'srv-web-01' 'srv-gw-01')hosts=('srv-esx-01' 'srv-esx-02' 'srv-esx-03')for vm in ${vms[@]}do for host in ${hosts[@]} do id=`ssh root@$host -C "vim-cmd vmsvc/getallvms" | grep "$vm\s" | awk '{print $1}'` if [ "$id" != "" ] then ssh root@$host -C "vim-cmd vmsvc/power.suspend $id" fi donedonepoweroffУ меня это /opt/vm-shutdown.sh, его нужно сделать исполняемым:
chmod +x /opt/vm-shutdown.shВ списке vms, перечисляются ВМ которые необходимо выключить, а в списке hosts соответственно хосты. В моем случае машины "уснут", но можно поменять команду на power.shutdown вместо power.suspend и тогда они просто завершат работу. Выключение ВМ будет выполняться в том порядке, в котором вы их пропишите в этом списке. Последняя команда в скрипте poweroff, выключит саму машину где установлен apcupsd.
При желании, так же можно добавить команды для выключения хостов ESXi, то-то вроде:
ssh root@srv-esx-01 -C "poweroff"Конечно это нужно вставить вместо poweroff и сделать так для каждого хоста.
Теперь нужно в файле /etc/apcupsd/apccontrol
заменить переменную вот так:
SHUTDOWN=/opt/vm-shutdown.shПосле чего перезапустить сервис apcupsd.
Для мониторингда ИБП можно использовать следующий шаблон:
https://share.zabbix.com/power-ups/apc/apcupsd
Инструкция там же.
Все, теперь при отключении питания мы будем проинформированны сервером ZABBIX и когда АБК в ИБП разрядится, ВМ коректно завершат работу или уснут.