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

时间:2013-07-22 03:04:11

标签: powershell windows-clustering

我正在使用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 *”返回的数据不包括物理磁盘大小或可用空间,我无法弄清楚如何获取此信息。返回的信息对所有群集资源都是通用的 - 可以看到一个示例here(示例2)。下面的示例3几乎是有用的,但不包括磁盘大小或可用空间。

我已经检查了this question,但答案是使用WMI查询,当我尝试这个时,我遇到了各种各样的安全性和兼容性问题。如果可能的话,我宁愿坚持使用简单的PowerShell,特别是因为监控应用程序也使用纯PowerShell来检查Exchange邮箱的大小和范围。 DFS复制积压工作。

请注意我不是在尝试查询群集共享卷 - 它们有自己独立的PowerShell功能,而且我的工作没有问题。它专门用于物理磁盘资源,我无法让它工作。

我理解物理磁盘是众多资源类型中的一种,因此通用的Get-ClusterResource命令不会返回任何特定于磁盘的内容,但我希望能够调用另一个函数,传入Get-ClusterResource的返回值,检索磁盘空间/可用空间

感谢任何帮助,谢谢

萨姆


Ansgar Wiechers的更新

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

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

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

  • ,我没有理由不监视它们。
  • 为什么要通过群集获取此信息,而不是监视群集成员上的物理磁盘信息 虽然可以通过SNMP MIB获取这些信息,但获取,解释和翻译信息要困难得多。我可以详细介绍一下这个问题,但这样可以减少对问题的关注,足以说Powershell是我的首选方法

2 个答案:

答案 0 :(得分:1)

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

$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}}

如果你在回答我的问题时使用了一种不那么居高临下的语气,我会很感激。这不像我必须解决你的问题。

答案 1 :(得分:0)

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

我还在改进这个,并且会将其用于类似于原始帖子中描述的嵌套'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主机远程运行它...

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