2017-05-03 1 views
1

다음은 내가 수행하려고 시도한 것입니다. vSphere 설치에 여러 클러스터가 있고 그 클러스터 아래에 몇 개의 호스트가 있습니다.PowerCLI가 클러스터와 호스트를 통과합니다.

클러스터를 통과하고 각 클러스터 내부를 돌아 다니며 호스트를 유지 관리 모드로 전환하고 클러스터 외부로 이동하고 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 수락 제어를 중지하는 몇 가지 코드를 추가했다. resorces가 부족한 경우 유지 관리 모드에서 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

이 문을 사용하면 모든 클러스터 제공 :

$clusters = Get-Cluster 

이 사항이 모든 하이퍼 바이저를 제공을 모든 클러스터의 :

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

때문에 모든 hypervisers 이상 당신의 내부 루프 이미 반복 모든 클러스터는 외부 루프의 클러스터를 반복하여 각 클러스터에 대해 해당 작업을 반복합니다. 두 클러스터의 경우 두 번 결과를 얻습니다. 세 클러스터의 경우 세 번 결과를 얻습니다.

내부 루프의 마지막 작업은 클러스터를 인식하지 않기 때문에 닭 스위치를 제거하면 코드가 실제로 손상 될 수 있습니다. 클러스터 당 하이퍼 바이저를 열거해야합니다.. 난은 vSphere 시스템에 액세스 할 수없는,하지만 난 이런 일이 당신이 원하는 일을해야한다고 가정

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

사이드 참고 : 귀하의 루프 주위 & { ... } 무의미하다. 그냥 버려.

+0

도움을 주셔서 감사합니다. 내가 잘못한 것을 이해합니다. 네가 나에게 준 것을 시험해 보겠다. – Nov2009

관련 문제