PowerShell: VM in einem Hyper-V-Cluster anlegen


Jeder kennt sicher den Aufwand bei einem Hyper-V Cluster wenn man eine neue VM erstellen möchte.

Welches SharedVolume hat am meisten freien Speicherplatz?
Welcher Node ist am wenigsten ausgelastet?
Habe ich alles standardmässig erstellt?

Aus diesem Grund habe ich hier ein Script erstellt das euch diese Arbeit abnimmt.

Ich gehe jetzt nicht auf jede Zeile ein, denn ich denke das alles gut dokumentiert ist. Wenn ihr Verbesserungen habt, lasst es mich wissen, dann kann ich es ebenfalls einbauen und auch noch was dabei lernen. 😉

#----------------------------------------------------------------------#
# Script zum erstellen einer neuen VM in einem Hyper-V-Cluster
# Überprüft welches SharedVolume am meisten Freien DiskSpace hat
# Überprüft welcher Hyper-V Node am meisten freien Arbeitsspeicher hat
# Erstellt neue VM und verschieft sie in den Hyper-V-Cluster
#
# 3 Fragen zur Erstellung einer VM: Name, HDD-Size, Memory
#
# Autor: Lars Eigeldinger
# Date: 2016-04-14
#
# Version 1.0: Release
# 2016-08-29, 1.1: Hinzufügen Virtueller Prozessoren
# 2017-02-16, 1.2: Variable für Switch und VM Generation
#
# Info: Das Script muss auf einem Hyper-V Server ausgeführt werden
#----------------------------------------------------------------------#

Import-Module FailoverClusters

#----------------#
# VM Information #
#----------------#
$VMname = Read-Host 'Wie ist der Name der neuen VM?'
[int64]$HDDSize = Read-Host 'Wie gross ist die Festplatte in GB?'
[int64]$HDDSize = $HDDSize*1024*1024*1024
[int64]$Memory = Read-Host 'Wieviel Arbeitsspeicher in GB?'
[int64]$Memory = $Memory*1024*1024*1024

#-----------#
# Variablen #
#-----------#
$DiskC = $VMname + '-C.vhdx'
$HyperVClusterDomain = 'Hyper-V.sysadmingo.local'
$PathISO = 'C:\ClusterStorage\Volume1\ISOs\WinServer2012R2_eng.ISO'
$CPU = '4'
$Switch = 'VM'
$VMGen = '2'

#----------------------------------------------------------------#
# Überprüft welches SharedVolume am meisten Freien DiskSpace hat #
#----------------------------------------------------------------#
$objs = @()
$csvs = Get-ClusterSharedVolume

foreach ( $csv in $csvs )
{
 $csvinfos = $csv | select -Property Name -ExpandProperty SharedVolumeInfo
 foreach ( $csvinfo in $csvinfos )
 {
 $obj = New-Object PSObject -Property @{
 Name = $csv.Name
 Path = $csvinfo.FriendlyVolumeName
 Size = $csvinfo.Partition.Size
 FreeSpace = $csvinfo.Partition.FreeSpace
 UsedSpace = $csvinfo.Partition.UsedSpace
 PercentFree = $csvinfo.Partition.PercentFree
 }
 $objs += $obj
 }
}

$objs | ft -auto Name,Path,@{ Label = "Size(GB)" ; Expression = { "{0:N2}" -f ($_.Size/1024/1024/1024) } },@{ Label = "FreeSpace(GB)" ; Expression = { "{0:N2}" -f ($_.FreeSpace/1024/1024/1024) } },@{ Label = "UsedSpace(GB)" ; Expression = { "{0:N2}" -f ($_.UsedSpace/1024/1024/1024) } },@{ Label = "PercentFree" ; Expression = { "{0:N2}" -f ($_.PercentFree) } } | Out-Null
$BesteDisk = $objs | sort -Property FreeSpace -Descending | select -First 1 | Select-Object path | Format-Table -HideTableHeaders | Out-String
$BesteDisk = $BesteDisk.Replace("`r`n","")
$BesteDisk = $BesteDisk.Replace(" ","")
$BesteDisk = $BesteDisk +"\"
write-host 'SharedVolume mit dem meisten Platz:'
write-host $BesteDisk -ForegroundColor Green

$PathDisk = $BesteDisk + $VMname + '\' + $DiskC
write-host $PathDisk

#----------------------------------------------------------------------#
# Überprüft welcher Hyper-V Node am meisten freien Arbeitsspeicher hat #
#----------------------------------------------------------------------#
$HyperVNodes = Get-ClusterNode -cluster $HyperVClusterDomain | Where-Object {$_.State -like "Up"} | Select Name,@{L="AvailableMemory(GB)"; E={(Get-VMHOST $_.Name).MemoryCapacity/1GB-(Get-VM -ComputerName $_.name |Measure-Object MemoryAssigned -Sum).sum/1GB}}|Sort "AvailableMemory(GB)" -Descending
$HyperVNode = $HyperVNodes | select -First 1 | Select-Object name | Format-Table -HideTableHeaders | Out-String
$HyperVNode = $HyperVNode.Replace("`r`n","")
$HyperVNode = $HyperVNode.Replace(" ","")
write-host 'Hyper-V Node mit dem meisten verfügbaren RAM:'
write-host $HyperVNode -ForegroundColor Green

#------------------------------------------------------------#
# Erstellt neue VM und verschieft sie in den Hyper-V-Cluster #
#------------------------------------------------------------#
New-PSSession -ComputerName $HyperVNode

New-VM -ComputerName $HyperVNode -Name $VMname -Generation $VMGen -MemoryStartupBytes $Memory -Path $BesteDisk -SwitchName $Switch
New-VHD -Path $PathDisk -SizeBytes $HDDSize -Dynamic
Add-VMHardDiskDrive -VMName $VMname -path $PathDisk -ComputerName $HyperVNode
Add-VMDvdDrive -VMName $VMname -ComputerName $HyperVNode
Set-VMDvdDrive -VMName $VMname -ComputerName $HyperVNode -Path $PathISO
Set-VMProcessor -VMName $VMname -ComputerName $HyperVNode -Count $CPU
Add-ClusterVirtualMachineRole -Cluster $HyperVClusterDomain -Name $VMname -VirtualMachine $VMname

Exit-PSSession

Ein Kommentar

  1. Update: Virtuelle Prozessoren wurden hinzugefügt. Standardwert wurde auf 4 gesetzt, da Updates oder sonstiges installieren kein Spass macht 😉

    Like

Schreibe einen Kommentar

Trage deine Daten unten ein oder klicke ein Icon um dich einzuloggen:

WordPress.com-Logo

Du kommentierst mit deinem WordPress.com-Konto. Abmelden /  Ändern )

Facebook-Foto

Du kommentierst mit deinem Facebook-Konto. Abmelden /  Ändern )

Verbinde mit %s