Move VMs from an old storage array to a new using powerCLI
I have after reading a tweet written the simplest script for a SAN exchange, my script just look for the VMs associated with one datastore and storage vmotion them to an new datastore with no downtime 🙂 of course this requires Enterprise or higher in your vSphere licensing.
I have done some assumptions that there is equally many datastores provisioned in the new as the old and that no VMs have RDMs and vmdk on several datastores.
The Get-Datastore cmdlet can filter using wildcards like *c2* if your naming convension is complex and you need to find your old/new datastores objects.
For each old datastore i wait 30 minutes before starting on the next, maybe this must be set a bit higher depending on how long the storage vmotion takes and how large the datastores/vmdk´s are. Maybe we should put a sleep after starting move of each VM?! I have not yet had the pleasure testing in a large environment yet..
# Move VMs to new datastore using SVMotion
#
# Niklas Akerlund /RTS
#
# I want all old and new datastores as objects in arrays
$OldDatastores = Get-Datastore vmfs-volumes-old0*
$NewDatastores = Get-Datastore vmfs-volumes-new0*
$i = 0
# Get all VMs in each old datastore and move them
Foreach ($OldDatastore in $OldDatastores){
$VMs = Get-VM -Datastore $OldDatastore
Foreach ($VM in $VMs)
{
# Move the VM to a new datastore
$VM | Move-VM -Datastore $NewDatastores[$i] -RunAsync
}
$i++
# we want to give the SVMotions a little time before taking the next datastore
Start-Sleep 1800
}
I would recommend testing on a single datastore or a few VMs and when feeling comfortable running on all datastores..
Comments
A suggestion is removing the RunAsync switch will do the svMotion of VMs one at a time.