Quand vous n’avez pas la chance d’avoir System Center Virtual Machine Manager pour gérer votre cluster Hyper-V, il est difficile de migrer tout les VM sur un seul hôte. En effet contrairement à SCVMM qui permet de mettre en maintenance un hôte en un seul clic, il faut migrer manuellement et unitairement toutes les VM. De plus il n’est pas possible de migrer simultanément plusieurs VM, ce qui peut devenir fastidieux en cas d’un nombre élevé de VM.
Je vous propose donc un petit script en PowerShell qui permet de mettre en maintenance un hôte en une seule commande.
Auparavant il faudra affecter une affinité par hôte à chaque VM au sein du cluster:
Puis, il suffit d’exécuter le script suivant qui dans cet exemple migre toutes les machines virtuelles du cluster HVHA qui sont en ligne sur l’hôte HV-2 vers l’hôte HV-1 :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
Import-Module FailoverClusters $content = get-clustergroup | Where-Object -FilterScript {$_.Name -notlike "cluster*"} | Where-Object -FilterScript {$_.Name -notlike "avai*"} | Where-Object -FilterScript {$_.State -like "Online"} foreach ($values in $content) { $vm = $values| Select-Object -Property Name $currentowner = $values| Select-Object -Property OwnerNode $defowner = Get-ClusterGroup $vm.name | Get-ClusterOwnerNode $currentowner = $currentowner.Ownernode $defownern=$defowner.OwnerNodes |Select-Object -Property Name if ($currentowner.name -notlike "HV-1") { Get-Cluster "HVHA" | Move-ClusterVirtualMachineRole -Name $vm.name -Node "HV-1" } } |
Après exécution toutes les VM seront sur l’hôte HV-1, permettant de mettre en maintenance l’hôte HV-1
Il suffira de faire le script équivalent pour mettre le deuxième hôte en maintenance.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
Import-Module FailoverClusters $content = get-clustergroup | Where-Object -FilterScript {$_.Name -notlike "cluster*"} | Where-Object -FilterScript {$_.Name -notlike "avai*"} | Where-Object -FilterScript {$_.State -like "Online"} foreach ($values in $content) { $vm = $values| Select-Object -Property Name $currentowner = $values| Select-Object -Property OwnerNode $defowner = Get-ClusterGroup $vm.name | Get-ClusterOwnerNode $currentowner = $currentowner.Ownernode $defownern=$defowner.OwnerNodes |Select-Object -Property Name if ($currentowner.name -notlike "HV-2") { Get-Cluster "HVHA" | Move-ClusterVirtualMachineRole -Name $vm.name -Node "HV-2" } } |
En fin de maintenance il ne reste plus qu’a repartir les VM sur leur hôte préféré avec le script suivant:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
Import-Module FailoverClusters $clust = Get-Cluster $content = get-clusterresource | Where-Object -FilterScript {$_.ResourceType -like "Virtual Machine"} | Where-Object -FilterScript {$_.State -like "Online"} foreach ($values in $content) { $vm = $values.OwnerGroup $currentowner = $values| Select-Object -Property OwnerNode $defowner = Get-ClusterGroup $vm.name | Get-ClusterOwnerNode $currentowner = $currentowner.Ownernode $defownern=$defowner.OwnerNodes |Select-Object -Property Name if ($defownern.name -notlike $currentowner.name) { Get-Cluster $clust.Name | Move-ClusterVirtualMachineRole -Name $vm.name -Node $defownern.name } } |