Virtual Server Scripting  
Posted - 12/08/2007 :  22:00:44  Show Profile
Virtual server wordt gebruikt om zoals de naam al zegt servers te virtualiseren. Een bijna logisch gevolg daarvan is dat er vooral consolidatie op hardware niveau plaatsvindt maar functioneel gezien serverrollen opsplitsen in aparte servers voor elke rol. Doordat het aantal servers, zij het virtueel, weer toeneemt ontstaat de behoefte bepaalde zaken wat soepeler te laten verlopen, omdat alle servers zijn gevirtualiseerd kan dit ook relatief eenvoudig. Servers zijn niet meer dan bestanden geworden op een grote physieke machine. Bestandjes zijn aan te passen en te kopiëren waardoor we dingen kunnen doen die voorheen niet mogelijk waren in een server omgeving. Virtual server kent een vrij uitgebreide vorm van ondersteuning voor scripting waar we goed gebruik van kunnen maken om ons werk te vergemakkelijken. In dit artikel zullen we kennis maken met de mogelijkheden die worden geboden en een klein praktijk voorbeeld aanwenden om wat dieper op de materie in te gaan.

Het benaderen van de Virtual server faciliteiten kan vanuit een script op 2 manieren. De eerste is via WMI wat zich dan vooral beperkt tot performance informatie. De tweede manier is via COM waarmee we dan tevens ook het volledige gamma aan functies kunnen bedienen. Het voordeel van COM is dat we virtual server vrij eenvoudig vanuit diverse programmeertalen kunnen bedienen. Dit kan visual basic, c# maar ook zelfs perl of powershell zijn. Voor dit artikel zullen we echter uit gaan van visual basic script als voorbeeldtaal. Visual basic script is standaard aanwezig en daarom makkelijk in het gebruik. Voor het gebruik van COM is een standaard interface aanwezig, hoe gaat dat precies in zijn werk?

Met de volgende opdracht creëren we met vbscript een object waardoor de communicatie kan verlopen
Set objVs = CreateObject("VirtualServer.Application")

Dit werkt echter alleen direct op de server waar alles op draait wat natuurlijk niet altijd van toepassing is en ook wel een beetje belemmerend. Op afstand kan het echter ook, dan moeten we het commando iets uitbreiden:

set objVs = CreateObject("VirtualServer.Application", "ServerNaam")

‘Servernaam’ is hierbij dan natuurlijk de naam van de virtual server die als host dient.

Het aantal methods wat beschikbaar is vanuit een script met behulp van het zojuist gemaakte object, is enorm. Een aantal hiervan is direct ontsloten met het virtual server object (IVMVirtualServer). Er zijn erchter nog een groot aantal andere interfaces beschikbaar, de belangrijkste daarvan zijn de virtual machine collection en de individuele virtual machine objecten, het guestos object,DVDDrive,Harddrive en networkadapter. Laten we eens naar een klein voorbeeldje kijken wat gebruik maakt van het zojuist gecreëerde object:

Set objVS = CreateObject("VirtualServer.Application")

Wscript.Echo "Capaciteit: " & objVS.AvailableSystemCapacity
Wscript.Echo "Naam: " & objVS.Name
Wscript.Echo "Uptime: " & objVS.Uptime
Wscript.Echo "Versie: " & objVS.Version

Dit zijn maar een klein aantal van alle properties die beschikbaar zijn. We hebben nu alleen gekeken naar capaciteit, naam, uptime en versie maar we kunnen veel meer gegevens opvragen.

We kunnen ook direct interactie aangaan met een virtuele machine. Het nu volgende voorbeeld lokaliseerd een specifieke virtuele machine en start deze op:


Set objVS = CreateObject("VirtualServer.Application")
Set objVM = objVS.FindVirtualMachine("ApplicatieServer")
objVM.Startup()

Een volgende interessante stap is het aanmaken van een virtuele harddisk en deze koppelen aan een virtuele machine zodat deze over meer capaciteit kan beschikken. Een harddisk kan zo worden aangemaakt:

Set objVS = CreateObject("VirtualServer.Application")
Set objVhd = objVS.CreateDynamicVirtualHardDisk ("C:\VM\Disk1.vhd", 16000)

Vervolgens moeten we natuurlijk de harddisk ook verbinden met een virtuele machine. Dit doen we dan weer als volgt:

Set objVS = CreateObject("VirtualServer.Application")
Set objVM = objVS.FindVirtualMachine("Windows 2000 Server")
Set objDrive = objVM.AddHardDiskConnection("C:\VM\Disk1.vhd ",0,0,0)

Afhankelijk van waar we de disk precies willen hebben en het type zijn de controle getallen op het eind anders, we geven hiermee informatie mee over SCSI of IDE, kanaal en lun informatie.
Naast het toevoegen van hardware kunnen we ook de virtuele machine koppelen aan het netwerk.


Een virtuele machine heeft natuurlijk een virtueel netwerk, daarom kunnen we ook virtuele netwerk adapters toevoegen zoals het volgende voorbeeld laat zien

Set objVS = CreateObject("VirtualServer.Application")
Set objVM = objVS.FindVirtualMachine("Windows 2000 Server")

Set objNetwork = objVS.FindVirtualNetwork("Internal Network")
Set colNetworkAdapters = objVM.NetworkAdapters
For Each objNetworkAdapter in colNetworkAdapters
errReturn = objNetworkAdapter.AttachToVirtualNetwork(objNetwork)
Next

Zowel deze koppeling als het aanmaken van de netwerken waar we aan koppelen kunnen we allemaal scripten.


Virtual server bied een beperkte vorm van ondersteuning voor Windows Management Instrumentation en dan vooral gericht op performance informatie. Het is mogelijk om van een virtuele machine CPU gebruik, geheugen toewijzing, heartbeats en I/O informatie uit te lezen. Het WMI deel is een van de minder goed gedocumenteerde onderdelen van Virtual server en helaas ook relatief beperkt. Het kan echter nog steeds van nut zijn om bepaalde informatie boven water te halen en te integreren met management applicaties.

Een van de zaken die uit de GUI niet echt duidelijk is betreft het geheugen gebruik. Zoals het proces overzicht laat zien in bijgaande illustratie is er geen sprake van veel geheugengebruik. Onderin in de afbeelding verraad de commit charge echter dat er wel degelijk sprake is van fors geheugengebruik.

De kern van het probleem zit hem in de werking van virtual server. Het geheugen wordt verdeeld door een kernel driver waardoor het in taskmanager niet duidelijk is wat nu eigenlijk geheugen in gebruik heeft. Met behulp van het volgende script kunnen we daar wel achter komen, we kunnen hiermee het virtual server proces vragen om de gevraagde informatie. Hierbij krijgen we niet alleen terug wat is ingesteld aan geheugengebruik in de interface van virtual server maar ook het extra geheugen wat in gebruik is door de virtuele randapparatuur.
Virtual server heeft in de WMI namespace zijn eigen provider die gelocaliseerd is onder root\vm\virtualserver. Onderstaand script maakt daarom als eerste contact met deze namespace. Vervolgens worden alle virtuele machines opgevraagd met het select commando. WMI gebruikt een SQL achtige taal waardoor we net kunnen doen alsof we met een database praten. Select * from virtualmachine geeft daarmee een collectie terug van alle virtuele machines die actief zijn. Met een for each commando kunnen we daar vervolgens doorheen gaan en per virtuele machine uitlezen hoeveel geheugen is gereserveerd. Hierna is het een kwestie van de waardes optellen om erachter te komen hoeveel geheugen nu daadwerkelijk in gebruik is.

Dim strComputer, objWMIService, colVMs, vm, memtotaal,Spacestring
Spacestring=" "

memtotaal = 0
strComputer = "."
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\vm\virtualserver")
Set colVMs = objWMIService.ExecQuery( _
"SELECT * FROM VirtualMachine",,48)
wscript.echo "Overzicht geheugen gebruik virtuele machines:"
For Each vm in colVMs
Wscript.Echo vm.name & left(spacestring,30-len(vm.name)) & ": " & vm.PhysicalMemoryAllocated / 1048576
memtotaal = memtotaal + vm.PhysicalMemoryAllocated
Next

Wscript.Echo "-----------------------------------"
Wscript.Echo "Alle virtual machines samen : " & memtotaal / 1048576 & " MB (" & memtotaal & " bytes)"


Met de voorbeelden in het voorgaande deel heeft u wellicht een goede indruk gekregen hoe een en ander werkt. Door de eerdere voorbeelden met elkaar te combineren kunnen we het beheer van virtual server verder automatiseren. Het is bijvoorbeeld mogelijk om geheel automatisch een virtuele machine te creëren en op te starten. Als we zorgen dat een en ander goed is voorbereid kunnen we er daarmee ook voor zorgen dat de opgestarte virtuele machine zichzelf gaat installeren. Zover gaan we in dit voorbeeld niet, we volstaan ermee de Windows 2003 CD op te starten. De nu volgende scriptcode voert dit geheel automatisch uit:

Set objVS = CreateObject("VirtualServer.Application")
Set objVM = objVS.CreateVirtualMachine("ITBeheer","f:\VM\ITBeheer")
objVM.Memory = 512
Set objVhd = objVS.CreateDynamicVirtualHardDisk("f:\VM\Itbeheer\itbeheer01", 8192)
objVhd.WaitForCompletion(5000)
Set objVMHardDiskConn = objVM.AddHardDiskConnection("f:\VM\Itbeheer\itbeheer01.vhd", 0, 0, 0)
set objVMDVDROM = objVM.AddDVDROMDrive(0, 1, 0)
Set objVNColl = objVS.VirtualNetworks
Set collNICs = objVM.NetworkAdapters
collNICs(1).AttachToVirtualNetwork(objVNColl.Item(1))
Set collDVDs = objVM.DVDROMDrives
collDVDs(1).AttachImage "C:\iso\en_win_srv_2003_r2_standard_vl_cd1.iso"
objVM.StartUp()


In dit voorbeeld doorlopen we een aantal stappen. Als eerste maken we een nieuwe virtuele machine aan en geven aan waar op de schijf deze moet worden aangemaakt. Vervolgens stellen we deze in op 512 MB in plaats van de standaard waarde van 64, dat is immers veel te weinig om een virtuele machine goed te laten functioneren het is wel van belang dat de host waar de virtuele machines op draaien dit geheugen beschikbaar heeft anders werkt het natuurlijk niet.
De daarop volgende stap is het creëren van een virtuele harddisk. We maken hier gewoon een dynamische harddisk maar we kunnen ook voor een andere variant kiezen. De codering aan het eind van het commando bepalen welk bustype we gebruiken en waar de disk precies is aangesloten, het is weliswaar allemaal virtueel maar het besturingssysteem verwacht uiteindelijk die informatie en daarom moeten we dat ook netjes instellen. We geven de nieuwe disk een grootte van 8192 MB. Het maken van een disk kost eventjes wat tijd, daarom wachten we een tijdje om virtual server de gelegenheid te geven de actie te volbrengen.
Nadat dit is gelukt kunnen we de harddisk koppelen aan de machine. We koppelen er ook een DVDROM bij zodat we later in het script er ook een image van een Windows 2003 CD aan kunnen koppelen. Als netwerk voegen we een adapter toe die gekoppeld is aan het eerste virtuele netwerk. Aannemende dat dit gekoppelend is aan een actieve netwerk verbinding kunnen we daarmee communiceren anders moeten we een ander net werk kiezen. De laatste stap is het daadwerkelijk starten van de virtuele machine zodat we hem kunnen gebruiken. Een script als dit is bruikbaar als onderdeel van een inrichtingsprocedure van virtual server of wellicht als onderdeel van een bewakingssysteem wat in staat is om automatisch capaciteit toe te voegen.


Tot slot
De ruimte ontbreekt om alle mogelijkheden die er zijn te laten zien maar hopelijk heeft u een indruk gekregen van wat er allemaal kan. In principe zijn de mogelijkheden eindeloos voor een slimme scripter, toepassingen als server provisioning, backup , failover kunnen allemaal worden ondersteund door scripts.

W. Verveen is verbonden aan Ormer ICT dienstverlening als Consultant, daarnaast beheert hij Windows 2000 Wereld
E-mail: w.verveen@ormer.nl
Web: http://www.ormer.nl en http://www.win2kwereld.nl
(Dit artikel verscheen eerder in IT beheer magazine)