Kategorien
Hyper-V PowerShell Windows Server

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"
}

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.

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