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

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

Сэм


Обновления для Ansgar Wiechers

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

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

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

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

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

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

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

Я все еще уточняю это, и буду работать над этим, как во вложенных циклах 'foreach', описанных в исходном посте, но если вы посмотрите на "Громкость", а не на физический диск (и PowerShell сделает немного Math для вы), вы можете получить полезный вывод из этого...

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} 
Другие вопросы по тегам