Wanneer Windows Server 8 of Windows 8 Client Beta uit is, wil ik natuurlijk net als jullie zo snel mogelijk starten met het testen van dit fantastische nieuwe OS met al zijn nieuwe features. En zoals ik al benadrukte in de Windows 8 Knowledge Talks zal Powershell een groot deel van de manageability van de server gaan bepalen en zul je voor steeds minder zaken de GUI (kunnen) gaan gebruiken. De laatste dagen ben ik bezig geweest om een Powershell script te maken waarmee op basis van wensen van de gebruiker (jij dus), een virtual machine wordt aangemaakt.

Wanneer Windows Server 8 of Windows 8 Client Beta uit is, wil ik natuurlijk net als jullie zo snel mogelijk starten met het testen van dit fantastische nieuwe OS met al zijn nieuwe features. En zoals ik al benadrukte in de Windows 8 Knowledge Talks zal Powershell een groot deel van de manageability van de server gaan bepalen en zul je voor steeds minder zaken de GUI (kunnen) gaan gebruiken. De laatste dagen ben ik bezig geweest om een Powershell script te maken waarmee op basis van wensen van de gebruiker (jij dus), een virtual machine wordt aangemaakt.
Ik heb voor het gemak gebruik gemaakt van scripts gebaseerd op de eerdere Hyper-V Powershell Management Library van James O’Neill die je ook al kunt gebruiken in combinatie met Windows Server 2008 (R2 SP1).
Wel was het voor mij een voorwaarde dat de virtuele harde schijven in het nieuwe .vhdx formaat zouden worden aangemaakt, zodat ik niet meer gelimiteerd zou zijn door een maximale grootte van 2TB, en de hdd wellicht in de toekomst zou kunnen sizen naar 16TB(!!!). Het grootste gedeelte van het script is gemaakt met en gecontroleerd binnen de vernieuwde Windows Powershell ISE . Laten we eerst eens kijken naar de vernieuwde ISE in Windows (Server) 8.
Hyper-V met Powershell v3
Het eerste wat direct opvalt is het grote veld aan de rechterzijde. Wanneer je het selectievenster op 'Hyper-V' zet, worden alleen alle relevante cmdlets getoond voor Hyper-V. Een hele noemenswaardige verbetering in mijn ogen! In sommige gevallen is het slechts een nuance-verschil met de command-lets die eerder door James O’Neill zijn ontwikkeld, maar mocht je hier net als ik gebruik van hebben gemaakt, zul je toch even je scripts moeten controleren of alles nog naar behoren werkt. Wellicht moet je hier en daar een commando aanpassen naar de nieuwe, native cmdlets binnen Windows 8.
De code
Hieronder zal ik stap voor stap behandelen wat het script doet. We beginnen met het toestaan van powershell scripts. Dit doen we met:
Hyper-V met Powershell v3
Vervolgens willen we iets gaan doen met Hyper-V, aangezien ik dit script normaal gesproken run vanuit een 'gewone' powershell box, heb ik mezelf aangewend toch even de Hyper-V module te laden. Dit doe je via:
Hyper-V met Powershell v3
Hierna begint het script. Voordat je het gaat gebruiken, staan er 2 instellingen van de VM hard in het script gedefinieerd, namelijk de locatie van de VM’s (de vmstore) en aan welk virtuele netwerk (ook wel bekend als Virtual Switch) de virtual machine hangt. Dit geef je aan in de gemarkeerde regels hieronder:
Hyper-V met Powershell v3
Nadat we een aantal variabelen hebben aangemaakt, voor de naam van de virtual machine en dergelijke, creeëren we een aantal invoervelden. Hierin kun je de waardes voor de variablen invullen en dus de machine aanpassen naar jouw smaak.
Hyper-V met Powershell v3
Wanneer 'alle' userinput is gedaan gaat eindelijk het script voor ons werken. We gaan een VM aanmaken, gebruik makend van de userinput, met het aantal processors en geheugen zoals we hebben ingegeven. Bij de netwerkadapter zie je dat ik heb gekozen voor een Legacy adapter. Dat heb ik gedaan in verband met de PXE boot die ik nodig heb om te booten vanaf mijn WDS server waardoor de machine automatisch wordt voorzien van de juiste image.
Hyper-V met Powershell v3
Maar we hebben er nog geen harde schijf inzitten. Dat klopt, dat komt namelijk nu aan bod.
Hyper-V met Powershell v3
Wanneer je met een 'normaal' Powershell commando een vhdx aanmaakt, dan accepteert hij de waarde 40GB bijvoorbeeld. Dit is me binnen dit script echter (nog) niet gelukt. Wanneer ik de syntax hiervoor kloppend heb, zal ik direct dit blog bijwerken. Tot die tijd zul je voor een harde schijf met een grootte van 40GB (helaas) nog 40000000000 moeten ingeven (binnen dit script).
Daarna volgt een check of hij inderdaad is aangemaakt, en bij een akkoord hierop (True) wordt de vhdx aan de virtuele machine gekoppeld.
Hyper-V met Powershell v3
Dan hebben we alles gedaan om de VM te maken. Wanneer hij start zal hij primair booten vanaf de Legacy netwerkkaart om via PXE een image te krijgen. Maar als kers op de spreekwoordelijke taart (of appelmoes) heb ik er nog een klein dingetje bijgemaakt om de VM te starten en er naartoe te connecten via een console sessie.
Hyper-V met Powershell v3
Dan heb je het hele plaatje; je hebt vanaf scratch een VM gemaakt met de door jou gewenste specificaties. Hij is gestart naar jouw wds server aan het booten via PXE en je ziet de desktop. Applaus! Hoe kan het er dan uitzien in de praktijk? Als volgt:
Hyper-V met Powershell v3
Stap 1: Het script starten.
Hyper-V met Powershell v3
Stap 2: Waarde ingeven in het 'naamveld'.
Hyper-V met Powershell v3
Stap 3: Waarde ingeven in het 'Grootte van de vhdx-file' veld.
Hyper-V met Powershell v3
Stap 4: Geheugen toewijzen aan de VM.
Hyper-V met Powershell v3
Stap 5: Aantal processoren toewijzen aan de VM.
Hyper-V met Powershell v3
Stap 6: De VM is gemaakt. Wil je de VM starten en naar de desktop verbinden?
Hyper-V met Powershell v3
VM draait, boot van PXE en het script geeft een 'samenvatting' van het commando.
Hyper-V met Powershell v3
Nakijken van waardes in VM settings.
Nogmaals, deze is getest met de Developer Preview van Windows 8 Server en zal dus niet zomaar werken op eerdere/andere OS-en. Sterker nog, ik zal hem direct na het uitkomen van Windows 8 Server in de Beta uitproberen en in dit blog posten of hij daar ook werkt.
Heb ik er een overload aan code inzitten? Waarschijnlijk.. Is dit een handig scriptje? Zeker wel! Heb je verbeteringen of aanvullingen? Laat het me weten!