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.