#################################################################################################### # MoveVMinBulk.ps1 # # v01 September 2012 by Kévin KISOKA - Personal Website : http://www.it-deployment.fr/ # # Usage : # Menu action : # # Select options 1 or 2 to execute LVM and option 3 to abort operation , Default option is set # to Safely exit the script without taking any action on your running environment. # # - Only the VMs running on Cluster Node or Full Cluster are moved . # - The script go through Powershell Fail Over Cluster module to get VMs and migrates them to # another Node . # - Remember Network & Hardware perfomance decreases when migrating concurrently large number of VMs. # - To calculate how many possible concurrent live migration are possible in your environment do: # # Number of nodes\2 # # # # #####################################################################################################
[System.Console]::ForegroundColor = [System.ConsoleColor]::White clear-host
write-host write-host Script for Moving VMs in bulk write-host Usage Informations : Inputs = SourceServer,targetserver,cluster group `r -foregroundcolor:Yellow write-host write-host Please choose one of the following: -foregroundcolor:Green write-host write-host '1) Move All Started VMs on single Node to another node' write-host '2) Move All Started VMs on All The Cluster to another node Take care of target Hostperfomances' write-host '3) Exit the program'
$menu = Read-Host "Select an option [1-3]" write-host "Usage Informations : Inputs = SourceServer,targetserver,cluster group.`r"
-foregroundcolor:Yellow
switch ($menu) {
1{ # Inputs
$source = read-host What is source Host NodeName $destination = read-host What is destination Host NodeName $cluster = read-host What is ClusterGroup Name
# import the commands from clustering module
import-module FailoverClusters
# Get all of the VMs currently hosted on the source server
$vmssorted = Get-ClusterGroup -cluster $cluster| ? {$_.OwnerNode -like $source} | ?{ $_ | Get-ClusterResource | ?{
$_.ResourceType -like "Virtual Machine" } }
# Get Current states of VMs
$vmssortedstate = $vmssorted.state
# Move all imported VMs if they are in running state
foreach ($vm in $vmssorted) { if ($vmssortedstate -eq "Online")
{ write-host Number of VMs to move : ($vm).Count write-host Moving VMs ******************************************* -foregroundcolor:green Get-Cluster $cluster | Move-ClusterVirtualMachineRole -Name $vm -node $destination -Wait 30 }
Elseif ($vmssortedstate -ne "Online")
{ Write-host Migration of All VMs Aborted ... `r -foregroundcolor:Yellow Move-ClusterVirtualMachineRole "$vm" -Cancel } } }
2{ # Inputs
# Get All of the VMs hosted on all cluster Group
$vmsall = Get-ClusterGroup | ?{ $_ | Get-ClusterResource | ?{ $_.ResourceType -like "Virtual Machine" } }
$vmsallstate = $vmsall.state
foreach ($vm in $vmsall) { if ($vmsallstate -eq "Online")
{ write-host Number of VMs to move : ($vm).Count write-host Moving VMs ******************************************* -foregroundcolor:green Get-Cluster $cluster | Move-ClusterVirtualMachineRole -Name $vm -node $destination -wait 30 }
Elseif ($vmsallstate -ne "Online")
{ Write-host "Migration of All VMs Aborted ... `r" -foregroundcolor:Yellow Move-ClusterVirtualMachineRole "$vm" -Cancel } } }
3{
# Getting Out of the script
exit
}
default{
# Getting Out of the script like option 3
Write-host Press Enter key to confirm exit -foregroundcolor:Yellow -nonewline exit } }
FZB edited Original. Comment: fixed small typo in the description part of the script