【问题标题】:Unable to return info on hosts in multiple clusters in PowerShell using PowerCLI无法使用 PowerCLI 在 PowerShell 中返回多个集群中的主机信息
【发布时间】:2014-09-22 16:10:55
【问题描述】:

我有一个 PowerShell 脚本,用于返回用户指定集群上每个主机的信息。用户将 vCenter 和集群作为参数提供,脚本按预期工作。

我正在尝试修改此脚本,以便用户只需将 vCenter 作为参数传入,它就会返回所有集群上所有主机的信息。

这是我拥有的原始脚本:

Param(
    $vc,
    $ClusterName
)

Add-PSSnapin VMware.VimAutomation.Core

Connect-VIServer $vc

$VMHosts = Get-Cluster $ClusterName | Get-VMHost  | ? { $_.ConnectionState -eq "Connected" } | Sort-Object -Property Name

foreach ($VMHost in $VMHosts) {

 Get-VMHostStorage -RescanAllHba -VMHost $VMHost | Out-Null
 $esx = Get-VMHost $VMHost
 foreach($hba in (Get-VMHostHba -VMHost $esx -Type "FibreChannel")){
     $target = ((Get-View $hba.VMhost).Config.StorageDevice.ScsiTopology.Adapter | where {$_.Adapter -eq $hba.Key}).Target
     $luns = Get-ScsiLun -Hba $hba  -LunType "disk"
     $nrPaths = ($target | %{$_.Lun.Count} | Measure-Object -Sum).Sum
     $deadPaths = $luns | Get-ScsiLunPath | Group-Object -Property state | ? { $_.Name -eq "Dead"}
     $hbaDevice = $hba.Device
     $targetCount = $target.Count
     $lunsCount = $luns.Count
     $deadPathCount = $deadPaths.Count

     "vmhost=$VMHost;hba=$hbaDevice;targets=$targetCount;devices=$lunsCount;paths=$nrPaths;deadpaths=$deadPathsCount|"

 }
}

Disconnect-VIServer -Confirm:$False

这是我的修改版:

Param(
    $vc
)

Add-PSSnapin VMware.VimAutomation.Core

Connect-VIServer $vc
$clusters = Get-Cluster

foreach ($cluster in $clusters) {

    $clusterName = $cluster.name
    $VMHosts = Get-Cluster $clusterName | Get-VMHost  | ? { $_.ConnectionState -eq "Connected" } | Sort-Object -Property Name


    foreach ($VMHost in $VMHosts) {


        Get-VMHostStorage -RescanAllHba -VMHost $VMHost | Out-Null
        $esx = Get-VMHost $VMHost

        foreach($hba in (Get-VMHostHba -VMHost $esx -Type "FibreChannel")){
            $target = ((Get-View $hba.VMhost).Config.StorageDevice.ScsiTopology.Adapter | where {$_.Adapter -eq $hba.Key}).Target
            $luns = Get-ScsiLun -Hba $hba  -LunType "disk"
            $nrPaths = ($target | %{$_.Lun.Count} | Measure-Object -Sum).Sum
            $deadPaths = $luns | Get-ScsiLunPath | Group-Object -Property state | ? { $_.Name -eq "Dead"}
            $hbaDevice = $hba.Device
            $targetCount = $target.Count
            $lunsCount = $luns.Count
            $deadPathCount = $deadPaths.Count
            "vmhost=$VMHost;hba=$hbaDevice;targets=$targetCount;devices=$lunsCount;paths=$nrPaths;deadpaths=$deadPathsCount|"
        }
    }
}



Disconnect-VIServer -Confirm:$False

我得到的错误是:

Could not execute powershell command.
At \\xx\xxx\xxxx\scripts\vmwarePathCheckAllClusters.ps1:35 char:26
+         Get-VMHostStorage <<<<  -RescanAllHba -VMHost $VMHost | Out-Null

$VMHost 似乎被返回为 null,但我不知道为什么!

这是我第一次使用 PowerCLI CommandLets,而且我对 PowerShell 也很陌生。我确信这是非常简单的事情,希望能提供任何帮助。如果您需要更多信息,我将非常乐意提供。 顶!

编辑:这是附加的错误信息:

+         Get-VMHostStorage <<<<  -RescanAllHba -VMHost $VMHost | Out-Null ---> VMware.VimAutomation.Sdk.Types.V1.ErrorHandling.VimException.VimException: 9/24/2014 5:58:57 AM Get-VMHostStorage       Value cannot be found for the mandatory parameter VMHost     ---> System.Management.Automation.ParameterBindingException: Value cannot be found for the mandatory parameter VMHost

【问题讨论】:

  • 您是否尝试过以提升的权限运行您的 Powershell 控制台?没有它,它可能无法正确获取 $VMHosts。
  • 是的,我最初不是,它返回一个错误,指出我需要提升权限。谢谢。
  • 关于为什么这不起作用的任何其他想法?我觉得奇怪的是原始脚本工作正常。我正在做一些测试,$VMHost 为集群返回了正确的主机!
  • 嗯...不幸的是,我没有明确地使用集群(或有一个要测试),所以我没有任何直接的想法。您是否能够成功让所有集群填充您的 $clusters 变量?如果是这样,当您使用第一个 foreach 循环时,$cluster.name 是否正确填充 $ClusterName?此外,也许修改您的代码以使用一个集群作为测试可能会揭示是否存在与您修改的脚本不同的另一个潜在问题。
  • 嗨,克里斯,感谢您回复我。是的 $cluster$clusterName 变量都正确填充。我通过修改代码以仅接受一个静态设置的集群来尝试您的建议。将$clusters = Get-Cluster 更改为$clusters = @("server_name"),它运行良好!不幸的是,我仍然无法弄清楚为什么会发生这种情况。感谢您的建议。

标签: powershell vmware powercli


【解决方案1】:

您是否测试过在没有-RescanAllHBA 的情况下运行Get-VMHostStorage?为什么你认为$VMHost 被返回为空?也许它找到了主机,但没有重新扫描?只是猜测。

不确定这是否会导致您的问题,但您不需要运行Get-Cluster 两次。而是,

$VMHosts = $cluster | Get-VMHost  | ? <etc>

edit - 对于给定的脚本运行,完整的错误文本出现了多少次?在那次运行中发现了多少个 vmhost?你有没有主机的集群吗?没有存储的主机?如果来自一个循环迭代的值似乎正在破坏下一次迭代,您可以设置 $vmhost = $null$cluster = $null。 (抱歉,必须有更好的表达方式......希望你能明白我的意思。)你总是可以将有问题的代码行放在 [try] 块中,并使用 catch 处理错误。

再次编辑 - 显然this 在维护模式下为主机修复了它:if (!$VMHost) {continue}

【讨论】:

  • 嘿@noam,感谢您的回复。我已经尝试了你上面的两个建议,不幸的是我仍然收到同样的错误。我认为它与$VMHost 有关的原因是由于我忘记在上面发布的错误返回的附加部分。我现在将其添加到原始问题中。
  • 谢谢@noam,就是这样。它现在按预期工作。在维护模式下,其中一个集群上有一个 VM。如果你曾经在贝尔法斯特,我欠你一品脱 :)
  • 刚刚看到你更新了。实际上,我使用您的原始答案添加了if(!$VMHost){continue},这对我来说很好。
  • 哎呀 - 我将再次编辑答案以包含它。谢谢澄清。
猜你喜欢
  • 2017-10-01
  • 2018-01-02
  • 2016-12-26
  • 2019-12-13
  • 1970-01-01
  • 2019-11-27
  • 2014-02-19
  • 2018-05-10
  • 1970-01-01
相关资源
最近更新 更多