11 June 2013

Automatski shutdown virtuelnih mašina na ESXi hostu, po nestanku struje

Zadatak

Nedavno smo kolega i ja imali zadatak da napravimo sistem za automatski shutdown virtuelnih mašina na ESXi serveru, a na kraju i samog hosta, po nestanku struje. Ovo je rješenje problema sa nekontrolisanim gašenjima virtuelnih mašina, što posebno zna biti nezgodno ako se na serveru nalazi baza koja lako može da pukne ukoliko u momentu gašenja bude u toku neka transakcija. Odmah nam je pao na pamet PowerChute Business, softver koji dolazi na CD-u za UPS, ali nismo znali kako da on pokrene shutdown virtuelnih mašina. U pitanju su bili server Fujitsu Primergy TX200 S6 i UPS APC SMT1000I

Fujitsu Primergy TX200 S6

APC SMT1000I


















Negdje na Internetu smo našli da će ESXi sam prepoznati signal za shutdown koji šalje PowerChute, te da će sam odraditi shutdown po redoslijedu kako je podešeno u Virtual Machine Startup/Shutdown odjeljku u podešavanjima u vSphere Clientu, međutim to nama nije radilo sa softverom koji je došao na CD-u. Njega smo instalirali na CentOS i softver nikako nije mogao detektovati UPS koji je bio priključen preko kabla. Kabl na jednoj strani ima RJ-45 priključak (strana koja ide u UPS), a na drugoj RS-232 (onoj koja ide u računar). Rješenje je bilo u appliance-u za vmware - vSphere Management Assistant (vMA) 5.1, sistemu koji ima instalirane alate za menadžment Vmware hostova.

Instalacija i podešavanje softvera

Na server je instaliran ESXi 5.1 i dodate tri virtuelne mašine koje imaju svoje zadatke. Mi ćemo za potrebe našeg sistema za shutdown napraviti još jednu virtuelnu mašinu - vSphere Management Assistant (vMA) 5.1, proizvod Vmware-a. Moguće ga je besplatno downloadovati sa lokacije https://my.vmware.com/group/vmware/get-download?downloadGroup=VSP510-VMA-510 .

Poslije deploymenta OVF-a, dobija se virtuelna mašina sa diskom od 3,5GB (provisioned size) i 600MB RAM memorije. Appliance je napravljen na SuSe Linuxu Enterprise 11 x64. Prije prvog paljenja je na virtuelnu mašinu potrebno dodati serijski port i tom prilikom označiti opciju "Use physical serial port on the host". Do kraja ostaviti sve po podrazumijevanim podešavanjima (kod nas je oznaka porta bila /dev/char/serial/uart0). Upaliti mašinu. 

Po prvom paljenju se pokreće wizard u vidu konfiguracionog menija

Ovdje su osnovna podešavanja: IP adresa, DNS, Hostname, Gateway. Setovati ih u skladu sa mrežnim okruženjem i izabrati 1 - Exit this program.

Sljedeće što će trebati je da se setuje password za korisnika vi-user. Ovo je account sa root ovlaštenjima i password mora da zadovoljava complexity requirements (8 znakova, velika i mala slova, brojevi i specijalni znakovi). Ako sve ovo nije ispoštovano, neće htjeti da kreira password :( Sigurno je da se i to može podešavati, ali se nismo bavili ovom banalnom problematikom.

Sljedeće što bi se trebalo vidjeti na ekranu je ovo (naravno sa Vašom adresom):


Sada treba skinuti novu verziju softvera. Probali smo sa softverom koji dođe na CD-u, međutim nikako nije uspijevao da detektuje priključeni UPS, ili je u nekim modovima pokazivao da je UPS na bateriji umjesto da je online. Na stranici APC-a postoji novija verzija softvera. Skinuti verziju za ESXi:


Downloadovani fajl pcbe910_linux.tar.gz otvoriti WinRarom i iz njega (iz foldera RPM) ekstraktovati fajl pbeagent-9.1.0-614.i386.rpm. Ovaj fajl WinSCP-om (ili nekako drugačije) prebaciti na naš vMA. Spojiti se na vMA preko SSH, i instalirati paket komandom rpm (bitno je da se bude u folderu gdje se nalazi navedeni paket)
# sudo rpm -i pbeagent-9.1.0-614.i386.rpm
Softver pokrenuti komandom
# sudo sh /opt/APC/PowerChuteBusinessEdition/Agent/config.sh
Pokreće se konfiguraciona skripta. Prvo se setuju korisničko ime i šifra za pristup aplikaciji (mi smo za testiranje stavili admin i za username i za password), zatim se izabere port na koji je priključen UPS (to je kod nas bio /dev/ttyS0), zatim se unese Yes za potvrdu konfiguracije, a onda IP adresa ESXi hosta. Ovdje je moguće da prijavi grešku "Error: No targets have been defined for this vMA.", ali ako se ovo desi, potrebno je ručno dodati ESXi host kasnije. Poslije ovoga, vMA pita za kredencijale od ESXi-a, i na kraju pita da li želite da startuje PowerChute. Vi kažete Yes. To izgleda ovako:


Da bi se provjerio status servera (tj. da li je managed, unese se komanda)
# vifp listservers
Ako je server managed, trebao bi da bude izlistan. Ako nije, tada ga je potrebno dodati komandom
# vifp  addserver <server>
Na mjesto oznake  <server> ide IP adresa ili DNS ime ESXi servera. Bitno je da imena servera (i vMA i ESXi) budu dodati na lokalni DNS server u vidu A recorda, ili da se host name ESXi-a doda u fajl /etc/hosts na vMA serveru.


Glavna ideja je da na ESXi host smjestimo skriptu koja će preko Vmware CLI-a ugasiti virtuelne mašine jednu po jednu, a na kraju i samog hosta. Na vMA ćemo smjestiti drugu, mini skriptu koja će pozivati skriptu na ESXi-u, a softver PowerChute će znati kada će se to desiti. Ovdje su se pojavila dva problema: Da bi se uradio shutdown hosta, on mora prvo otići u maintenance mode, pokrenuti shutdown i što prije izaći iz maintenance mode-a, da bi se prilikom sljedećeg startovanja normalno pokrenule virtuelne mašine. Skripta koja odrađuje sve navedeno se može naći na adresi https://github.com/sixdimensionalarray/esxidown/blob/master/esxidown.sh . Drugi problem je bio daljinsko pokretanje komande na hostu. Za to je inače dobar program sshpass, neinteraktivni SSH klijent, ali njega nije bilo instaliranog na vMA Linuxu. Kopanjem po netu smo naišli na odgovarajući rpm koji smo instalirali komandom
# yast2 -i sshpass-1.04-4.2.x86_64.rpm

Instalacija i podešavanje skripti

Sljedeće što smo uradili: omogućili smo SSH pristup Vmware hostu - u vSphere clientu na Security Profile-u uključili servis SSH, a port 22 je na njegovom Firewallu već bio propušten. Obavezno treba napraviti bar jednu SSH konekciju npr. iz Putty-ja sa vMA na ESXi host da bi došlo do razmjene ključeva između SSH servera i klijenta. Bilo bi nezgodno ako bi prvu konekciju ostvario sshpass jer je on neinteraktivan alat i ne bismo mogli da otkucamo "yes" da bi prihvatili novi ključ.

Skripta esxidown.sh ima tri bitne promjenjive: SERVERIDS (id za svaku virtuelnu mašinu, razdvajaju se razmacima), WAIT_TRYS (broj pokušaja za uspješan shutdown - ako se mašina ni tada ne ugasi, tada ide poweroff, kod nas setovano na 2) i WAIT_TIME (vrijeme u sekundama za shutdown virtuelne mašine, u našem primjeru 20). Vrijednosti svih promjenjivih je potrebno prilagoditi okruženju. Za dobijanje ID-eva virtuelnih mašina se SSH klijentom spojimo na ESXi host i izvršimo komandu

# vim-cmd vmsvc/getallvms
koja će izlistati sve virtuelne mašine sa njihovim ID-evima. Ove ID-eve prepisati u skriptu esxidown.sh onim redoslijedom kojim želimo da se gase virtuelne mašine, kao vrijednosti promjenjive SERVERIDS. ID-evi se razdvajaju razmacima. Kada se setuju željene vrijednosti, skriptu iskopirati na ESXi. Lokacija skripte mora biti na datastore-u jer se ne može permanentno snimiti ni na jedno drugo mjesto. U našem slučaju lokacija je bila /vmfs/volumes/51aef5c3-d5e5d538-117c-001999c95462/Install/eshidown.sh. Obavezno komandom
# chmod +x esxidown.sh
dodati execute permisiju za skriptu da bi se mogla pokrenuti.

Druga skripta se zove gasiesxi.sh i nju treba kreirati na lokaciji /opt/APC/PowerChuteBusinessEdition/Agent/cmdfiles/. Ova skripta je samo "okidač" za skriptu esxidown.sh i sadrži samo jednu komandu:
sshpass -p P@$$w0rd ssh root@xxx.xxx.xxx.xxx 'sh /vmfs/volumes/datastore1/Install/esxidown.sh'
Naravno, P@$$w0rd predstavlja password za root account na ESXi hostu sa adresom xxx.xxx.xxx.xxx. I njoj treba dodati pravo izvršavanja komandom chmod, kao što smo to uradili i za prethodnu skriptu. Poslije ovoga restartovati vMA virtuelnu mašinu.

Još je ostalo da kažemo kada će se izvršiti skripta gasiesxi.sh. Otići na URL https://<ipservera>:6547. Dobija se sljedeći login screen:

Ovdje unesemo kredencijale koje smo setovali u konfiguraciji softvera (u mom slučaju admin admin) i kada se ulogujemo, pokreće se Initial Setup wizard za osnovna podešavanja. Klikom na Next, otvaraju se podešavanja za Outlete. Izabrali smo Outlet 1 grupu zato što u tu grupu pripada naša utičnica za server sa zadnje strane UPS-a. Klikom na Next se otvaraju podešavanja za shutdown, za nas najbitnija podešavanja. Ovdje smo setovali Power Failure Configuration na 600 sekundi za opciju When power fails, begin a shutdown procedure After the UPS has been on battery for. Setovali smo 300 sekundi za opciju Time for operating system to shut down. U dropdown meniju Choose command file izabrati gasiesxi.sh, stavku koja bi se trebala pojaviti tu poslije kopiranja skripte na navedenu lokaciju.


Kada se klikne na Finish, web interface se prebacuje na status page gdje bi u gornjem lijevom uglu trebao pisati model UPS-a (u našem slučaju Smart-UPS 1000) a pod stavkom Device status treba pisati On line (Green Mode).



Ako nestane struje, status se mijenja na On battery i kada prođe 600 sekundi, pokreće se skripta gasiesxi.sh, koja "okida" skriptu esxidown.sh na hostu koja zadatim redoslijedom gasi virtuelne mašine, a na kraju i samog hosta. U BIOS-u servera uključiti opciju za automatsko paljenje servera prilikom dolaska struje, a na Vmware-u takođe treba podesiti startup virtuelnih mašina.

Korištene informacije i ideje sa bloga No Joke IT