I was recently looking to retrieve a list of DRS rules in each cluster managed by a single vCenter server and to export the output using PowerCLI.
The script will be required to be invoked as a scheduled task and therefore we will specify two paramaters. Firstly the VI Server we will be required to establish a connection to, where by default this will use the host name and require a mandtory parameter for the output directory for exporting the output.
Param ([string] $vCenter = ([System.Net.Dns]::GetHostByName(($env:computerName))).HostName, [parameter(Mandatory=$true)][string] $Output)
Now, we will load the vSphere PowerCLI snap-in to the current powershell session and establish a connection to the VI Server.
if (-not (Get-PSSnapin VMware.VimAutomation.Core -ErrorAction SilentlyContinue)) { Add-PSSnapin VMware.VimAutomation.Core | Out-Null } Connect-VIServer $vCenter | Out-Null
Once a connection to the VI Server has been established we will retrieve all the DRS rules from each cluster and store this as a collection.
$DRSRules = Get-Cluster | Get-DrsRule
For each DRS rule returned in the collection we will retrieve the following property values and store the results in a variable to later export to a CSV file.
- Cluster Name
- DRS Name
- DRS Enabled
- DRS Type
- VM Names
In order to retrieve the VM names, we will require to retrieve the name from the retrieved VM Id, by splitting the property value and for each VM invoking the Get-VM cmdlet to retrieve the name value and then join each returned VM name to a single string.
$Results = ForEach ($DRSRule in $DRSRules) { "" | Select-Object-Property @{N="Cluster";E={(Get-View- Id $DRSRule.Cluster.Id).Name}}, @{N="Name";E={$DRSRule.Name}}, @{N="Enabled";E={$DRSRule.Enabled}}, @{N="DRS Type";E={$DRSRule.KeepTogether}}, @{N="VMs";E={$VMIds=$DRSRule.VMIds -split "," $VMs = ForEach ($VMId in $VMIds) { (Get-View -Id $VMId).Name } $VMs -join ","}} }
Finally, we will export the output to a CSV file and close the connection to the VI Server.
$Results | Export-Csv -NoTypeInformation -Path ($Output + "\" + $vCenter+ "_DRS Rules.csv") -Force Disconnect-VIServer -Server $vCenter -Confirm:$False
Hello Dean, I’m looking to write a script that collects DRS settings (enabled, fully automated, etc.) and emails when they are changed. Your commands look perfect for me. But I’m getting an error that I hope you can help me with easily:
The term ‘Select-Object-Property’ is not recognized as the name of a cmdlet, function, script file, or operable program. Check the spelling of the name, or if a path was included, verify that the path is correct and try again.
At line:3 char:32
+ “” | Select-Object-Property <<< Get-PSSnapin VMware.VimAutomation.Core
Name : VMware.VimAutomation.Core
PSVersion : 2.0
Description : This Windows PowerShell snap-in contains Windows PowerShell cmdle
ts for managing vSphere.
Can you help?
cheers
KC
LikeLike
thanks, but the answer has been given by the Mighty LucD on the VMware Forums. https://communities.vmware.com/message/2512857#2512857 seems a missing space between Select-Object and -Property was kicking my rear end! (^;
LikeLike
Another Handy script…thanks again 🙂
LikeLike
Just wanted to say thank you. Needed to get a list of DRS rules and was disappointed Get-DrsRule returns VM ID instead of VM name. Not much of a scripter myself, I went searching for help and found your page. Had to tweak the code a bit but got it working and does exactly what I needed. Thank you! Appreciate your taking the time to post this.
LikeLike
Glad to be of help…
LikeLike