Datastore Evacuation with PowerCLI

Datastore Evacuation with PowerCLI

We were recently asked by our storage team to migrate all VMs off of  one array we are using and onto another.  Not being a huge fan of  planning and carrying out a move like this one virtual disk at a time, I  decided to take a stab at a datastore evacuation script.  There was  already some know-how out there, so I started poking around and found  some useful posts & threads:

http://get-admin.com/blog/how-to/vmware/powercli-evacuate-a-datastore/

http://communities.vmware.com/thread/299279/

My main issue with existing scripts that I found was that they  presumed the entire VM was on a single datastore – not the case in our  environment.  In fact, virtual disks associated with a single VM are  often on different tiers of storage for our customers.  I set out to do  write this code with that in mind, and the result is a script that  simply moves the vmdk’s that exist on one datastore to the destination,  without touching anything I didn’t ask to be moved.

Also, giving credit where it’s due, I simply took Luc Dekens’ (LucD) code snippet from the VMware Communities thread on migrating a VM’s  config files and plopped it into a function (migrateVMConfig) in my  code.  Thanks Luc!

The current iteration of the migrateDatastore function checks for two criteria before proceeding with the move:

  • The destination datastore is equal in Capacity or larger than the source
  • The Free Space on the destination is greater than or equal to the Used Space on the source

The first check can probably be removed at some point, but the second  is kind of a no-brainer – you can’t move actual used space to something  smaller than it’s current datastore unless you are also going from  thick to thin provisioned (which this script does not currently do).

I tested this script extensively in my dev environment before  proceeding with any production moves, but please let me know if any bugs  or problems crop up.  Along those lines, if you want to use this script  please do your own testing before using it in production, and always  start with one datastore at a time before progressing to large-scale  evacuations.

Usage (from the PS CLI):

.\MigrateDatastore.ps1 -VIServer "myvcenter.mydomain.com" -sourceDatastore "DS01" -destinationDatastore "DS02"

(originally posted on my blog: Get off my array! (Scripting datastore migrations with PowerCLI))

Attachments
Comments

Great script.

Thanks for sharing this.

Is it possible to update this script to allow for the modification of the virtual disk format as part of the move?  I'm wanting to migrate VMs from one datastore to another and change the format from thin to thick eager zeroed.

I believe that adding the -Inflate parameter to each of the Set-HardDisk commands (lines 83 & 87) would accomplish this:

Set-Harddisk -Harddisk $disk -Datastore $destinationDS -Inflate -Confirm:$False

Version history
Revision #:
1 of 1
Last update:
‎05-11-2011 04:58 PM
Updated by: