2013-07-22 112 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}