Команда 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-ClusterResource, для получения место на диске/свободное место

Любая помощь будет оценена, спасибо

Сэм


Обновления для Ансгара Вихерса

  • Какова ваша цель? Как уже было указано, для создания серии сценариев powershell «сборщика данных», которые собирают данные из нескольких систем, требующих мониторинга, и вводят эти данные в базу данных, которая будет предоставлять предупреждения, сохранять историю и в целом улучшать наши возможности мониторинга. Наш текущий набор инструментов мониторинга покрывает 90% того, что нам нужно, но просто упускает несколько мелочей, которые я надеюсь исправить с помощью этого метода.

  • Почему вам нужны параметры физического диска вместо параметров CSV? Потому что CSV — не единственный тип дисков, используемых в кластере. Например, у нас есть кластер SQL с 2 серверами, 7 экземплярами и 31 томом. ОБЯЗАТЕЛЬНО контролировать свободное дисковое пространство на всех томах по причинам, которые я считаю очевидными. Этот мониторинг в настоящее время выполняется вручную и не сохраняет исторические данные.

  • Из каких физических дисков? Какие я укажу. Идеальным решением была бы возможность мониторинга любого используемого (т.е. не «доступного») дискового ресурса кластера. Я не собираюсь отслеживать «бесполезные» диски, такие как том DTC в нашем кластере SQL или тома Quorum, но нет никаких причин, по которым я не могу их контролировать, если захочу.

  • И почему вы хотите получать эту информацию через кластер, а не отслеживать информацию о физических дисках членов кластера? Хотя часть этой информации можно получить через SNMP MIB, эту информацию гораздо сложнее получить, интерпретировать и преобразовать. Я могу подробно рассказать об этом, но это отвлечет внимание от вопроса, достаточно сказать, что Powershell — мой предпочтительный метод.


person sm_biz    schedule 22.07.2013    source источник
comment
Какова ваша цель? Почему вам нужны параметры физического диска вместо параметров CSV? Из каких физических дисков? И почему вы хотите получать эту информацию через кластер вместо того, чтобы отслеживать информацию о физических дисках членов кластера?   -  person Ansgar Wiechers    schedule 22.07.2013


Ответы (2)


Вы не можете получить информацию о свободном пространстве на уровне физического диска. Такая информация доступна только на уровне файловой системы/тома. Для целей мониторинга я бы просто сделал

$filter = 'DriveType=3 AND DriveLetter IS NOT NULL'

gwmi Win32_Volume -Filter $filter | select DriveLetter, Capacity, FreeSpace

на каждом узле кластера. Это даст вам размер и свободное пространство «обычных» томов. Вы можете выполнять удаленные запросы WMI, передав массив имен хостов в параметр -Computer. В этом случае я бы рекомендовал включить свойство 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}}

И я был бы признателен, если бы вы использовали менее снисходительный тон, отвечая на мои вопросы. Не то чтобы я должен решать твои проблемы.

person Ansgar Wiechers    schedule 26.07.2013

Я знаю, что это немного устарело, но оно было высоко в результатах поиска, но обрабатывает только часть того, что я искал, прежде чем решить, что я должен просто написать что-то с нуля.

Я все еще дорабатываю это и буду превращать его во что-то похожее на ваши вложенные циклы foreach, описанные в исходном посте, но если вы посмотрите на «Том», а не на физический диск (и пусть 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} 
person Nathan GracieRaitt    schedule 24.09.2015