这是我要做的事情:我有一个vSphere设置,有多个群集,在这些群集下面有几个主机。
我正在尝试编写一个脚本,遍历所有群集,在每个群集内部将主机置于维护模式,将其移出群集,启动/停止VM,为其添加内存,然后将主机移回它所在的群集。
到目前为止,我已经有了以下代码。内循环可以工作,但外部循环只是使所有内容运行两次,并将群集名称添加为
你有什么想法吗?我只希望内部循环为每个群集中的所有主机运行。
我添加了-WhatIf进行测试,你可以忽略它们。
这是一个工作副本的样子(感谢@Ansgar Wiechers):
在对每个集群进行操作时,我添加了一些代码来启动/停止HA准入控制。这将避免在资源不足时VM在维护模式下释放。请参考代码:
我正在尝试编写一个脚本,遍历所有群集,在每个群集内部将主机置于维护模式,将其移出群集,启动/停止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