I have put this function together for the purpose of documenting cluster settings. Used it a fair bit to gather information on environments that I have come accross that have not been well documented. In can be used as is but I’m fiddling around with it to produce some further information so likely to be updated in the near future.
Hopefully of some use – connect to vCenter from POWERCLI and run the function.
get-clusterdetails
function Get-ClusterDetails {
Param(
[string]$Clustername = '*'
)
<#
.Synopsis
The Get-ClusterDetails retrieves Information regarding Configuration of ESXi Clusters dor Documentation
.EXAMPLE
Get-ClusterDetails
.EXAMPLE
Get-ClusterDetails -Clustername "Production_Cluster" | out-gridview
.EXAMPLE
$clusters = Get-ClusterDetails -Clustername "Cluster1","Cluster2"
.NOTES
Chris Tucker
@CT_Technical
#>
$myCluster = Get-Cluster $Clustername
$GridObjects =
$ClusterAudit = @()
foreach ($cluster in $mycluster) {
$GetCluster = get-cluster $cluster.name
$ClusterDetails = New-Object PSObject
$ClusterDetails | Add-Member -name "DataCenter" -Value (Get-DataCenter -Cluster $cluster.name).name -MemberType NoteProperty
$ClusterDetails | Add-Member -name "ClusterName" -Value $cluster.name -MemberType NoteProperty
$ClusterDetails | Add-Member -name "ESXi Hosts" -Value $cluster.ExtensionData.summary.numhosts -MemberType NoteProperty
$ClusterDetails | Add-Member -name "HA Enabled" -Value $cluster.HAEnabled -MemberType Noteproperty
##CPU info
$CpuInfo = Get-View -ViewType HostSystem -Property Hardware.CpuInfo -SearchRoot $cluster.Id | Select @{n="NumCpuSockets"; e={$_.Hardware.CpuInfo.NumCpuPackages}}, @{n="NumCpuCores"; e={$_.Hardware.CpuInfo.NumCpuCores}}, @{n="NumCpuThreads"; e={$_.Hardware.CpuInfo.NumCpuThreads}} | Measure-Object -Sum NumCpuSockets,NumCpuCores,NumCpuThreads
$ClusterDetails | Add-Member -name "NumCPUs" -Value ($CpuInfo | ?{$_.Property -eq "NumCpuSockets"}).Sum -MemberType NoteProperty
$ClusterDetails | Add-Member -name "NumCPUCores" -Value ($CpuInfo | ?{$_.Property -eq "NumCpuCores"}).Sum -MemberType NoteProperty
##RAM info
$RAMinfo = ($GetCluster | Get-VMHost) | Select @{n="MemoryTotalGB"; e={$_.MemoryTotalGB}} | Measure-Object -Sum MemoryTotalGB
$RoundNumber = [math]::Round(($RAMInfo | ?{$_.Property -eq "MemoryTotalGB"}).Sum)
$ClusterDetails | Add-Member -name "TotalRAM GB" -Value $RoundNumber -MemberType NoteProperty
##EVC
$EVCmode = $cluster.EVCMode
if (!$EVCmode) {
$ClusterDetails | Add-Member -name "EVC Mode" -Value "Disabled" -MemberType Noteproperty }
else {
$ClusterDetails | Add-Member -name "EVC Mode" -Value $cluster.EVCMode -MemberType Noteproperty }
##HA
If ($cluster.HAFailoverLevel -eq 1) {$HAenabled = "Enabled"} else {$HAenabled = $null}
$ClusterDetails | Add-Member -name "HA" -Value $HAenabled -MemberType Noteproperty
$ClusterDetails | Add-Member -name "Host Failures Tolerated" -Value $cluster.ExtensionData.Configuration.DasConfig.AdmissionControlPolicy.FailOverLevel -MemberType Noteproperty
$ClusterDetails | Add-Member -name "Default Restart Priority" -Value $cluster.HArestartpriority -MemberType Noteproperty
$ClusterDetails | Add-Member -name "VM Monitoring" -Value $cluster.ExtensionData.Configuration.DasConfig.VmMonitoring -MemberType Noteproperty
##Heartbeat Sensitivity
$HMSensitivity = @(
@{
Name = 'Low'
MinUptime = 480
FailureInterval = 120
MaxFailureWindow = 604800
},
@{
Name = 'Medium'
MinUptime = 240
FailureInterval = 60
MaxFailureWindow = 86400
},
@{
Name = 'High'
MinUptime = 120
FailureInterval = 30
MaxFailureWindow = 3600
}
)
$Sensitive = $Getcluster | Select Name,
@{N='Heartbeat Monitoring Sensitivity';E={
$sensitivity = $HMSensitivity | where{$_.MinUptime -eq $GetCluster.ExtensionData.ConfigurationEx.DasConfig.DefaultVmSettings.VmToolsMonitoringSettings.MinUpTime}
$sensitivity['Name']
}}
$ClusterDetails | Add-Member -name "Heartbeat Sensitivity" -Value $sensitive.'Heartbeat Monitoring Sensitivity' -MemberType Noteproperty
##Datastore Heartbeats
$HeartBeatDS = $GetCluster | Select -Property @{Name='HeartbeatDatastore';Expression={(Get-View -Id $_.ExtensionData.Configuration.DasConfig.HeartbeatDatastore).Name}}
$ClusterDetails | Add-Member -name "Heartbeat Datastores" -Value $HeartBeatDS.HeartbeatDatastore -MemberType NoteProperty
##DRS
$ClusterDetails | Add-Member -name "DRS Status" -Value $cluster.DrsEnabled -MemberType Noteproperty
$ClusterDetails | Add-Member -name "DRS Automation" -Value $cluster.DrsAutomationLevel -MemberType Noteproperty
$ClusterDetails | Add-Member -name "Migration Threshold" -Value $cluster.ExtensionData.ConfigurationEx.DrsConfig.VmotionRate -MemberType Noteproperty
$ClusterDetails | Add-Member -name "DPM Enabled" -Value $cluster.ExtensionData.ConfigurationEx.DpmConfigInfo.Enabled -MemberType Noteproperty
##VM restart policy
$ClusterDetails | Add-Member -name "VM restart policy" -Value $null -MemberType Noteproperty
$VMs = $Cluster | get-VM | ? {$_.HARestartPriority -ne "ClusterRestartPriority"} | Select name, harestartpriority
foreach ($VM in $VMs) {
$ClusterDetails | Add-Member -name $VM.name -Value $VM.HArestartpriority -MemberType NoteProperty
}
##DRS Rules
$ClusterDetails | Add-Member -name "DRS Rules" -Value $null -MemberType Noteproperty
$DRSRules = Get-DRSVMhostRule -Cluster $Cluster.Name
$DRSRulesVMs = $DRSRules | Select Name, Enabled, Type, @{Name="VM"; Expression={ $iTemp = @(); $_.VMIds | % { $iTemp += (Get-VM -Id $_).Name }; [string]::Join(";", $iTemp) }}
$i = 1
foreach ($Rule in $DRSRules) {
$n = 0
$ClusterDetails | Add-Member -name "Rule $i" -Value $DRSRulesVMs[$n].name -MemberType NoteProperty
$ClusterDetails | Add-Member -name "Rule $i Type" -Value $DRSRulesVMs[$n].type -MemberType NoteProperty
$ClusterDetails | Add-Member -name "Rule $i Enabled?" -Value $DRSRulesVMs[$n].Enabled -MemberType NoteProperty
## $ClusterDetails | Add-Member -name "Rule $i VMs" -Value $DRSRulesVMs[$n].VM -MemberType NoteProperty
$n++
$i++
}
$ClusterAudit += $ClusterDetails
}
Write-Output $ClusterAudit
}