vCenter alarmをトリガにしてvmware powercli を実行する

version: VMware vSphere version 5.1

例えば簡易的な(偽)オートスケールを作りたい場合、vm1にトリガを設定して、vm1のcpu使用率が高くなったときにpowercliでvm2を起動するようなことを書いておけば良い。

が、このトリガ実行するコマンドを指定するのに一工夫必要だった。
自分のwindows serverおよびpowershellレベルがだいぶ低いので試行錯誤したけど
偉い人なら実はこんなこと悩まなくても良かったのかもしれない。

VMware のドキュメントほとんど読んでないので、他にまともな方法があるかもしれない。

結論 アラームでのコマンドの実行の際にcmd.exe 経由で経由でスクリプトを実行する

参考

このblogの通り、コマンドの実行のところにcmd経由でps1スクリプトを呼び出す。

c:\windows\system32\cmd.exe "/c echo.|powershell.exe -nologo -noprofile -noninteractive c:\scripts\start_vm2.ps1"

これを設定した後で、vm1ではperl -le '1 while 1' などで適当に無限ループさせてCPU消費させれば、
正常にstart_vm2.ps1 (vm2を起動)が実行できて、vcenterに謎なエラーも出ない(後述)。

ただ、この長い引数を毎回入力するのは忘れそうで嫌なのでラッパーのbatファイル経由で実行するようにした。

c:\scripts\powercli.bat c:\scripts\start_vm2.ps1
  • powercli.bat
@echo OFF
SET CMD=c:\windows\system32\cmd.exe
SET ARG="/c echo.|powershell.exe -nologo -noprofile -noninteractive %1"

IF "%1" == "" (
  echo "Usage: %0 powercli_script"
) ELSE (
  %CMD% %ARG%
)
  • start_vm2.ps1

※ 確認用なのでpasswordは平文でそのまま書いてる。
vmware powercliはpowershellの拡張なのでAdd-PSSnapinで読み込んでおく。

Add-PSSnapin VMware.VimAutomation.Core -ea SilentlyContinue
$WarningPreference = "SilentlyContinue"

$server="localhost"
$user="administrator"
$pass="password"

Connect-VIServer -server $server -user $user -password $pass | Out-Null
Start-VM -VM "vm2"

DisConnect-VIServer -server $server -Force:$true -Confirm:$False

以下おまけ

試行錯誤案1 powershellでps1ファイルを直接実行

アクション - コマンドの実行

C:\Windows\system32\WindowsPowerShell\v1.0\powershell.exe C:\scripts\start_vm2.ps1
結果

vm1のCPU利用率が高くなった際に、vm2の起動は正常にできた。が、vcenterのイベントのところに以下のエラーがでていた。

アラーム「test_alarm」はスクリプトを完了しませんでした
一般的なシステムエラーが発生しました
Failed to run script: script timed out, terminated

ps1スクリプトでechoやらdateやらを最初と最後のほうに書いてみてdebugしてみたけど、スクリプトは最後まで実行されているように思うのだけど。。。よくわからなかった。とりあえずvm2は起動したので結果だけで見るならこれでも良い。

参考

試行錯誤案2 batファイル経由でpowershellスクリプトを実行する - 失敗

参考

このblogによると直接powershell実行はできないから、batファイル経由でpowershellとps1スクリプトを実行すると書いてあった。

やってみたが、アクションでbatファイルを実行するとこまではいけるけどその中でpowershellを呼び出しているところがなぜか動かなかった。このblogはvSphere 4.0を元に書いてあったのでそれの違いのせい?