Friday, November 23, 2012

Met PowerShell snel Hyper-V VMs uitrollen op Windows 8

Vandaag wilde ik even snel 4 virtuele servers uitrollen in Hyper-V op mijn Windows 8 werkstation. Uiteraard kan dat met PowerShell, in dit artikel een kort verslag hiervan.

Voorbereiding

Eerder heb ik al een VM voorzien van Windows Server 2012, dit moest mijn template worden. Na de basisinrichting van deze server, in mijn geval niet veel meer dan het installeren van een paar updates, heb ik deze met Sysprep voorbereid voor het klonen. Sysprep haalt alle computerspecifieke informatie weg en zorgt er voor dat je gekloonde computer start alsof hij nog niet geconfigureerd is. Meet informatie over Sysprep vind je hier: System Preparation (Sysprep) Technical Reference.

Vervolgens heb ik deze VHD op mijn SSD disk gezet. Voor mijn labservers gebruik ik nu een differencing disk die deze template-disk als basis heeft.

image

Het script

Om nu een VM te maken hebben we dus twee taken uit te voeren:

  • Maak een nieuwe differencing disk
  • Maak een VM met de net aangemaakte disk gekoppeld

Voor het samenstellen van mijn script heb ik eerst gekeken welke cmdlets er bestaan binnen de Hyper-V module:

Get-Command -Module Hyper-V

Het resultaat is een lange lijst van 164 cmdlets, waaronder de New-VM en New-VHD cmdlets. Voor meer informatie heb ik de Help-pagina geraadpleegd: Hyper-V Cmdlets in Windows PowerShell, op iedere pagina staat welke parameters de cmdlets ondersteunen. Wat rest is dan een eenvoudig scriptje maken die de twee bovenstaande taken uitvoert en een dit kan herhalen.

Het resultaat:

1..4 | % {

### Construct VM name and VHD path
$VMname = "Lab$_"
$VHDpath = "D:\Hyper-V VHD\$VMname\$VMname.vhdx"

### Create new VHD
New-VHD –ParentPath "C:\VM Templates\_Server 2012\_Server 2012.vhdx" –Path $VHDpath -Differencing

### Create new VM
New-VM -Name $VMname -MemoryStartupBytes 800MB -BootDevice IDE -Path "D:\Hyper-V configs\" -SwitchName "Extern over bedraad" -VHDpath
$VHDpath
}

Om het script uit te voeren moet PowerShell uitgevoerd worden als Administrator. Vervolgens worden de VM’s aangemaakt:

image

Tot besluit

Natuurlijk is dit script slechts een Proof of Concept: de functionaliteit is beperkt, de namen van directories en de switch staan vast, er zit geen error handling in en ook degelijke logging ontbreekt. Maar waar et om gaat is dat je Hyper-V ook vanuit Windows 8 volledig kunt besturen met PowerShell. Nog een reden waarom ik VMware Workstation niet meer nodig heb.

1 comment:

Jeff Wouters said...

Hoi Jetze,
Gezien het op Windows8 is, dus je PowerShell 3.0 tot je beschikking hebt, zou je gebruik kunnen maken van Workflow waardoor het aanzienlijk sneller gaat. Met 4 VMs is de winst minimaal maar hoe meer VMs, hoe meer tijd je wint met Workflow:

workflow New-VirtualMachines {
$VMs = 1..4
$VMs | foreach -parallel ($VM in $VMs)
{
$VMname = "Lab$_"
$VHDpath = "D:\Hyper-V VHD\$VMname\$VMname.vhdx"
New-VM -Name VM$VM -MemoryStartupBytes 512MB –NewVHDPath "D:\Hyper-V\Virtual Hard Disks\VM$VM.vhdx" -NewVHDSizeBytes 15GB
New-VM -Name $VMname -MemoryStartupBytes 800MB -BootDevice IDE -Path "D:\Hyper-V configs\" -SwitchName "Extern over bedraad" -VHDpath $VHDpath
}
}

Dit is quick 'n dirty, je zou eigenlijk het pad moeten opbreken en buiten de loop plaatsen waardoor het pad niet bij iedere loop opnieuw berekend zal worden :-)

Greetsz,
Jeff