2017-05-03 26 views
1

ここに私がやろうとしていることがあります。複数のクラスタを持つvSphereセットアップがあります。これらのクラスタの下にはいくつかのホストがあります。PowerCLIがクラスタとホストを歩く

私は、クラスタと各クラスタ内を歩き回るスクリプトを作成しようとしています。ホストをメンテナンスモードにし、クラスタ外に移動し、VMを起動/停止し、メモリを追加してから、クラスタ内に移動した。

これまで私がこれまで持っていたことは次のとおりです。内側のループは機能しますが、内側のループはすべてを2回実行し、内側のループに$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

この文はあなたにすべてのクラスタを提供します:

$clusters = Get-Cluster 

この文はあなたにすべてのクラスタのすべてのハイパーバイザー与える:あなたの内側のループは、すでにすべてのhypervisersを反復処理するので

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

をすべてのクラスタは、外部ループ内のクラスタを反復して、各クラスタの操作を繰り返します。 2つのクラスタの場合は結果が2回、3つのクラスタの場合は3回の結果が得られます。

内部ループの最終操作はクラスタに依存しないため、チキンスイッチを取り外した場合、コードが実際に何かに壊れている可能性があります。クラスタごとにハイパーバイザーを列挙する必要があります。私は、vSphereシステムにアクセスすることはできませんが、私はこのようなものは、あなたが望む何をすべきとします

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

サイドノート:あなたのループの周り& { ... }は無意味です。ちょうどそれを落とす。

+0

ご協力ありがとうございます。私が間違ったことを理解しています。私はあなたが私に与えたものを試してみます。 – Nov2009

関連する問題