概括
当我调用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
细节
我首先想到的是,我错误地使用了 cmdlet,或者 winrm 不起作用(它确实起作用了)。我还认为,也许是调用方式不同导致了失败。按照这种逻辑,我查看了有关 cmdlet 的以下 Technet 页面:
研究: 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
答案1
根据我Get-Cluster
对工作中遇到的几个集群的运行情况的观察,在我看来,它-Name
使用了名称解析,因此如果有任何东西导致解析名称出现问题,那么即使您给出的名称是本地机器,它也会失败。
我尝试使用集群名称和集群服务名称以及集群中各个节点的名称。
我还在 HOSTS 文件中添加了一个条目,将假名指向其中一个集群,并且能够成功使用该名称Get-Cluster
。
对我来说,这强烈表明使用-Name
完全依赖于操作系统中的标准名称解析。
Get-Cluster
没有名称的情况可以工作而Get-Cluster -Name localhost
(或当前机器的实际主机名)不起作用,这向我表明,如果没有名称参数,则Get-Cluster
尝试直接在当前机器上与集群服务进行通信,这不需要任何名称解析。
除了名称解析之外,我相信使用时会与目标服务器建立 RPC 连接-Name
(即使它是本地计算机),因此即使名称解析有效,RPC 服务实际上不可用,或者防火墙打开实际上可能会阻止该连接并导致您看到的错误。
我无法测试这一点,因为我目前在我们的测试环境中没有集群,并且我无法故意破坏生产集群上的名称解析或 RPC!
不幸的是,我无法用任何权威来源支持这一假设(我找不到这种行为的明确描述)。