URAMIRAIKAN

1020のなれの果て (since 2005.6.19)

PowerCLIでvMotion

 PowerCLIを使って特定のESXiホストから別のESXiホストへ稼働中の仮想マシンを全てvMotionするスクリプトです。
 特に目新しいことはないですね。

 自社のvSphere ESXiサーバのハードウェアリプレースをお手伝いすることになったのですが、仮想マシンの移行は相変わらず手作業で時間かけてやるのが常態化しているようです。
 さすがにそれにつき合うのは苦痛なので…。

 あらかじめ実行元の環境にはPowerCLIをインストールしておく。最近はPowerShell Galleryから"Install-Module"で入るので非常に楽ですね。
 あとはvCenter ServerのIPアドレス(またはホスト名)、権限のあるユーザーアカウント、パスワードを環境に合わせて修正。

Param ( [Parameter(Mandatory = $True, HelpMessage="Source ESXi Host")][alias("src","s")][ValidateNotNullOrEmpty()][string]$SrcEsx, [Parameter(Mandatory = $True, HelpMessage="Destination ESXi Host")][alias("dest","d")][ValidateNotNullOrEmpty()][string]$DestEsx ) $VcSv = "192.168.0.251" $VcUser = "administrator@vsphere.local" $VcPass = "password" Import-Module VMware.PowerCLI #Add-PSSnapin VMware.VimAutomation.Core Connect-VIServer -Server $VcSv -User $VcUser -Password $VcPass $TargetHost = Get-VMHost -Name $DestEsx $PowerOnVms = Get-VM | Where-Object { $_.PowerState -eq "PoweredOn" } Foreach ($TargetVm in $PowerOnVms) { if ($TargetVm.VMHost.Name -eq $SrcEsx) { try { Move-VM -VM $TargetVm -Destination $TargetHost -RunAsync:$True } catch { Write-Error $_.Exception exit 1 } Start-Sleep 30 } } Disconnect-VIServer -Server $VcSv -Confirm:$False

 スクリプト実行時には引数として"-s <移行元のESXiホスト> -d <移行先のESXiホスト>"をつける。

 内容的には"Start-Sleep"で少し時間を空けながら"Move-VM"を実行しています。"-RunAsync:$True"なので実行したvMotionの終了を待たずに続けて実行していく。ただ、vCenter ServerはデフォルトでvMotionの並列実行数が4とかなので、タスクが積み上がっていきます。このあたりは環境によってSleepの間隔を調整。

 「手順書作って手作業」という非効率な流れはやめたい。