首页 > 解决方案 > 如何从非集群节点远程捕获集群信息

问题描述

几天来我一直在努力解决这个问题,我只是想不出最好的方法。我有一个脚本,我收集一堆数据并将其输出到一个 html 文件(使用 PSWriteHTML 模块,这是最后的 New-HTMLTable 的来源)。

随着时间的推移,我将脚本拼凑在一起,这样我就可以一次从多个服务器收集数据,而且在大多数情况下,一切都很好。由于我已将数据添加到脚本以收集新信息,因此有一些部分我无法远程工作。我知道零碎的方法给我留下了一些冗余代码,但我只是想在我重新编写它以清理它之前让它一切正常,所以我为它的当前状态道歉。

当我从 Windows 集群中的服务器运行脚本时,以下代码效果很好,但我希望任何服务器都可以运行,不一定是集群节点。

这是本节的原始代码:

try
{
    $ClusterIPInfo = Invoke-command -computer $Computer {
        Get-Cluster | Get-ClusterResource | %{
            $_ | select Name,
                        @{ Name = "Address"; Expression = { $_ | Get-ClusterParameter -Name Address -ErrorAction SilentlyContinue | select -ExpandProperty Value } },
                        @{ Name = "SubnetMask"; Expression = { $_ | Get-ClusterParameter -Name SubnetMask -ErrorAction SilentlyContinue | select -ExpandProperty Value } }
        }
    } | Select -Property * -ExcludeProperty PSComputerName, RunSpaceID, PSShowComputerName
    
    $ClusterResourceInfo = Invoke-command -computer $Computer {
        Get-ClusterResource | Select Cluster, Name, State, ResourceType, OwnerGroup, OwnerNode, ID, IsCoreResource, IsNetworkClassResource, IsStorageClassResource | Sort-Object -Property OwnerGroup, Name
    } | Select -Property * -ExcludeProperty PSComputerName, RunSpaceID, PSShowComputerName
    
    $ResourceInfo = @()
    
    
    foreach ($rec in $ClusterResourceInfo)
    {
        $Owner = (Get-ClusterResource | Sort-Object -Property OwnerGroup, Name | Get-ClusterOwnerNode | %{
                $_ | select @{ Name = "Name"; Expression = { $_.ClusterObject } },
                            @{ Name = "PossibleOwners"; Expression = { $_.OwnerNodes } }
            } | Where { $_.Name -eq $rec.Name }).PossibleOwners
        
        $Dependency = (Get-ClusterResource | Sort-Object -Property OwnerGroup, Name | Get-ClusterResourceDependency | %{
                $_ | select @{ Name = "Name"; Expression = { $_.Resource } },
                            @{ Name = "Dependency"; Expression = { $_ | Select-Object -ExpandProperty "DependencyExpression" } }
                
            } | Where { $_.Name -eq $rec.Name }).Dependency
        
        $address = ($ClusterIPInfo | Where { $_.Name -eq $rec.Name }).Address
        $subnetmask = ($ClusterIPInfo | Where { $_.Name -eq $rec.Name }).SubnetMask
        
        
        $recObj = New-Object PSObject
        
        $recObj | Add-Member NoteProperty -Name "Cluster" -Value $rec.Cluster
        $recObj | Add-Member NoteProperty -Name "Name" -Value $rec.Name
        $recObj | Add-Member NoteProperty -Name "State" -Value $rec.State
        $recObj | Add-Member NoteProperty -Name "Resource Type" -Value $rec.ResourceType
        $recObj | Add-Member NoteProperty -Name "Owner Group" -Value $rec.OwnerGroup
        $recObj | Add-Member NoteProperty -Name "Owner Node" -Value $rec.OwnerNode
        $recObj | Add-Member NoteProperty -Name "Possible Owners" -Value $Owner
        $recObj | Add-Member NoteProperty -Name "Dependency" -Value $Dependency
        $recObj | Add-Member NoteProperty -Name "IP Address" -Value $address
        $recObj | Add-Member NoteProperty -Name "Subnet Mask" -Value $subnetmask
        $recObj | Add-Member NoteProperty -Name "Is Core Resource" -Value $rec.IsCoreResource
        $recObj | Add-Member NoteProperty -Name "Is Network Resource" -Value $rec.IsNetworkClassResource
        $recObj | Add-Member NoteProperty -Name "Is Storage Resource" -Value $rec.IsStorageClassResource
        
        
        $ResourceInfo += $recObj
    }
    
    New-HTMLTable -DataTable $ResourceInfo -HideFooter -HideButtons -DisableSearch

无法远程正常工作的部分是 Dependency 和 PossibleOwners。我知道它不起作用的原因是因为当运行脚本的服务器不是集群节点时,它无法识别 Foreach 循环 Get-ClusterResource 下的命令。但我只是不知道如何让这些从 Foreach 循环中正确传递,但仍然使用来自 $ClusterResourceInfo 的信息。

我已经重写了一百种不同的方式,即使用基本上一个大的 Get-Cluster 变量(无法获取它来捕获 Dependency/PossOwners,始终为 $null)创建一个 Invoke-command,拆分 Dependency 和PossOwners 到他们自己单独的 Invoke-Command (我能做到的最好是显示 System.Object [],或者当我确实显示它时,它捕获所有对象的所有依赖项并显示在每一行而不是拆分它正确)。

我已经尝试了所有我能想到或在网上找到的方法,但就是无法让它在远程正常工作。

这是上面的原始代码输出的方式(这是我想要的,但我只想修复它以便它可以远程工作):

输出

我非常希望有一些才华或指导让我走上正轨。我尝试了很多方法,但从来没有完全得到它需要的地方,所以任何帮助都是非常感谢和欢迎的。谢谢。

标签: powershellpowershell-remoting

解决方案


我可以建议几件事。

  1. “Get-ClusterResource” cmdlet 失败,因为它未安装在服务器上。您可以尝试使用 Import-Module 加载故障转移群集模块,如果它失败(在非群集节点上),您可以使用以下 PowerShell cmd 添加 Windows PowerShell 功能的故障转移群集模块:Add-WindowsFeature RSAT-集群-PowerShell

  2. 您可以尝试使用 WMI 连接到托管资源的远程集群节点?您有足够的资源信息可以编写过滤的 WMI 查询。


推荐阅读