Резюме
Когда я звоню 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 в производственном кластере!
К сожалению, я не смог подтвердить эту гипотезу каким-либо авторитетным источником (я не смог найти окончательного описания такого поведения).