VM zwischen Hyper V Clustern migrieren

Hier noch ein kleines PowerShell Script, um virtuelle Maschinen ohne Downtime von einem Hyper V Cluster in ein anderes / neues Cluster per „Shared Nothing Live Migration“ zu verschieben.

  1. Das Script sollte zum größten Teil selbsterklärend sein. 🙂 Es werden zuerst die entsprechenden (sprechenden) Variabeln deklariert bevor der Versuch gestartet wird, die VM mit dem Namen „CTXSF01“ im alten Cluster „cluster01“ auszulesen (Get-VM).
  2. Wenn das von Erfolg gekrönt war, wird im alten Cluster die Clustergruppe mit der hochverfügbaren Rolle der VM entfernt (Remove-ClusterGroup).
  3. Jetzt erfolgt die eigentliche „Shared Nothing Live Migration“ auf den neuen Host im neuen Cluster (Move-VM).
  4. Danach wird geprüft, ob die Verzeichnisse, wo die VM gespeichert war, leer sind. Sind die Ordner leer, so wird aufgeräumt.
  5. Der letzte Schritt besteht jetzt darin, die virtuelle Maschine im neuen Cluster als Clusterrolle bzw. als Clusterrolle hinzuzufügen (Add-ClusterVirtualMachineRole).
  6. Am Ende wird nur eine Fehlermeldung ausgegeben, sollte einer der Schritte auf die Nase gefallen sein (about Try Catch (Finally)).
# VM aus einem Hyper V Cluster in ein neues / anderes verschieben
$ErrorActionpreference = "Stop"

$VMName = "CTXSF01"
$OldCluster = "cluster01"
$NewCluster = "cluster02"
$DestHost = "CLU02HV01"
$DestCSV = "CLU02SAN001"
$DestPath = $("C:\ClusterStorage\" + $DestCSV + "\VM\" + $VMName)
$Check = $true

try{
    $VM = Get-VM -ComputerName $OldCluster -Name $VMName
} catch{
    $ErrorMessage = $_.Exception.Message
    $Check = $false
}

if($VM -and $Check){
    try{
        Remove-ClusterGroup -Cluster $OldCluster -VMId $VM.VMId -RemoveResources -Confirm:$false -Force
    } catch{
        $ErrorMessage = $_.Exception.Message
        $Check = $false
    }
    if($Check){
        try{
            Move-VM -ComputerName $VM.ComputerName -Name $VMName -IncludeStorage -DestinationHost $DestHost -DestinationStoragePath $DestPath
        } catch{
            $ErrorMessage = $_.Exception.Message
            $Check = $false
        }
        $VMSourcePath = $("\\" + $VM.ComputerName + "\" + $VM.Path.Replace(":","$"))
        foreach($Folder in $(Get-ChildItem -Path $VMSourcePath -Recurse)){
            if(!(Test-Path -Path $($Folder.FullName + "\*"))){
                Remove-Item -Path $Folder.FullName
            } else{
                Write-Host "Bitte $($Folder.FullName) prüfen!" -ForegroundColor Red
            }
        }
        if(!(Test-Path -Path $($VMSourcePath + "\*"))){
            Remove-Item -Path $VMSourcePath
        } else{
            Write-Host "Bitte $VMSourcePath prüfen!" -ForegroundColor Red
            Start-Process -FilePath $($env:windir + "\explorer.exe") -ArgumentList $VMSourcePath
        }
    }
    if($Check){
        try{
            Add-ClusterVirtualMachineRole -Cluster $NewCluster -VMName $VM.Name
        } catch{
            $ErrorMessage = $_.Exception.Message
            $check = $false
        }
    }
}
if(!($Check)){
    Write-Host "Es ist folgender Fehler aufgetreten:"
    Write-Host `t"$ErrorMessage"
}

Die gesuchte Lösung noch nicht gefunden oder benötigen Sie Hilfe bei anderen Themen aus meinem Blog? Nehmen Sie gerne Kontakt mit mir bzw. meinem Unternehmen Jan Mischo IT auf. Ich freue mich auf Ihre Anfrage: https://janmischo.it/kontakt/


+49 2801 7004300

info@janmischo.it


Beitrag veröffentlicht

in

, ,

von

Kommentare

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.