Netz-Weise Logo

Weisheiten - der Netz-Weise Blog

Hier finden Sie Tipps und Tricks für vor, während und nach der Schulung.
8 Minuten Lesezeit (1619 Worte)

Hyper-V VM per Powershell anlegen und konfigurieren

Das Anlegen einer virtuellen Maschine in Hyper-V geht sehr einfach. Hier zeige ich ein kleines Beispiel, dass eine Generation-2 VM anlegt, konfiguriert und ein ISO-Image zum Starten bereitstellt. 

Zuerst erzeuge ich ein Credential-Objekt, um das ISO-File für die VM aus einer Freigabe zu kopieren. Die Methode PSCredential der Klasse PSAutomation erzeugt uns dafür ein Credential-Objekt, das 2 Parameter benötigt: Den Benutzernamen und das Kennwort.

 

Als nächstes wird ein Ordner für das Iso angelegt:

$isoPath = mkdir D:\iso -Force

Nun wird der Pfad für das Iso zusammengestellt und überprüft, ob der Pfad erreichbar ist. 

$SourceServer = "\\nwfs1"
$Share = "Sourcen"

Try { $Networkshare = Join-Path -Path $sourceServer -Childpath $Share -resolve -EA Stop }
Catch { Throw "Die Freigabe kann nicht gefunden werden" }

Und der ganze Spaß noch mal für den Dateinamen

$IsoFileName = 'CentOS-6.8-x86_64-bin-DVD1.iso'
Try { $IsoSourcePath = Join-Path -Path $NetworkShare -Childpath $IsoFileName -resolve -EA Stop }
Catch { Throw "Der Dateipfad kann nicht gefunden werden" }

Den Lokalen Pfad für das Iso-File zusammenstellen:

$IsoLocalPath = (join-path $isoPath.FullName $IsoFileName)

Mit Start-Bitstransfer wird das Iso-File kopiert. Start-Bitstransfer hat den Vorteil, dass mit dem Parameter Credential ein Benutzer übergeben werden kann, mit dem der Download ausgeführt wird. Außerdem kann der Download besser gesteuert werden. 

Start-BitsTransfer -Credential $adminCred -Source $IsoSourcePath -Destination $IsoLocalPath

Nun legen wir den Zielpfad für die VM fest:

$vmPath = "d:\hyper-V\CentOS\"

Und legen Ihn an, indem wir das auch gleich das Unterverzeichnis für die VHD-Datei anlegen:

$vhdpath = mkdir -Path (Join-Path $vmPath "virtual hard disks") -Force

In unserem speziellen Fall gehen wir davon aus, dass es einen Switch mit Netzwerkzugriff gibt (Typ Extern). Um Fehler zu vermeiden, falls mehr als ein externer Switch exisitiert, wählen wir mit Select-Object genau einen Switch aus. 

$switch = Get-VMSwitch -SwitchType External | Select-Object -First 1

Als nächstes wird die virtuelle Maschine angelegt. 

$vmName =  "CentOS"
$RAM = 2GB
$vhdSize = 60GB
$vm = new-vm -Name $vmName -MemoryStartupBytes $Ram -BootDevice CD -NewVHDPath (join-path $vhdpath system.vhdx) -SwitchName $switch.Name -Generation 2 -NewVHDSizeBytes $vhdSize

Der VM werden 2 virtuelle Prozessoren spendiert. Das geht nicht mit New-Vm

set-vm -ProcessorCount 2 -VM $vm

Da die VM eine Linux-VM werden soll, schalten wir Secure Boot aus. 

Set-VMFirmware -EnableSecureBoot Off -VM $vm

Und als letztes verbinden wird das ISO-File mit dem virtuellen DVD-Laufwerk

Set-VMDvdDrive -VMName $vm.VMName -Path $IsoLocalPath

In eine Funktion gegossen sieht das Ganze dann so aus:

#requires -Version 2 -Modules BitsTransfer, Hyper-V

function New-CustomVM
{
    <#
            .SYNOPSIS
            Legt eine VM an.
            .DESCRIPTION
            Legt eine VM an. Kann ein ISO-File aus dem Netzwerk kopieren und verbinden.
            Es werden eine Reihe von Default-Parametern hinterlegt. Bitte passen Sie die
            Defaults für Ihre Umgebung an.
            .EXAMPLE
            New-CustomVM
            Legt eine VM an, ohne ein ISO-File einzubinden
            .EXAMPLE
            New-CustomVM -CopyIso -UserName 'Hans' -Password 'Pwd' -SourceServer 'Server1' -Share 'Daten' -IsoFileName 'Win2012.iso' -VMName 'VMServer'
            Legt eine VM mit dem Namen VMServer an und kopiert ein ISO-File lokal in den Ordner c:\iso.
    #>

    [CmdletBinding()]
    param
    (
        [Parameter(Mandatory = $false, Position = 0)]
        [Object]
        $password = (ConvertTo-SecureString -String 'Passw0rd' -AsPlainText -Force),      

        [Parameter(Mandatory = $false, Position = 1)]
        [System.String]
        $Username = 'Admin',       

        [Parameter(Mandatory = $false, Position = 2)]
        [System.String]
        $SourceServer = '\\nwfs1',       

        [Parameter(Mandatory = $false, Position = 3)]
        [System.String]
        $Share = 'Sourcen',       

        [Parameter(Mandatory = $false, Position = 4)]
        [System.String]
        $vmPath = 'd:\hyper-V\CentOS\',       

        [Parameter(Mandatory = $false, Position = 5)]
        [System.String]
        $IsoFileName = 'CentOS-6.8-x86_64-bin-DVD1.iso',       

        [Parameter(Mandatory = $false, Position = 6)]
        [System.String]
        $vmName = 'CentOS',      

        [Parameter(Mandatory = $false, Position = 7)]
        [System.Int64]
        $RAM = 2GB,       

        [Parameter(Mandatory = $false, Position = 8)]
        [System.Int64]
        $vhdSize = 60GB, 

        [Parameter(Mandatory = $false, Position = 9)]
        [System.String]
        $LocalIsoPath = 'C:\Iso',

        [Parameter()]
        [Switch]
        $CopyIso
    )   

    If ($CopyIso)
    {
        $adminCred = (New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList ($UserName, $password))
        Try
        {
            $Networkshare = Join-Path -Path $SourceServer -ChildPath $Share -Resolve -EA Stop
        }
        Catch
        {
            Throw 'Die Freigabe {0} kann nicht gefunden werden' -f (Join-Path -Path $SourceServer -ChildPath $Share)
        }    
        Try
        {
            $IsoSourcePath = Join-Path -Path $Networkshare -ChildPath $IsoFileName -Resolve -EA Stop
        }
        Catch
        {
            Throw 'Der Dateipfad {0} kann nicht gefunden werden' -f (Join-Path -Path $Networkshare -ChildPath $IsoFileName)
        }
        Try
        {
            $isoPath = mkdir $LocalIsoPath
        }
        Catch
        {
            Throw "Der Pfad $LocalIsoPath konnte nicht angelegt werden"
            $_.Exception
        }

        $IsoLocalPath = (Join-Path -Path $isoPath.FullName -ChildPath $IsoFileName)
        Start-BitsTransfer -Credential $adminCred -Source $IsoSourcePath -Destination $IsoLocalPath
    } 

    $vhdpath = mkdir -Path (Join-Path -Path $vmPath -ChildPath 'virtual hard disks') -Force
    $switch = Get-VMSwitch -SwitchType External | Select-Object -First 1
    $vm = New-VM -Name $vmName -MemoryStartupBytes $RAM -BootDevice CD -NewVHDPath (Join-Path -Path $vhdpath -ChildPath system.vhdx) -SwitchName $switch.Name -Generation 2 -NewVHDSizeBytes $vhdSize
    Set-VM -ProcessorCount 2 -VM $vm
    Set-VMFirmware -EnableSecureBoot Off -VM $vm
    If ($CopyIso)
    {
        Set-VMDvdDrive -VMName $vm.VMName -Path $IsoLocalPath
    }
}

 

 

 

 

#requires -Version 2 -Modules BitsTransfer, Hyper-V

function New-CustomVM

{

    <#

            .SYNOPSIS

            Legt eine VM an.

            .DESCRIPTION

            Legt eine VM an. Kann ein ISO-File aus dem Netzwerk kopieren und verbinden.

            Es werden eine Reihe von Default-Parametern hinterlegt. Bitte passen Sie die

            Defaults für Ihre Umgebung an.

            .EXAMPLE

            New-CustomVM

            Legt eine VM an, ohne ein ISO-File einzubinden

            .EXAMPLE

            New-CustomVM -CopyIso -UserName 'Hans' -Password 'Pwd' -SourceServer 'Server1' -Share 'Daten' -IsoFileName 'Win2012.iso' -VMName 'VMServer'

            Legt eine VM mit dem Namen VMServer an und kopiert ein ISO-File lokal in den Ordner c:\iso.

    #>

    [CmdletBinding()]

    param

    (

        [Parameter(Mandatory = $false, Position = 0)]

        [Object]

        $password = (ConvertTo-SecureString -String 'Passw0rd' -AsPlainText -Force),

       

        [Parameter(Mandatory = $false, Position = 1)]

        [System.String]

        $Username = 'Admin',

       

        [Parameter(Mandatory = $false, Position = 2)]

        [System.String]

        $SourceServer = '\\nwfs1',

       

        [Parameter(Mandatory = $false, Position = 3)]

        [System.String]

        $Share = 'Sourcen',

       

        [Parameter(Mandatory = $false, Position = 4)]

        [System.String]

        $vmPath = 'd:\hyper-V\CentOS\',

       

        [Parameter(Mandatory = $false, Position = 5)]

        [System.String]

        $IsoFileName = 'CentOS-6.8-x86_64-bin-DVD1.iso',

       

        [Parameter(Mandatory = $false, Position = 6)]

        [System.String]

        $vmName = 'CentOS',

       

        [Parameter(Mandatory = $false, Position = 7)]

        [System.Int64]

        $RAM = 2GB,

       

        [Parameter(Mandatory = $false, Position = 8)]

        [System.Int64]

        $vhdSize = 60GB,

 

        [Parameter(Mandatory = $false, Position = 9)]

        [System.String]

        $LocalIsoPath = 'C:\Iso',

 

        [Parameter()]

        [Switch]

        $CopyIso

 

    )

   

    If ($CopyIso)

    {

        $adminCred = (New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList ($UserName, $password))

        Try

        {

            $Networkshare = Join-Path -Path $SourceServer -ChildPath $Share -Resolve -EA Stop

        }

        Catch

        {

            Throw 'Die Freigabe {0} kann nicht gefunden werden' -f (Join-Path -Path $SourceServer -ChildPath $Share)

        }

      

        Try

        {

            $IsoSourcePath = Join-Path -Path $Networkshare -ChildPath $IsoFileName -Resolve -EA Stop

        }

        Catch

        {

            Throw 'Der Dateipfad {0} kann nicht gefunden werden' -f (Join-Path -Path $Networkshare -ChildPath $IsoFileName)

        }

   

        Try

        {

            $isoPath = mkdir $LocalIsoPath

        }

        Catch

        {

            Throw "Der Pfad $LocalIsoPath konnte nicht angelegt werden"

            $_.Exception

        }

 

        $IsoLocalPath = (Join-Path -Path $isoPath.FullName -ChildPath $IsoFileName)

        Start-BitsTransfer -Credential $adminCred -Source $IsoSourcePath -Destination $IsoLocalPath

    }

 

    $vhdpath = mkdir -Path (Join-Path -Path $vmPath -ChildPath 'virtual hard disks') -Force

    $switch = Get-VMSwitch -SwitchType External | Select-Object -First 1

    $vm = New-VM -Name $vmName -MemoryStartupBytes $RAM -BootDevice CD -NewVHDPath (Join-Path -Path $vhdpath -ChildPath system.vhdx) -SwitchName $switch.Name -Generation 2 -NewVHDSizeBytes $vhdSize

    Set-VM -ProcessorCount 2 -VM $vm

    Set-VMFirmware -EnableSecureBoot Off -VM $vm

    If ($CopyIso)

    {

        Set-VMDvdDrive -VMName $vm.VMName -Path $IsoLocalPath

    }

}

Root-Zertifikat aus dem Zertifikats-Store entferne...
SQL-Server Management Studio kostenlos herunterlad...

Ähnliche Beiträge

 

Kommentare

Derzeit gibt es keine Kommentare. Schreibe den ersten Kommentar!
Bereits registriert? Hier einloggen
Samstag, 23. November 2024

Sicherheitscode (Captcha)