In my first post about this subject, I showed a script create by the PowerCLI Master @LucD. A couple of minutes later Hugo Peeters posted a comment why I did not used the object-oriented approach of Powershell. He also posted an example. So in this post I will show you the other way by using Export/Import-CliXml.
First we start with the export part. The following one-liner will export all the DRS Rules to a XML file:
# Export DRS Get-Cluster -Name "Cluster_01" | Get-DrsRule | ` Export-CliXml 'C:\scripts\drs.xml'
The XML file look like this:
<?xml version="1.0" encoding="utf-16"?> <Objs Version="1.1.0.1" xmlns="http://schemas.microsoft.com/powershell/2004/04"> <Obj RefId="0"> <TN RefId="0"> <T>VMware.VimAutomation.Client20.DrsVMAffinityRuleImpl</T> <T>System.Object</T> </TN> <ToString>VMware.VimAutomation.Client20.DrsVMAffinityRuleImpl</ToString> <Props> <S N="Name">production</S> <B N="Enabled">true</B> <S N="ClusterId">ClusterComputeResource-domain-c7</S> <B N="KeepTogether">true</B> <Obj N="VMIds" RefId="1"> <TN RefId="1"> <T>System.String[]</T> <T>System.Array</T> <T>System.Object</T> </TN> <LST> <S>VirtualMachine-vm-23</S> <S>VirtualMachine-vm-27</S> <S>VirtualMachine-vm-29</S> <S>VirtualMachine-vm-33</S> </LST> </Obj> </Props> </Obj> </Objs>
The next one-liner will import the XML file, which we earlier created with the export one-liner. After the import, the one-liner will create a DRS rule:
# Import DRS ForEach ($rule in (Import-CliXml 'C:\scripts\drs.xml')){ New-DrsRule -Cluster (Get-Cluster -Name "Cluster_01") ` -Name $rule.Name -Enabled $rule.Enabled ` -KeepTogether $rule.KeepTogether ` -VM (Get-VM -Id $rule.VmIds)}
If you want to see the DRS Rules for a cluster via the PowerCLI, You can run the following one-liner:
# DRS Rules One-Liner Get-DrsRule -Cluster (Get-Cluster -Name Cluster_01) ` | Sort Name | Select Name, @{N="Enabled";E={$_.Enabled}}, ` @{N="KeepTogether";E={$_.KeepTogether}},` @{N="Virtual Machines";E={$_.VMIds | % { Get-VM -Id $_ | ` % {$_.Name} }}}
The following output will be generated:
Name | Enabled | KeepTogether | Virtual Machines |
appliances | False | False | Nagios, vMA |
production | True | True | DC01,VC01,MC01,MAIL01 |
Before you can create a XML file with your new rules, you need to get the ID’s of the Cluster and the VM. You can get these ID’s via the following one-liner:
Get-VM | Sort Name | Select Name, ` @{N="VM ID";E={$_.Id}}, ` @{N="Cluster Name";E={Get-Cluster -VM $_}}, ` @{N="Cluster ID";E={Get-Cluster -VM $_ | % {$_.Id}}} | fl *
The output will look like this.
or you can export it to a CSV file:
Get-VM | Sort Name | Select Name, ` @{N="VM ID";E={$_.Id}}, ` @{N="Cluster Name";E={Get-Cluster -VM $_}}, ` @{N="Cluster ID";E={Get-Cluster -VM $_ | % {$_.Id}}} | ` Export-CSV -NoTypeInformation "D:\scripts\ps\vmids.csv"
Now you have to create a XML file. You can use a file, you created with the export DRS one-liner and change the following lines:
When you’re done with the XML file, you can run the Import DRS one-liner to import your new Rules. When you open the Cluster properties you will see that the new rule is added: