Powershell命令检索故障转移群集磁盘大小/可用空间



我正在使用Powershell,并试图检索物理磁盘资源的大小和可用空间。

我希望此代码在一个Windows Server 2008 R2盒子(监控服务器)上运行,并在同一域上的三个远程集群上轮询资源。其中2个群集也运行Windows Server 2008 R2,但其中一个群集运行Windows Server 2012(x64)。返回的数据将作为监控应用程序的一部分插入数据库。

目前我使用的代码是:

$clusters = "cluster1.domain.local","cluster2.domain.local","cluster3.domain.local"
foreach ( $cluster in $clusters) {
    $resources = Get-ClusterResource -Cluster $cluster | where-object {$_.ResourceType -match "Physical Disk"}
    foreach ( $resource in $resources) {
        $details = Get-ClusterResource -Cluster $cluster -Name $resource.Name | fc *
        <how to get disk size & space from $details?>
    }
}

"Get-ClusterResource|fc*"返回的数据不包括物理磁盘大小或可用空间,我不知道如何获取这些信息。返回的信息对所有集群资源都是通用的——这里可以看到一个示例(示例2)。下面的示例3几乎很有帮助,但不包括磁盘大小或可用空间。

我已经检查了这个问题,但答案使用WMI查询,当我尝试这个问题时,我会遇到各种安全和兼容性问题。如果可能的话,我更喜欢直接使用PowerShell,特别是因为监控应用程序也使用纯PowerShell来检查Exchange邮箱大小&DFS复制积压。

请注意,我并不是在尝试查询群集共享卷-它们有自己的、独立的PowerShell函数,我可以正常工作。它是专门针对物理磁盘资源的,我无法让它工作。

我知道物理磁盘是多种资源类型之一,因此通用的Get-ClusterResource命令不会返回任何特定于磁盘的信息,但我希望能调用另一个函数,传入Get-Cluster Resource的返回值,以检索磁盘空间/可用空间

如有任何协助,我们将不胜感激,谢谢

Sam


Ansgar Wiechers 的更新

  • 你的目标是什么?如前所述,创建一系列"数据收集器"powershell脚本,从需要监控的多个系统收集数据,并将这些数据注入数据库,该数据库将提供警报、保留历史记录,并通常增强我们的监控能力。我们目前的监控工具套件涵盖了我们所需的90%,但只是遗漏了一些小东西,我希望使用这种方法来纠正这些问题

  • 为什么需要物理磁盘参数而不是CSV参数?因为CSV并不是集群中使用的唯一类型的磁盘。例如,我们有一个2服务器、7实例、31卷的SQL集群。监控所有卷上的可用磁盘空间是令人印象深刻的,原因我认为是显而易见的。此监控目前是手动完成的,并且缺少历史保留

  • 哪些物理磁盘?无论我指定哪一个。理想的解决方案是能够监控任何正在使用的(即不"可用")群集磁盘资源。我不打算监视"无用"磁盘,如SQL群集上的DTC卷或Quorum卷,但如果我选择,我没有理由不能监视这些磁盘

  • 为什么要通过集群获取这些信息,而不是监视集群成员上的物理磁盘信息虽然可以通过SNMP MIB获取其中的一些信息,但获取、解释和翻译这些信息要困难得多。我可以详细介绍这一点,但这会分散人们对这个问题的关注,可以说Powershell是我的首选方法

您无法获得物理磁盘级别的可用空间信息。这种信息仅在文件系统/卷级别上可用。出于监控目的,我只需要做一个

$filter = 'DriveType=3 AND DriveLetter IS NOT NULL'
gwmi Win32_Volume -Filter $filter | select DriveLetter, Capacity, FreeSpace

在每个集群节点上。这将为您提供"常规"卷的大小和可用空间。您可以通过将主机名数组传递给-Computer选项来运行远程WMI查询。在这种情况下,我建议在输出中包含SystemName属性:

$filter = 'DriveType=3 AND DriveLetter IS NOT NULL'
$nodes  = Get-ClusterNode -Cluster $cluster `
            | ? { $_.State -eq 'up' } `
            | % { $_.Name }
gwmi Win32_Volume -Computer $nodes -Filter $filter |
    select SystemName, DriveLetter, Capacity, FreeSpace

CSV不能像那样被监控,所以他们的数据必须像这样获得:

Get-ClusterSharedVolume -Cluster $cluster `
  | select -Expand SharedVolumeInfo `
  | select FriendlyVolumeName, @{n="Capacity";e={$_.Partition.Size}},
      @{n="FreeSpace";e={$_.Partition.Size - $_.Partition.UsedSpace}}

如果你在回答我的问题时不那么屈尊俯就,我将不胜感激。我不必解决你的问题。

我知道这有点旧,但它在搜索结果中很高,但在决定从头开始写东西之前,它只处理了我搜索的部分内容。

我仍在完善这一点,并将其处理成类似于原始文章中描述的嵌套"foreach"循环的内容,但如果您查看"Volume"而不是物理磁盘(并让PowerShell为您做一些数学运算),您可以从中获得一些有用的输出。。。

Get-Volume | ft @{Expression={[math]::Round(($_.SizeRemaining / $_.Size),3)};Label="Percent Remaining";width=9}, FileSystemLabel, FileSystem, HealthStatus, Size, SizeRemaining 

或者,如果您启用了WinRM,则可以使用…对一堆Hyper-V主机远程运行WinRM。。。

invoke-command -computername $HostNameOfClusterNode -scriptblock {Get-Volume | ft @{Expression={[math]::Round(($_.SizeRemaining / $_.Size),3)};Label="Percent Remaining";width=9}, FileSystemLabel, FileSystem, HealthStatus, Size, SizeRemaining} 

最新更新