Копипаста:
Спасение утопающих - исключительно дело рук самих утопающих!!!
Сделал и для VMWare ESXi - работает.
Вот как это делается. Для начала к установленному виртуализатору VMW ESXi понадобится для питания-шутдауна виртуализатора нормальный UPS c SNMP картой - нормальный не тот, что стоит как чугунный трактор - а с нормальным ПО отключения клиентских компьютеров. Пример нормальных - MGE, APC. Пример ненормальных - Socomec и подобные. Хотя и Socomec - не совсем безнадежный случай. Для UPS понадобится нормальный клиент выключения компьютера умеющий работать фоново без входа юзера и нормально запускать скриптовый файл хоть один при срабатывании. Под какую систему клиент - не так важно - Windows или Linux (скорее всего там будет из нормальных только агент под далеко не бесплатную RedHat, он-то и желателен - имеет расширение .bin и его все чертыхаясь путают с прошивкой SNMP карты UPS, но это, как ни странно, установочный пакет к RedHat), весь остальной программный мусор от UPS можно выбросить в нашем случае.
Далее качаем некую мудреную фичу VMA с сайта VMWare, при ближайшем рассмотрении оказывающуюся заурядной виртуалкой c RedHat без графической оболочки, но установленной уже на нее RCLI - фичей из обычного интерпретатора PERL и некоторых модулей и скриптов от VMWare (это по рабоче-крестьянски, говоря, такой удаленный терминал выполнения Perl-скриптов для ESXi хостов через сетевой HTTPS API). Импотируем эту виртуалку в нашу ESXi как еще одну машину, со всем соглашаясь, делаем ее обязательно автозапускающейся и завершаемой при шутдауне. Места займет 5Гбайт на диске и 256МБайт в озу. Хотя можно и подрезать - много она не трудится. Можно поизвращавшись поставить вообще на старую железку отдельную, если ESXi слабый и без нее - она все равно команды по сети по протоколу https дает в ESXi, а не как-то напрямую, как некоторые думают. Берется сее мудреное чудо тут:
http://www.vmware.com/support/developer/vima/
Затем запустив эту виртуалку - настраиваем ее в консоле на некоторый IP, доступный по маске подсети и для сетевой карты UPS и для IP ESXi (можно и в разных подсетях), даем имя и все что спросит, главное пароль. Для незнающих где это хранится в RedHat стоит быть внимательными - настройка одноразовая, второй раз придется виртуалку импортировать с нуля.
Дальше заходим в это по имени vi-admin и заданному выше паролю. Имя root - не существует тут! Посему перед каждой важной командой добавляеи sudo и вводим тот самый пароль на вопрос каждый раз.
Ставим из пакета с расширением .bin RedHat-драйвер имеющегося UPS. Конфигурим его по инструкции этого драйвера. Как пример нечто от Eaton, даже не самого MGE для всех UPS MGE (они самые лучшие для этого дела). Описано в картинках и лежит тут:
http://www.vmware.com/appliances/directory/uploaded_files/install%20NSM%20on%20vmware_esxi_.pdf
http://download.mgeops.com/explore/eng/network/net_sol.htm?sol=NSM
Да, на открытие фаервола обращаем внимание! Иначе ничего работать не будет! У RedHat там все позакрыто по умолчанию, вплоть до имени root !
Теперь главное! Ищем в этом Eatone скрипт шутдауна ESXi !
Он лежит тут:
/usr/local/EATON/NetworkShutdownModule/bin
советую его выкачать - годен и для Windows!!!
Его файл:
shutdownESXi.pl
А синтаксис:
shutdownESXi.pl --server ESXi_IP --username root --password PASSWORD
Стираем весь тот бред что стоит у Eaton в строке запуска скрипта по сигналу отключения от UPS и пишем так:
../bin/tools/shutdownESXi.pl --server ESXi_IP --username root --password PASSWORD
Для ESXi больше одной - пишем дополнительные строки шутдауна к каждой системе! Не забывая заменять ESX_IP на ваши, но и имя и пароль также!
Собственно - все!!!
Выдергиваем питание UPS и любуемся завершающимися виртуальными машинами, а затем и самим завершением ESXi !!! Точнее тем, что это не работает! Ах да, забыл сказать - в халявной версии ESXi - заблокирован API дистанционного выполнения PERL скриптов - тот самый RCLI ! Ну, трясем начальство отстегнуть от своих взяток энное количество вечно зеленых денегов на платный ESXi. И перебиваем серийник ESXi с бесплатного от VMWare на желаемый (перезагрузки или остановки ESXi - не потребует!). Теперь для версии Linux-драйверов SNMP к UPS - действительно все! В принципе - годен Linux драйвер любой, не только Eaton, только искать, где вписывать скрипты самим придется.
Кстати - не забываем всем виртуалкам вместо PowerOFF отключения Shutdown или Suspend (лучше не надо suspend - в NAS кэш RAIDа данные оставляет, а батарейка у него не вечная!) прописать - иначе при отключении их виртуализатор будет последовательно ронять, а не шутдаунить корректно, но сам завершится корректно последним!!! Ну для начала - весь сервиз перебит, но фамильная супница цела - уже не плохо!
Но, что делать если со знанием Linux - совсем беда или есть только Windows агент шутдауна к компьютеру, но умеющий скрипт запускать? Тут принцип тот же, только придется еще кое-что скачать и поставить.
Делаем тогда ручками обычную Windows виртуальную машину. Думаю WinXP будет достаточно или на сколько там у вас глючный драйвер шутдауна к вашему UPS?! Настраиваем ей все как выше. Но ставим на нее вот эту штуку для Windows:
http://www.vmware.com/download/download.do?downloadGroup=VI-RCLI
(Ну, аккаунт придется потрудится создать. Адресок почты засветить, глупую анкету заполнить. Бесплатно!)
Хотя эта очень невзрачная фича под винду еще не раз будет нам полезна!
Что-то вида:
VMware-VIRemoteCLI-1.1.0-64644.exe Наукообразно это называется RCLI, клиентская часть для запуска PERL скриптов на ваших ESXi серверах удаленно! Во, как!!!
Ставим - не кусается.
Получаем аналог страшной фичи VMA, но под Windows, сделанный своими ручками.
Далее прикручиваем в этой виртуалке ваш драйвер шутдауна от UPS и вручаем ему скрипт с теми же параметрами, как выше:
shutdownESXi.pl --server ESXi_IP --username root --password PASSWORD
Помните - советовал запастись?! Не запаслись - ну я вложил его ниже, только не забудьте стереть все расширения, кроме .pl (язык PERL - не хухры-мухры!) А чисто .pl тут положить не дают. Не забудьте этот скрипт закинуть в рабочую папку RCLI клиента, иначе не сработает, это что-то типа (там в основном примерный мусор, но есть пара ценных скриптов):
C:\Program Files\VMware\VMware VI Remote CLI\bin
Кстати немного о полезных скриптах терминала RCLI (никто не запрещает поставить еще один такой на вашу рабочую машину управления сетью!). Коль заморочились уже с RCLI. Мной замечены в каталоге
C:\Program Files\VMware\VMware VI Remote CLI\bin
esxcfg-cfgbackup.pl - создает и восстанавливает полностью маленький файл всей конфигурации ESXi без виртуалок в нем - может быть полезно для быстрого клонирования хостов ESXi.
Синтаксис имеет:
BACKUP ТОЛЬКО настроек установки ESXi !!!
vicfg-cfgbackup.pl --server <server_name> -s <backup_file_name> для создания бэкапа
vicfg-cfgbackup.pl --server <server_name> -l <backup_file_name> для восстановления
Имя и пароль на указанном <server_name> ESXi спросит онлайново.
vifs.pl - скрипт, способный с большой скоростью и весьма устойчиво (!) даже по плохой сети выкачивать на вашу машину из ESXi файлы виртуалок длиной в десятки гигабайт! Не занятые в работе, разумеется, не способен выкачивать файлы образов дисков напрямую при работающих виртуалках без снапшотирования состояния виртуалки! Единственно при его работе рабочий процесс интерпретатора перла очень сильно подсаживает процессор вашей машины, посему запускать лучше на ночь и давать интерпретатору перла самый низкий возможный приоритет.
Синтаксис содержит в начале своего файла. Скрипт опасный - в кривых руках может уничтожать файлы безвозвратно!
Каталог
C:\Program Files\VMware\VMware VI Remote CLI\Perl\apps\vm
содержит как минимум один ценный скрипт, использующийся другим ценным скриптом архивирования любой виртуалки на ходу на вашу машину управления! Про него расскажу со своими правками в следующем сообщении!
snapshotmanager.pl - создает и уничтожает снапшоты и их дочерние снапшоты любой виртуалки, как нажатие кнопок снапшотов оснастки. Имеет множество параметров. Внутри себя не имеет описания - все значения параметров приходится дергать из декларации констант в его начале. Экспериментировать лучше все же на кошках, хотя на мой взгляд этот скрипт из умеренно опасных при кривом использовании.
Но возвращаясь к нашим баранам, точнее отключению ESXi от сигналов UPS для самодельной машины VMA под Windows...
Собственно остальное все не сильно отличается от случая выше для Linux RedHat, точнее совсем не отличается.
Если все заклинания (матерные, не очень матерные и совсем не матерные) произнесли, написали, вставили правильно - будет работать все точно также!
Собственно, так как внутренность ESXi, довольно туманная и усеченная, никак не затрагивается - то этот способ позволяет работать почти с любым UPS с сетевой картой с софтом выключения практически любой кривизны и недоступности под новые версии систем, например, даже Socomec.
На сем собственно, кружок очумелые ручки с поделкой "давайте зашутдауним ESXi сервер от UPS с SNMP картой" - закрывается!
-----------------------------------------------------------------------------------------
shutdownESXi.pl.txt
#!/usr/bin/perl -w ################################################################################ # (c) 2010 - Eaton Power Quality # # This scripts allows users to perform a Shutdown on an VMware ESX Server # example: # ./shutdownESXi.pl --server $server --username $username --password $password ################################################################################ use strict; use warnings; use VMware::VIRuntime; use VMware::VILib; # validate options, and connect to the server #Opts::add_options(%opts); # validate options, and connect to the server Opts::parse(); Opts::validate(); Util::connect(); # Obtain all inventory objects of the specified type my $entity_type = "HostSystem"; my $entity_views = Vim::find_entity_views(view_type => $entity_type); # Process the findings foreach my $entity_view (@$entity_views) { my $entity_name = $entity_view->name; $entity_view->ShutdownHost(force => 1); #if force => 0 the Host must be in maintenance mode otherwise the operation is not allowed } Util::disconnect();
Коли мы разобрались с мудреной фичей от VMWare под названием RCLI и вдруг имеем не бесплатные версии ESXi, то можем на них даже архивировать без всяких сторонних средств и без остановки любые нравящиеся виртуальные машины хоть вручную, хоть по расписанию - уже дело вкуса, чем и где скрипты запускать. То есть решить еще одну сложную, обычно попутную проблему! Правда никаких встроенных готовых средств не существует, но есть чудо-скрипт, построенный на комбинированных вызовах двух других помянутых выше скриптов RCLI-клиента:
snapshotmanager.pl - автоматизированное создание снапшотов виртуальных машин на ESXi
vifs.pl - перекачивание всего и вся из файловой системы VMFS на ESXi - на свою машину
В природе встречается скрипт ESXi-Backup.pl - но на мой взгляд он не совсем хороший и опасный, так как заставляет делать снапшот все включенные виртуальные машины хоста в не зависимости, надо это или нет. Как говорится - не трогай чего не нужно и оно не тронет тебя. Кроме того там довольно непонятные значения в константах задания архивирования в оригинале. Я сее подправил и проверил - получилось на мой взгляд что нужно. Попытку удаления снапшотов с именем BackupSnap для всех включенных виртуальных машин хоста исправлять не стал - думаю это не вредит - просто никогда не создавайте на вашей системе снапшотов с именем BackupSnap и их дочерних снапшотов! Вроде вполне реализуемое ограничение! А так, заодно, проверит на забытые ненужные снапшоты от архивации! Прикрепляю свой вариант скрипта ниже, мало ли кому понадобится. Что и где архивировать - надо задать редактированием нескольких констант вначале скрипта, а для каждой виртуальной машины лучше создать свой собственный скрипт и запускать их чем и где нравится. Лучше на ночь или выходные - снапшотирование и стирание снапшотов - почти мгновенны, а вот передача всех данных виртуальных машин - есть передача. Или у вас все виртуалки по паре десатков мегабайт, как в старые добрые времена MS-DOS? Но как бы там ни было виртуалки будут продолжать штатно работать все время архивирования, а в архив пойдет состояние на момент снапшотирования!
Скрипт отсюда надо дополнить своими константами и переименовать во:
что-то_там.pl
И положить лучше сюда:
C:\Program Files\VMware\VMware VI Remote CLI\bin
Он обязательно должен найти два других скрипта - иначе не работоспособен!
Каталог C:\Program Files\VMware\VMware VI Remote CLI\bin лучше дописать в переменную окружения PATH виндюка - тогда будет работать не только в этом каталоге запуск Perl скриптов из DOS-консоли обычной.
И не забудьте заранее до запуска создать в локальном каталоге, куда прописано архивирование обязательно подкаталог, полностью повторяющий имя каждой архивируемой виртуалки - без этого скрипт не работает!
Должно быть как-то так создано ручками заранее для примера:
D:\Temp\My_Virtual_Machine_1\
(слеши в скрипте обратные этим - и это правильно для Perl!)
---------------------------------------------------------------------------------------------------------
ESXi-Backup-My_Virtual_Machine_1.pl.txt
# # # ESXi 3.5(4.0) Backup Script # # Autor: Christian Gruetzner # Editor: Alexey Sinitsyn aka Sinya # ############################################################################# # #2010-07-21 V 1.1 Edited Script # Addition: -Prevention cycle create snapshots all on-line # virtual machines, not needed for backup in this # script # # -Clear kind of initial constants in an example # of the task for backup # # # # #2008-08-22 V 1.0 Basic Script # Functions: - create snapshots of all local VM's # - get files from ESX-Datastore to local Store # - exclude unneccessary files from backup # - remove all created snapshots # - actual time in log # ############################################################################# my $url = "https://192.168.1.1/sdk/vimService"; #URL to your ESXi Host, default: "https://192.168.1.1/sdk/vimService" my $username = "root"; #Username my $password = "my_password"; #User password my $snapshotname = "BackupSnap"; #Name of your Snapshot, example "BackupSnap" my $DSPath = "[STORE1]"; #Datastore name on ESXi Host, example "[STORE1]" my @VMNames; $VMNames[0] = "My_Virtual_Machine_1"; #Uncomment the next lines if you like to backup more vm's, example "My_Virtual_Machine_1" #$VMNames[1] = ""; #$VMNames[2] = ""; #$VMNames[3] = ""; #$VMNames[4] = ""; #$VMNames[5] = ""; #$VMNames[6] = ""; #$VMNames[7] = ""; #$VMNames[8] = ""; #$VMNames[9] = ""; my $RCLIPath = "C:/Progra~1/VMware/VMWARE~4"; #VI Remote CLI Path (Windows: Use ONLY Short Folder Names!!!!), example "C:/Progra~1/VMware/VMWARE~4" my $DestPath = "D:/Temp/"; #Destination Path you like to copy to (Windows: Use ONLY Short Folder Names!!!!), example "D:/Temp/" #IMPORTANT!!! -- Under DestPath must exist the VMNames Folder #(For Example if your VMNames[0] = "ServerA" and your DestPath = "D:/": D:/ServerA/) #-------------------------------------------------------- # For the short folder name use "dir /X" #call the sub function (at the bottom) &actualtime(); print " ***** Script Start *************************\n\n"; &actualtime(); print " ----- Create Snapshots of running VM's -----"; print "\n\n"; my $i = 0; #special loop for arrays. run as long the array has data foreach (@VMNames) { system("perl $RCLIPath/Perl/apps/vm/snapshotmanager.pl --url $url --username $username --password $password --operation create --vmname \"$VMNames[$i]\" --powerstatus poweredOn --snapshotname $snapshotname"); $i++; } print "\n\n"; &actualtime(); print " ----- Copy VM files to local storage -----"; print "\n\n"; my $i = 0; #special loop for arrays. run as long the array has data foreach (@VMNames) { #read all available files and save filenames in the cache-array my @cache = `perl $RCLIPath/bin/vifs.pl --url $url --username $username --password $password --dir \"$DSPath $VMNames[$i]\"`; #run as long the cache array has data and save the value everytime in $filename foreach my $filename (@cache) { #exclude uninterresting files from backup to save backup space if($filename !~ /.log/ && $filename !~ /.vswp/ && $filename !~ /.vmsn/ && $filename !~ /-delta/) { #remove the "\n" at the end of $filename to prevent a error massage in log chomp($filename) &actualtime(); print " ----- Copy File: "; print $filename; #get files from VM Datastore to a local Storage system("perl $RCLIPath/bin/vifs.pl --url $url --username $username --password $password --get \"$DSPath $VMNames[$i]/$filename\" \"$DestPath$VMNames[$i]/$filename\""); print "\n"; } } $i++; } print "\n\n"; &actualtime(); print " ----- Remove Snapshots of running VM's -----"; print "\n\n"; system("perl $RCLIPath/Perl/apps/vm/snapshotmanager.pl --url $url --username $username --password $password --operation remove --powerstatus poweredOn --snapshotname $snapshotname --children 1"); print "\n\n"; &actualtime(); print " ***** Script End ***************************"; #sub function to print the actual time in the log sub actualtime { my ($Sekunden, $Minuten, $Stunden, $Monatstag, $Monat, $Jahr, $Wochentag, $Jahrestag, $Sommerzeit) = localtime(time); my $CTIME_String = localtime(time); $Monat+=1; $Jahrestag+=1; $Monat = $Monat < 10 ? $Monat = "0".$Monat : $Monat; $Monatstag = $Monatstag < 10 ? $Monatstag = "0".$Monatstag : $Monatstag; $Stunden = $Stunden < 10 ? $Stunden = "0".$Stunden : $Stunden; $Minuten = $Minuten < 10 ? $Minuten = "0".$Minuten : $Minuten; $Sekunden = $Sekunden < 10 ? $Sekunden = "0".$Sekunden : $Sekunden; $Jahr+=1900; print "$Jahr-$Monat-$Monatstag $Stunden:$Minuten:$Sekunden"; }
---------------------------------------------------------------------------------------------------------
Копипаста моде офф
ИСТОЧНЕГ
0 коммент.:
Отправить комментарий