Назад | Перейти на главную страницу

Командлет Get-Cluster не работает при использовании параметра -Name

Резюме

Когда я звоню Get-Cluster powershell возвращает имя моего кластера. Для простоты назовем его Cluster1. Если я позвоню Get-Cluster -Name Cluster1 происходит сбой с ошибкой.

Ошибка:

Get-Cluster : Check the spelling of the cluster name. Otherwise, there might be a problem with your network. Make sure
the cluster nodes are turned on and connected to the network or contact your network administrator.
    The RPC server is unavailable
At line:1 char:1
+ Get-Cluster -Name Cluster1
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : ConnectionError: (:) [Get-Cluster], ClusterCmdletException
    + FullyQualifiedErrorId : ClusterRpcConnection,Microsoft.FailoverClusters.PowerShell.GetClusterCommand

Деталь

Моя первая мысль: я неправильно использую командлет или winrm не работает (это так). Я также подумал, что, возможно, есть разница в том, как это называется, что вызывает сбой. Следуя этой логике, я просмотрел следующую техническую страницу по командлету:

Исследовательская работа: http://technet.microsoft.com/en-US/library/hh847254(v=wps.630).aspx

Судя по тому, что там написано, я не смог различить явную ошибку пользователя. Итак, я попробовал несколько вещей, чтобы понять это. Сначала я подумал, что, может быть, я просто постоянно лажаю с набором текста, поэтому сделал следующее:

$Cluster = Get-Cluster
($cluster.Name -like "Cluster1")

Условный возврат True так что я не любитель печатать. Затем я попробовал следующее:

Get-Cluster | Where-Object{$_.Name -like "Cluster1"}

Что, конечно, возвращает объект кластера. Итак, что здесь происходит? Что отличается от Get-Cluster -Name "Cluster1"?

редактировать

Информация о версии от Powershell:

PSVersion                      4.0
WSManStackVersion              3.0
SerializationVersion           1.1.0.1
CLRVersion                     4.0.30319.34209
BuildVersion                   6.3.9600.17090
PSCompatibleVersions           {1.0, 2.0, 3.0, 4.0}
PSRemotingProtocolVersion      2.2

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

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

Я также добавил в свой файл HOSTS запись, указывающую поддельное имя для одного из кластеров, и смог успешно использовать это имя с Get-Cluster.

Для меня это убедительно свидетельствует о том, что использование -Name полностью полагается на стандартное разрешение имен в ОС.

Случай, когда Get-Cluster без имени будет работать, тогда как Get-Cluster -Name localhost (или фактическое имя хоста текущей машины) не будет работать, подсказывает мне, что без параметра имени, Get-Cluster пытается связаться со службой кластера непосредственно на текущем компьютере, что не требует разрешения имен.

В дополнение к разрешению имен я считаю, что соединение RPC выполняется с целевым сервером при использовании -Name (даже если это локальный компьютер), поэтому, даже если разрешение имен работает, служба RPC фактически недоступна или включен брандмауэр, что может заблокировать это соединение и вызвать ошибку, которую вы видели.

Я не смог это протестировать, так как в настоящее время у меня нет кластера в нашей тестовой среде, и я не могу намеренно нарушить разрешение имен или RPC в производственном кластере!

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