2013-07-22 49 views
0

我正在使用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 *”不包括物理磁盘的大小或自由空间,我可以不知道如何得出这些信息。返回的信息对所有群集资源都是通用的 - 可以看到一个示例here(示例2)。下面的示例3几乎是有帮助的,但不包括磁盘大小或可用空间。

我检查了this question,但答案使用WMI查询,当我尝试此操作时,遇到各种安全和兼容性问题。如果可能的话,我宁愿坚持直截了当的PowerShell,尤其是监视应用程序也使用纯PowerShell检查Exchange邮箱大小& DFS复制积压。

请注意我不想查询群集共享卷 - 他们有自己的,单独的PowerShell功能,我有这个工作没有问题。它专门用于物理磁盘资源,我无法使其运行。

我知道物理磁盘是许多资源类型之一,所以通用的Get-ClusterResource命令不会返回任何特定于磁盘的内容,但我希望可以调用另一个函数,传入Get- ClusterResource,检索磁盘空间/免费空间

任何援助,将不胜感激,谢谢

山姆


更新为安斯加尔Wiechers

  • 您的目标是什么? 如前所述,为了创建一系列“数据收集器”PowerShell脚本,从多个需要监控的系统收集数据,并将这些数据注入到数据库中,以提供警报,保留历史记录并通常增强我们的监控能力。我们当前的监测工具套件覆盖了我们所需要的90%,但仅仅遗漏了一些小事情,我希望使用此方法进行纠正

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

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

  • 为什么您希望通过群集获取此信息,而不是监视群集成员上的物理磁盘信息。虽然可以通过SNMP MIB获取某些信息,但获取,解释和转换信息要困难得多。我可以进入这个细节,但它会从堂堂的问题焦点,我只想说PowerShell是我的首选方法

+0

您的目标是什么?为什么你需要物理磁盘参数而不是CSV参数?其中物理磁盘?为什么要通过群集获取此信息而不是监视群集成员上的物理磁盘信息? –

回答

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

而且我如果你在回答我的问题时使用了低调的语调,那么我很欣赏它。这不像我必须解决你的问题。

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} 
相关问题