VMware + Custom Fields + Powershell

A sima workstationös virtuális gépekhez lehet egy-egy string megjegyzést rendelni, hogy egy év múlva is tudja az ember, hogy a valamelyik hallgató által otthagyott WindowsXP3 virtuális gépben mi is lakozik:) A VirtualCenterben ezt kibővítették annyival, hogy kicsit lehet jobban struktúrálni, és megjegyzéstípusokat (ennek a felületen Annotations a neve) lehet hozzáadni az általános leíráson kívül. Ennek mi nagyon megörültünk, és mivel az eddigi szöveges leírás is "IP: x.x.x.x; Resbonsible: XY; Purpose: webserver" formában volt, gyorsan létre is hoztuk az IP, Resposible, Purpose, stb. mezőket. Szépen átírtuk az információkat az új formába, és elégedetten hátradőltünk.

Akkor ért majd csak meglepetés minket, amikor valamiért el kellett távolítani egy virtuális gépet a szerverről, majd újra hozzáadni. A szépen kitöltött információinknak nyoma se volt. Hát igen, ezt nem menti el a vmx konfigurációs fájlba, ez csak a VirtualCenter adatbázisában van tárolva. Nem igazán voltunk elégedettek ezzel a jelenséggel (hogy finoman fogalmazzak:). Nincs egyelőre még sok virtuális gépünk, kb. 20, de már ennyi esetén sem opció az, hogy kézzel álljunk neki másolgatni a leírásokat. Így legalább kénytelen voltam kipróbálni a Powershelles menedzsment felületét a VirtualCenternek:)

Először is le kell tölteni a VI Toolkit (for Windows) csomagot, ez tartalmazza a plusz Powershell cmdleteket. Ez jelenleg még csak beta verzióban van (a Perl változatból van már régóta végleges, de a Perl annyira nem vonz;) Utána el lehet indítani a konzolt, és érdemes kicsit ismerkedni az alap parancsokkal (get-vc, get-vm, stb.), kezdésnek jó ez a mini-whitepaper (ezt csak most a blog bejegyzés írása közben találtam meg, pedig jól jött volna a PowerGUI-s kiegészítés), hands-on lab és ez a FAQ (itt viszont elég idegesítő, hogy a példa scriptek nincsenek rendesen tagolva). Ezzel az alap tudással elkezdtem lekérdezni, hogy milyen tulajdonságokat ad vissza egy virtuális gépről:

# log on to VirtualCenter get-vc -server servername # get all the virtual machines and see them get-vm # get the members of a virtual machine get-vm | get-member

(Természetesen a dolog nem ment ilyen egyszerűen, a VirtualCenterünk nem a szabványos porton figyel, így ezt külön meg kellett adni. Ezen kívül utána problémázott, hogy a tanúsítvány nem hiteles, de ezt figyelmen kívül lehet hagyni.)

A get-members valami hasonlót ad vissza:

PS D:\Program Files\VMware\Infrastructure\VIToolkitForWindows> get-vm | Get-Member TypeName: VMware.VimAutomation.Client20.VirtualMachineImpl Name MemberType Definition ---- ---------- ---------- Equals Method System.Boolean Equals(Object obj) GetHashCode Method System.Int32 GetHashCode() GetType Method System.Type GetType() get_CDDrives Method VMware.VimAutomation.Types.CDDrive[] get_CDDrives() get_CustomFields Method System.Collections.Generic.IDictionary`2[[System.String, mscorlib... get_Description Method System.String get_Description() get_FloppyDrives Method VMware.VimAutomation.Types.FloppyDrive[] get_FloppyDrives() get_Guest Method VMware.VimAutomation.Types.VmGuest get_Guest() get_HardDisks Method VMware.VimAutomation.Types.HardDisk[] get_HardDisks() get_Host Method VMware.VimAutomation.Types.VMHost get_Host() get_ID Method System.String get_ID() get_MemoryMB Method System.Int32 get_MemoryMB() get_Name Method System.String get_Name() get_NetworkAdapters Method VMware.VimAutomation.Types.NetworkAdapter[] get_NetworkAdapters() get_NumCPU Method System.Int32 get_NumCPU() get_PowerState Method VMware.VimAutomation.Types.PowerState get_PowerState() ToString Method System.String ToString() CDDrives Property VMware.VimAutomation.Types.CDDrive[] CDDrives {get;} CustomFields Property System.Collections.Generic.IDictionary`2[[System.String, mscorlib... Description Property System.String Description {get;} FloppyDrives Property VMware.VimAutomation.Types.FloppyDrive[] FloppyDrives {get;} Guest Property VMware.VimAutomation.Types.VmGuest Guest {get;} HardDisks Property VMware.VimAutomation.Types.HardDisk[] HardDisks {get;} Host Property VMware.VimAutomation.Types.VMHost Host {get;} ID Property System.String ID {get;} MemoryMB Property System.Int32 MemoryMB {get;} Name Property System.String Name {get;} NetworkAdapters Property VMware.VimAutomation.Types.NetworkAdapter[] NetworkAdapters {get;} NumCPU Property System.Int32 NumCPU {get;} PowerState Property VMware.VimAutomation.Types.PowerState PowerState {get;}

A Description szépen kiolvasható, azonban az Attributes részt már nem olyan egyszerű megkaparintani. Rövid keresés után rábukkantam erre a bejegyzésre:

Custom Atrribute Access – itt a második üzenet az, ahol van némi példakód, hogy mit hogyan kéne használni. A VMware fórumának sortörés-eltávolító csoda képessége miatt totál olvashatatlan a kód, de a lényeg az, hogy az AvailableField és a CustomValue mezők lesznek segítségünkre.

Hogy ezek pontosan mit is tartalmaznak, azt az SDK-ból lehet kinézni. Itt válasszuk a Managed Objects Types / VirtualMachine elemet! Itt látszik, hogy a customValue-t a ManagedEntity-től, az availableField-et pedig az ExtensibleManagedObjecttől örökli. Ott megnézve a részleteket az availableField CustomFieldDef típusú, ez többek között key és name mezőket tartalmaz. A customValue CustomFieldValue típusú, ami az SDK szerint key, dynamicProperty és dynamicTpye mezőket tartalmaz, a key kereszthivatkozás arra a fieldre, amihez tartozik ez az érték, no de akkor hol tárolja az értéket. Viszonylag sok szenvedés árán végül nagyon egyszerűen meg lehet ezt keresni:

Get-View (Get-VM -Name VM1).ID | % { write-output $_.customValue }

Példa kimenet:

Value Key DynamicType DynamicProperty ----- --- ----------- --------------- 192.168.1.101 6 micskei 7 webszerver 8 WS2003 32bit 9

Itt már látszik, hogy van ám ennek a customValue-nak egy value tulajdonsága is, itt tárolja az értéket, csak ez valahogy az SDK-ból lemaradt:)

Így már viszonylag gyorsan össze lehet tákolni egy olyan scriptet, ami összegyűjti a virtuális gépekhez definiált mezők értékeit, és összefűzi egy stringbe, hogy azt akár később át lehessen rakni a Description mezőbe:

function Convert-Attributes($virtualMachine) { $vmView = Get-View $virtualMachine.ID # create a new hashtable $fields = @{} # get field key-name pairs into the hashtable # TODO this should be only done once, beacuse it is global for each entity type foreach ($field in $vmView.AvailableField){ $fields.Add($field.Key, $field.Name) } $description = "" foreach ($val in $vmView.CustomValue){ $description += $fields.Get_Item($val.Key) + ": " + $val.Value + "; " } write-output $description } Get-VIServer -Server serverName get-vm | % {write-output $_.Name; Convert-Attributes($_); write-output ""}

Powershell rocks:-)

Technorati-címkék: ,,
Reklámok
Kategória: Tech | Közvetlen link a könyvjelzőhöz.

Vélemény, hozzászólás?

Adatok megadása vagy bejelentkezés valamelyik ikonnal:

WordPress.com Logo

Hozzászólhat a WordPress.com felhasználói fiók használatával. Kilépés / Módosítás )

Twitter kép

Hozzászólhat a Twitter felhasználói fiók használatával. Kilépés / Módosítás )

Facebook kép

Hozzászólhat a Facebook felhasználói fiók használatával. Kilépés / Módosítás )

Google+ kép

Hozzászólhat a Google+ felhasználói fiók használatával. Kilépés / Módosítás )

Kapcsolódás: %s