Команда 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}