【问题标题】:PowerCLI to walk through clusters and hostsPowerCLI 遍历集群和主机
【发布时间】:2017-10-01 18:09:21
【问题描述】:

这是我想要做的:我有一个带有多个集群的 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

【问题讨论】:

    标签: powershell vmware powercli


    【解决方案1】:

    此语句为您提供所有集群:

    $clusters = Get-Cluster
    

    此语句为您提供所有集群的所有管理程序

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

    因为您的内部循环已经迭代了所有集群的所有管理程序,所以在外部循环中迭代集群会为每个集群重复该操作。对于两个集群,您将获得两次结果,对于三个集群,您将获得三次结果,依此类推。

    由于内部循环中的最终操作与集群无关,因此如果您移除鸡开关,您的代码实际上可能会破坏某些内容。您需要枚举 每个集群 的虚拟机管理程序。我无权访问 vSphere 系统,但我想这样的事情应该可以满足您的需求:

    Get-Cluster | ForEach-Object {
        $cluster = $_
        $cluster | Get-VMHost | ForEach-Object {
            Set-VMHost $_ -State Maintenance -WhatIf
            ...
            Move-VMhost $_ -Destination $cluster -WhatIf
        }
    }
    

    旁注:循环周围的& { ... } 毫无意义。放下吧。

    【讨论】:

    • 知道了,感谢您的帮助。我明白我做错了什么。我会测试你给我的。
    猜你喜欢
    • 2018-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-27
    • 1970-01-01
    • 2022-01-19
    • 2015-04-04
    相关资源
    最近更新 更多