For DRS, I just needed to know the rules (affinity and anti-affinity)
Lets look at how I dumped the DRS rules (I'm obviously not the only one who has done this):
param( [Parameter(Mandatory=$true)][string] $VIserver = $(Read-Host -prompt "vCenter?") ) $vc=connect-viserver $VIserver $outfile = "rules_$($vc.name).csv" $rules = get-cluster -server $vc| Get-DrsRule $output=@() if ($rules -ne $NULL) { foreach($rule in $rules){ $line=""|select Cluster,Name,Enabled,KeepTogether,VM1,VM2 $line.cluster = (Get-View -Id $rule.ClusterId).Name $line.name = $rule.Name $line.Enabled = $rule.Enabled $line.KeepTogether = $rule.KeepTogether $line.VM1 = (get-view -id ($rule.VMIds)[0]).name $line.VM2 = (get-view -id ($rule.VMIds)[1]).name $output+=$line } } $output|export-csv -notypeinformation $outfile disconnect-viserver * -confirm:$false -force
...now, of course an import script would make this so much more useful.
param( [Parameter(Mandatory=$true)] [string] $inputfile = $(Read-Host -prompt "input file?"), [Parameter(Mandatory=$true)] $VIserver = $(Read-Host -prompt "VIserver?") ) $vc=connect-viserver $VIserver $rules=import-csv -path $inputfile if($rules -eq $NULL){throw "Could not read $inputfile"} $clusters=$rules|select cluster|sort cluster|Get-Unique -AsString|%{$_.cluster} foreach ($cluster in $clusters) { $clusterrules = $rules|?{$_.cluster -eq $cluster} $clusterobj=get-cluster $cluster foreach ($rule in $clusterrules) {new-drsrule -cluster $clusterobj -Name $rule.name -Enabled ([system.convert]::toBoolean($rule.enabled)) ` -KeepTogether ([system.convert]::toBoolean($rule.keeptogether)) -VM (get-vm $rule.vm1,$rule.vm2)} } disconnect-viserver * -confirm:$false -force
Alright, there we have it. First script dumps ALL rules for all clusters in a vCenter, while the second script creates those rules on the corresponding clusters in the new vCenter. I know I haven't gone over the cluster creation scripts yet, but I thought it was better to go over the export/import in one post, not exactly chronological, very much related.