使用PowerCLI遍历集群和主机

3
这是我要做的事情:我有一个vSphere设置,有多个群集,在这些群集下面有几个主机。
我正在尝试编写一个脚本,遍历所有群集,在每个群集内部将主机置于维护模式,将其移出群集,启动/停止VM,为其添加内存,然后将主机移回它所在的群集。
到目前为止,我已经有了以下代码。内循环可以工作,但外部循环只是使所有内容运行两次,并将群集名称添加为$cluster在内部循环中。
你有什么想法吗?我只希望内部循环为每个群集中的所有主机运行。
我添加了-WhatIf进行测试,你可以忽略它们。
Connect-VIServer vcenter01

$clusters = Get-Cluster
$esxhosts = Get-Cluster $clusters | Get-VMHost
$Datacenter = "Datacenter01"
$sleep = 1

& {
    foreach ($cluster in $clusters) {
        foreach ($esxhost in $esxhosts) {
            Set-VMHost $esxhost -State Maintenance -WhatIf
            Move-VMhost $esxhost -Destination $Datacenter -WhatIf
            Set-VMHost $esxhost -State Connected -WhatIf
            Sleep $sleep
            Stop-VMGuest -Vm Z-VRA-$esxhost -Confirm:$false -WhatIf
            Sleep $sleep
            Set-VM -Vm Z-VRA-$esxhost -MemoryGB 6 -Confirm:$false -WhatIf
            Start-VM -Vm Z-VRA-$esxhost -WhatIf
            Sleep $sleep
            Move-VMhost $esxhost -Destination $cluster -WhatIf
        }
    }
}

Disconnect-VIServer vcenter01

这是一个工作副本的样子(感谢@Ansgar Wiechers):
在对每个集群进行操作时,我添加了一些代码来启动/停止HA准入控制。这将避免在资源不足时VM在维护模式下释放。请参考代码:
Connect-VIServer vcenter01

$Datacenter = "Datacenter01"
$sleep = 1

Get-Cluster  | ForEach-Object {
$cluster = $_
Set-Cluster -HAAdmissionControlEnabled $false -Cluster $cluster -Confirm:$false -Whatif
$cluster  | Get-VMHost | ForEach-Object {
        Set-VMHost $_ -State Maintenance -WhatIf
        Move-VMhost $_ -Destination $Datacenter -WhatIf
        Set-VMHost $_ -State Connected -WhatIf
        Sleep $sleep
        Stop-VMGuest -Vm Z-VRA-$_ -Confirm:$false -WhatIf
        Sleep $sleep
        Set-VM -Vm Z-VRA-$_ -MemoryGB 6 -Confirm:$false -WhatIf
        Start-VM -Vm Z-VRA-$_ -WhatIf
        Sleep $sleep
        Move-VMhost $_ -Destination $cluster -WhatIf


    }
   Set-Cluster -HAAdmissionControlEnabled $true -Cluster $cluster Confirm:$false -Whatif
}


Disconnect-VIServer vcenter01
1个回答

3

这个语句会给你所有的集群:

$clusters = Get-Cluster

此语句提供了所有集群中的所有虚拟化管理程序

$esxhosts = Get-Cluster $clusters | Get-VMHost

由于您的内部循环已经迭代了所有集群的超级管理员,因此在外部循环中迭代集群会重复执行每个集群的操作。对于两个集群,您会得到两次结果,对于三个集群,您将得到三次结果,以此类推。
由于内部循环中的最后一个操作与集群无关,如果删除chicken switch,您的代码可能会破坏一些东西。您需要枚举每个集群的超级管理员。我没有访问vSphere系统的权限,但我认为以下内容应该可以实现您想要的功能:
Get-Cluster | ForEach-Object {
    $cluster = $_
    $cluster | Get-VMHost | ForEach-Object {
        Set-VMHost $_ -State Maintenance -WhatIf
        ...
        Move-VMhost $_ -Destination $cluster -WhatIf
    }
}

旁注:在你的循环周围使用& { ... }是没有意义的。只需省略它即可。

明白了,感谢你的帮助。我知道我做错了什么。我会测试一下你给我的东西。 - Nov2009

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接