Src/Private/Get-AbrVSphereClusterDRS.ps1
|
<#
.SYNOPSIS Private function to report vSphere DRS cluster configuration. .DESCRIPTION Generates a PScriboDocument section detailing the vSphere DRS configuration for a given cluster, including DRS settings, Additional Options, Power Management, Advanced Options, DRS Cluster Groups, DRS VM/Host Rules, DRS Rules, VM Overrides, and Permissions subsections. .NOTES Version: 2.0.0 Author: Tim Carman Twitter: @tpcarman Github: tpcarman .INPUTS None. Uses variables from the parent scope: $Cluster, $ClusterDrsConfig, $ClusterConfigEx, $VMLookup, $InfoLevel, $Report, $Healthcheck, $vCenter, $reportTranslate .OUTPUTS None. Writes PScriboDocument content directly. #> function Get-AbrVSphereClusterDRS { [CmdletBinding()] param () begin { $LocalizedData = $reportTranslate.GetAbrVSphereClusterDRS } process { Try { if ($Cluster.DrsEnabled) { Write-PScriboMessage -Message $LocalizedData.Collecting Section -Style Heading4 $LocalizedData.SectionHeading { Paragraph ($LocalizedData.ParagraphSummary -f $Cluster) BlankLine #region vSphere DRS Cluster Specifications $DrsCluster = [PSCustomObject]@{ $LocalizedData.DRS = if ($Cluster.DrsEnabled) { $LocalizedData.Enabled } else { $LocalizedData.Disabled } } $MemberProps = @{ 'InputObject' = $DrsCluster 'MemberType' = 'NoteProperty' } Switch ($Cluster.DrsAutomationLevel) { 'Manual' { Add-Member @MemberProps -Name $LocalizedData.AutomationLevel -Value $LocalizedData.Manual } 'PartiallyAutomated' { Add-Member @MemberProps -Name $LocalizedData.AutomationLevel -Value $LocalizedData.PartiallyAutomated } 'FullyAutomated' { Add-Member @MemberProps -Name $LocalizedData.AutomationLevel -Value $LocalizedData.FullyAutomated } } Add-Member @MemberProps -Name $LocalizedData.MigrationThreshold -Value $ClusterDrsConfig.VmotionRate if ($ClusterConfigEx.ProactiveDrsConfig.Enabled) { Add-Member @MemberProps -Name $LocalizedData.PredictiveDRS -Value $LocalizedData.Enabled } else { Add-Member @MemberProps -Name $LocalizedData.PredictiveDRS -Value $LocalizedData.Disabled } if ($ClusterDrsConfig.EnableVmBehaviorOverrides) { Add-Member @MemberProps -Name $LocalizedData.VirtualMachineAutomation -Value $LocalizedData.Enabled } else { Add-Member @MemberProps -Name $LocalizedData.VirtualMachineAutomation -Value $LocalizedData.Disabled } if ($Healthcheck.Cluster.DrsEnabled) { $DrsCluster | Where-Object { $_.$($LocalizedData.DRS) -eq $LocalizedData.Disabled } | Set-Style -Style Warning -Property $LocalizedData.DRS } if ($Healthcheck.Cluster.DrsAutomationLevelFullyAuto) { $DrsCluster | Where-Object { $_.$($LocalizedData.AutomationLevel) -ne $LocalizedData.FullyAutomated } | Set-Style -Style Warning -Property $LocalizedData.AutomationLevel } $TableParams = @{ Name = ($LocalizedData.TableDRSConfig -f $Cluster) List = $true ColumnWidths = 40, 60 } if ($Report.ShowTableCaptions) { $TableParams['Caption'] = "- $($TableParams.Name)" } $DrsCluster | Table @TableParams #endregion vSphere DRS Cluster Specifications #region DRS Cluster Additional Options $DrsAdvancedSettings = $Cluster | Get-AdvancedSetting | Where-Object { $_.Type -eq 'ClusterDRS' } if ($DrsAdvancedSettings) { Section -Style NOTOCHeading5 -ExcludeFromTOC $LocalizedData.AdditionalOptions { $DrsAdditionalOptions = [PSCustomObject] @{ $LocalizedData.VMDistribution = Switch (($DrsAdvancedSettings | Where-Object { $_.name -eq 'TryBalanceVmsPerHost' }).Value) { '1' { $LocalizedData.Enabled } $null { $LocalizedData.Disabled } } $LocalizedData.MemoryMetricForLB = Switch (($DrsAdvancedSettings | Where-Object { $_.name -eq 'PercentIdleMBInMemDemand' }).Value) { '100' { $LocalizedData.Enabled } $null { $LocalizedData.Disabled } } $LocalizedData.CPUOverCommitment = if (($DrsAdvancedSettings | Where-Object { $_.name -eq 'MaxVcpusPerCore' }).Value) { $LocalizedData.Enabled } else { $LocalizedData.Disabled } } $MemberProps = @{ 'InputObject' = $DrsAdditionalOptions 'MemberType' = 'NoteProperty' } if (($DrsAdvancedSettings | Where-Object { $_.name -eq 'MaxVcpusPerCore' }).Value) { Add-Member @MemberProps -Name $LocalizedData.OverCommitmentRatio -Value "$(($DrsAdvancedSettings | Where-Object {$_.name -eq 'MaxVcpusPerCore'}).Value):1 (vCPU:pCPU)" } if (($DrsAdvancedSettings | Where-Object { $_.name -eq 'MaxVcpusPerClusterPct' }).Value) { Add-Member @MemberProps -Name $LocalizedData.OverCommitmentRatioCluster -Value "$(($DrsAdvancedSettings | Where-Object {$_.name -eq 'MaxVcpusPerClusterPct'}).Value) %" } $TableParams = @{ Name = ($LocalizedData.TableDRSAdditional -f $Cluster) List = $true ColumnWidths = 40, 60 } if ($Report.ShowTableCaptions) { $TableParams['Caption'] = "- $($TableParams.Name)" } $DrsAdditionalOptions | Table @TableParams } } #endregion DRS Cluster Additional Options #region vSphere DPM Configuration if ($ClusterConfigEx.DpmConfigInfo.Enabled) { Section -Style NOTOCHeading5 -ExcludeFromTOC $LocalizedData.PowerManagement { $DpmConfig = [PSCustomObject]@{ $LocalizedData.DPM = if ($ClusterConfigEx.DpmConfigInfo.Enabled) { $LocalizedData.Enabled } else { $LocalizedData.Disabled } } $MemberProps = @{ 'InputObject' = $DpmConfig 'MemberType' = 'NoteProperty' } Switch ($ClusterConfigEx.DpmConfigInfo.DefaultDpmBehavior) { 'manual' { Add-Member @MemberProps -Name $LocalizedData.DPMAutomationLevel -Value $LocalizedData.Manual } 'automated' { Add-Member @MemberProps -Name $LocalizedData.DPMAutomationLevel -Value $LocalizedData.Automated } } if ($ClusterConfigEx.DpmConfigInfo.DefaultDpmBehavior -eq 'automated') { Add-Member @MemberProps -Name $LocalizedData.DPMThreshold -Value $ClusterConfigEx.DpmConfigInfo.HostPowerActionRate } $TableParams = @{ Name = ($LocalizedData.TableDPM -f $Cluster) List = $true ColumnWidths = 40, 60 } if ($Report.ShowTableCaptions) { $TableParams['Caption'] = "- $($TableParams.Name)" } $DpmConfig | Table @TableParams } } #endregion vSphere DPM Configuration #region vSphere DRS Cluster Advanced Options $DrsAdvancedSettings = $Cluster | Get-AdvancedSetting | Where-Object { $_.Type -eq 'ClusterDRS' } if ($DrsAdvancedSettings) { Section -Style NOTOCHeading5 -ExcludeFromTOC $LocalizedData.AdvancedOptions { $DrsAdvancedOptions = @() foreach ($DrsAdvancedSetting in $DrsAdvancedSettings) { $DrsAdvancedOption = [PSCustomObject]@{ $LocalizedData.Key = $DrsAdvancedSetting.Name $LocalizedData.Value = $DrsAdvancedSetting.Value } $DrsAdvancedOptions += $DrsAdvancedOption } $TableParams = @{ Name = ($LocalizedData.TableDRSAdvanced -f $Cluster) ColumnWidths = 50, 50 } if ($Report.ShowTableCaptions) { $TableParams['Caption'] = "- $($TableParams.Name)" } $DrsAdvancedOptions | Sort-Object $LocalizedData.Key | Table @TableParams } } #endregion vSphere DRS Cluster Advanced Options #region vSphere DRS Cluster Group $DrsClusterGroups = $Cluster | Get-DrsClusterGroup if ($DrsClusterGroups) { #region vSphere DRS Cluster Group Section Section -Style NOTOCHeading5 -ExcludeFromTOC $LocalizedData.DRSClusterGroups { $DrsGroups = foreach ($DrsClusterGroup in $DrsClusterGroups) { [PSCustomObject]@{ $LocalizedData.GroupName = $DrsClusterGroup.Name $LocalizedData.GroupType = Switch ($DrsClusterGroup.GroupType) { 'VMGroup' { $LocalizedData.VMGroupType } 'VMHostGroup' { $LocalizedData.VMHostGroupType } default { $DrsClusterGroup.GroupType } } $LocalizedData.GroupMembers = if (($DrsClusterGroup.Member).Count -gt 0) { ($DrsClusterGroup.Member | Sort-Object) -join ', ' } else { $LocalizedData.None } } } $TableParams = @{ Name = ($LocalizedData.TableDRSGroups -f $Cluster) ColumnWidths = 42, 16, 42 } if ($Report.ShowTableCaptions) { $TableParams['Caption'] = "- $($TableParams.Name)" } $DrsGroups | Sort-Object $LocalizedData.GroupName, $LocalizedData.GroupType | Table @TableParams } #endregion vSphere DRS Cluster Group Section #region vSphere DRS Cluster VM/Host Rules $DrsVMHostRules = $Cluster | Get-DrsVMHostRule if ($DrsVMHostRules) { Section -Style NOTOCHeading5 -ExcludeFromTOC $LocalizedData.DRSVMHostRules { $DrsVMHostRuleDetail = foreach ($DrsVMHostRule in $DrsVMHostRules) { [PSCustomObject]@{ $LocalizedData.RuleName = $DrsVMHostRule.Name $LocalizedData.RuleType = Switch ($DrsVMHostRule.Type) { 'MustRunOn' { $LocalizedData.MustRunOn } 'ShouldRunOn' { $LocalizedData.ShouldRunOn } 'MustNotRunOn' { $LocalizedData.MustNotRunOn } 'ShouldNotRunOn' { $LocalizedData.ShouldNotRunOn } default { $DrsVMHostRule.Type } } $LocalizedData.RuleEnabled = if ($DrsVMHostRule.Enabled) { $LocalizedData.Yes } else { $LocalizedData.No } $LocalizedData.VMGroup = $DrsVMHostRule.VMGroup.Name $LocalizedData.HostGroup = $DrsVMHostRule.VMHostGroup.Name } } if ($Healthcheck.Cluster.DrsVMHostRules) { $DrsVMHostRuleDetail | Where-Object { $_.$($LocalizedData.RuleEnabled) -eq $LocalizedData.No } | Set-Style -Style Warning -Property $LocalizedData.RuleEnabled } $TableParams = @{ Name = ($LocalizedData.TableDRSVMHostRules -f $Cluster) ColumnWidths = 22, 22, 12, 22, 22 } if ($Report.ShowTableCaptions) { $TableParams['Caption'] = "- $($TableParams.Name)" } $DrsVMHostRuleDetail | Sort-Object $LocalizedData.RuleName | Table @TableParams } } #endregion vSphere DRS Cluster VM/Host Rules #region vSphere DRS Cluster Rules $DrsRules = $Cluster | Get-DrsRule if ($DrsRules) { #region vSphere DRS Cluster Rules Section Section -Style NOTOCHeading5 -ExcludeFromTOC $LocalizedData.DRSRules { $DrsRuleDetail = foreach ($DrsRule in $DrsRules) { [PSCustomObject]@{ $LocalizedData.RuleName = $DrsRule.Name $LocalizedData.RuleType = Switch ($DrsRule.Type) { 'VMAffinity' { $LocalizedData.VMAffinity } 'VMAntiAffinity' { $LocalizedData.VMAntiAffinity } } $LocalizedData.RuleEnabled = if ($DrsRule.Enabled) { $LocalizedData.Yes } else { $LocalizedData.No } $LocalizedData.Mandatory = $DrsRule.Mandatory $LocalizedData.RuleVMs = ($DrsRule.VMIds | ForEach-Object { (Get-View -Id $_).name }) -join ', ' } if ($Healthcheck.Cluster.DrsRules) { $DrsRuleDetail | Where-Object { $_.$($LocalizedData.RuleEnabled) -eq $LocalizedData.No } | Set-Style -Style Warning -Property $LocalizedData.RuleEnabled } } $TableParams = @{ Name = ($LocalizedData.TableDRSRules -f $Cluster) ColumnWidths = 26, 25, 12, 12, 25 } if ($Report.ShowTableCaptions) { $TableParams['Caption'] = "- $($TableParams.Name)" } $DrsRuleDetail | Sort-Object $LocalizedData.RuleType | Table @TableParams } #endregion vSphere DRS Cluster Rules Section } #endregion vSphere DRS Cluster Rules } #endregion vSphere DRS Cluster Group #region Cluster VM Overrides $DrsVmOverrides = $Cluster.ExtensionData.Configuration.DrsVmConfig $DasVmOverrides = $Cluster.ExtensionData.Configuration.DasVmConfig if ($DrsVmOverrides -or $DasVmOverrides) { #region VM Overrides Section Section -Style NOTOCHeading4 -ExcludeFromTOC $LocalizedData.VMOverrides { #region vSphere DRS VM Overrides if ($DrsVmOverrides) { Section -Style NOTOCHeading5 -ExcludeFromTOC $LocalizedData.DRS { $DrsVmOverrideDetails = foreach ($DrsVmOverride in $DrsVmOverrides) { [PSCustomObject]@{ $LocalizedData.VirtualMachine = $VMLookup."$($DrsVmOverride.Key.Type)-$($DrsVmOverride.Key.Value)" $LocalizedData.DRSAutomationLevel = if ($DrsVmOverride.Enabled -eq $false) { $LocalizedData.Disabled } else { Switch ($DrsVmOverride.Behavior) { 'manual' { $LocalizedData.Manual } 'partiallyAutomated' { $LocalizedData.PartiallyAutomated } 'fullyAutomated' { $LocalizedData.FullyAutomated } default { $DrsVmOverride.Behavior } } } } } $TableParams = @{ Name = ($LocalizedData.TableDRSVMOverrides -f $Cluster) ColumnWidths = 50, 50 } if ($Report.ShowTableCaptions) { $TableParams['Caption'] = "- $($TableParams.Name)" } $DrsVmOverrideDetails | Sort-Object $LocalizedData.VirtualMachine | Table @TableParams } } #endregion vSphere DRS VM Overrides #region vSphere HA VM Overrides if ($DasVmOverrides) { Section -Style NOTOCHeading5 -ExcludeFromTOC $LocalizedData.SectionVSphereHA { $DasVmOverrideDetails = foreach ($DasVmOverride in $DasVmOverrides) { [PSCustomObject]@{ $LocalizedData.VirtualMachine = $VMLookup."$($DasVmOverride.Key.Type)-$($DasVmOverride.Key.Value)" $LocalizedData.HARestartPriority = Switch ($DasVmOverride.DasSettings.RestartPriority) { $null { '--' } 'lowest' { $LocalizedData.Lowest } 'low' { $LocalizedData.Low } 'medium' { $LocalizedData.Medium } 'high' { $LocalizedData.High } 'highest' { $LocalizedData.Highest } 'disabled' { $LocalizedData.Disabled } 'clusterRestartPriority' { $LocalizedData.ClusterDefault } } $LocalizedData.VMDependencyTimeout = Switch ($DasVmOverride.DasSettings.RestartPriorityTimeout) { $null { '--' } '-1' { $LocalizedData.Disabled } default { $LocalizedData.Seconds -f $DasVmOverride.DasSettings.RestartPriorityTimeout } } $LocalizedData.HAIsolationResponse = Switch ($DasVmOverride.DasSettings.IsolationResponse) { $null { '--' } 'none' { $LocalizedData.Disabled } 'powerOff' { $LocalizedData.PowerOffAndRestart } 'shutdown' { $LocalizedData.ShutdownAndRestartVMs } 'clusterIsolationResponse' { $LocalizedData.ClusterDefault } } } } $TableParams = @{ Name = ($LocalizedData.TableHAVMOverrides -f $Cluster) ColumnWidths = 25, 25, 25, 25 } if ($Report.ShowTableCaptions) { $TableParams['Caption'] = "- $($TableParams.Name)" } $DasVmOverrideDetails | Sort-Object $LocalizedData.VirtualMachine | Table @TableParams #region PDL/APD Protection Settings Section Section -Style NOTOCHeading5 -ExcludeFromTOC $LocalizedData.SectionPDLAPD { $DasVmOverridePdlApd = foreach ($DasVmOverride in $DasVmOverrides) { $DasVmComponentProtection = $DasVmOverride.DasSettings.VmComponentProtectionSettings [PSCustomObject]@{ $LocalizedData.VirtualMachine = $VMLookup."$($DasVmOverride.Key.Type)-$($DasVmOverride.Key.Value)" $LocalizedData.PDLFailureResponse = Switch ($DasVmComponentProtection.VmStorageProtectionForPDL) { $null { '--' } 'clusterDefault' { $LocalizedData.ClusterDefault } 'warning' { $LocalizedData.IssueEvents } 'restartAggressive' { $LocalizedData.PowerOffAndRestart } 'disabled' { $LocalizedData.Disabled } } $LocalizedData.APDFailureResponse = Switch ($DasVmComponentProtection.VmStorageProtectionForAPD) { $null { '--' } 'clusterDefault' { $LocalizedData.ClusterDefault } 'warning' { $LocalizedData.IssueEvents } 'restartConservative' { $LocalizedData.PowerOffRestartConservative } 'restartAggressive' { $LocalizedData.PowerOffRestartAggressive } 'disabled' { $LocalizedData.Disabled } } $LocalizedData.VMFailoverDelay = Switch ($DasVmComponentProtection.VmTerminateDelayForAPDSec) { $null { '--' } '-1' { $LocalizedData.Disabled } default { $LocalizedData.Minutes -f (($DasVmComponentProtection.VmTerminateDelayForAPDSec)/60) } } $LocalizedData.ResponseRecovery = Switch ($DasVmComponentProtection.VmReactionOnAPDCleared) { $null { '--' } 'reset' { $LocalizedData.ResetVMs } 'disabled' { $LocalizedData.Disabled } 'useClusterDefault' { $LocalizedData.ClusterDefault } } } } $TableParams = @{ Name = ($LocalizedData.TableHAPDLAPD -f $Cluster) ColumnWidths = 20, 20, 20, 20, 20 } if ($Report.ShowTableCaptions) { $TableParams['Caption'] = "- $($TableParams.Name)" } $DasVmOverridePdlApd | Sort-Object $LocalizedData.VirtualMachine | Table @TableParams } #endregion PDL/APD Protection Settings Section #region VM Monitoring Section Section -Style NOTOCHeading5 -ExcludeFromTOC $LocalizedData.VMMonitoring { $DasVmOverrideVmMonitoring = foreach ($DasVmOverride in $DasVmOverrides) { $DasVmMonitoring = $DasVmOverride.DasSettings.VmToolsMonitoringSettings [PSCustomObject]@{ $LocalizedData.VirtualMachine = $VMLookup."$($DasVmOverride.Key.Type)-$($DasVmOverride.Key.Value)" $LocalizedData.VMMonitoring = Switch ($DasVmMonitoring.VmMonitoring) { $null { '--' } 'vmMonitoringDisabled' { $LocalizedData.Disabled } 'vmMonitoringOnly' { $LocalizedData.VMMonitoringOnly } 'vmAndAppMonitoring' { $LocalizedData.VMAndAppMonitoring } } $LocalizedData.VMMonitoringFailureInterval = Switch ($DasVmMonitoring.FailureInterval) { $null { '--' } default { if ($DasVmMonitoring.VmMonitoring -eq 'vmMonitoringDisabled') { '--' } else { $LocalizedData.Seconds -f $DasVmMonitoring.FailureInterval } } } $LocalizedData.VMMonitoringMinUpTime = Switch ($DasVmMonitoring.MinUptime) { $null { '--' } default { if ($DasVmMonitoring.VmMonitoring -eq 'vmMonitoringDisabled') { '--' } else { $LocalizedData.Seconds -f $DasVmMonitoring.MinUptime } } } $LocalizedData.VMMonitoringMaxFailures = Switch ($DasVmMonitoring.MaxFailures) { $null { '--' } default { if ($DasVmMonitoring.VmMonitoring -eq 'vmMonitoringDisabled') { '--' } else { $DasVmMonitoring.MaxFailures } } } $LocalizedData.VMMonitoringMaxFailureWindow = Switch ($DasVmMonitoring.MaxFailureWindow) { $null { '--' } '-1' { $LocalizedData.NoWindow } default { if ($DasVmMonitoring.VmMonitoring -eq 'vmMonitoringDisabled') { '--' } else { $LocalizedData.WithinHours -f (($DasVmMonitoring.MaxFailureWindow)/3600) } } } } } $TableParams = @{ Name = ($LocalizedData.TableHAVMMonitoring -f $Cluster) ColumnWidths = 40, 12, 12, 12, 12, 12 } if ($Report.ShowTableCaptions) { $TableParams['Caption'] = "- $($TableParams.Name)" } $DasVmOverrideVmMonitoring | Sort-Object $LocalizedData.VirtualMachine | Table @TableParams } #endregion VM Monitoring Section } } #endregion vSphere HA VM Overrides } #endregion VM Overrides Section } #endregion Cluster VM Overrides #region Cluster Permissions Section -Style NOTOCHeading4 -ExcludeFromTOC $LocalizedData.Permissions { Paragraph ($LocalizedData.ParagraphPermissions -f $Cluster) BlankLine $VIPermissions = $Cluster | Get-VIPermission $ClusterVIPermissions = foreach ($VIPermission in $VIPermissions) { [PSCustomObject]@{ $LocalizedData.UserGroup = $VIPermission.Principal $LocalizedData.IsGroup = if ($VIPermission.IsGroup) { $LocalizedData.Yes } else { $LocalizedData.No } $LocalizedData.Role = $VIPermission.Role $LocalizedData.DefinedIn = $VIPermission.Entity.Name $LocalizedData.Propagate = if ($VIPermission.Propagate) { $LocalizedData.Yes } else { $LocalizedData.No } } } $TableParams = @{ Name = ($LocalizedData.TablePermissions -f $Cluster) ColumnWidths = 42, 12, 20, 14, 12 } if ($Report.ShowTableCaptions) { $TableParams['Caption'] = "- $($TableParams.Name)" } $ClusterVIPermissions | Sort-Object $LocalizedData.UserGroup | Table @TableParams } #endregion Cluster Permissions } } } Catch { Write-PScriboMessage -IsWarning $($_.Exception.Message) } } end {} } |