別ディスカッションで色々お知恵を頂き、やっと望む設定が完了しました。
感謝の意味を込めてフィードバックさせて頂きます。
要件)
1.無人状態のプライベートクラウドデータセンターの電源障害(台風等)が発生した際に、安全にゲスト、ホストとUPSを止める。
2.電源が回復したら(嵐が去ったら)人間の判断でUPSのスイッチを投入してホストとゲストも無操作で起動する。
概要)
1.シャットダウンの処理は、仮想マシンとして作成したvCenterサーバにてPowerCLIにて実行する。
2.vCenterサーバは、UPS監視ソフト(今回はHPPP)をインストールし上記PowerCLIをUPS監視ソフトからキックする。
3.上記PowerCLIスクリプトでは、シャットダウン時に動作中だったゲストの一覧をファイルに書き出して保存する。
4.ホストは特にメンテナンスモード以降、シャットダウン等は行わないでブチ切りとする。
(そこまでやっても良いが、次回起動時何らかのトラブルで手動起動しないといけない場合、操作が煩雑となる為。電話誘導で現場オペレータへの指導も考慮)
5.UPSの電源は、UPSの機能にて止める。これによって、ホストの通電も無くなる。
6.電源オンは現地オペレータが手動でUPS投入、BIOS設定にてホストも自動オン。
7.全ホストの/etc/rc.local.d/local.sh に vCenter 起動スクリプトを記述しておき、このスクリプトにてvCenterが起動する。
(ホストは vim-cmd vmsvc/getallvms にて、自分自身にvCenterサーバ用ゲストがいるかを確認する)
8.vCenterサーバ(Windows2012)のタスク(起動時に実行)にて、全ゲスト(正確には上記3で記録したゲスト)を起動する。
以上
シャットダウン用PowerCLIスクリプト
#
# 基本設定
#
$vCenterVMName = 'vm-vcenter'
$vCenterAddress = 'IPアドレス'
$vCenterUser = 'administrator@vsphere.local'
$vCenterPasswd = 'パスワード'
$hostUser = 'root'
$hostPasswd = 'パスワード'
$pewerOnVMs = 'c:\vm\PowerOnVMs.txt'
$ESXCLI = 'C:\Program Files (x86)\VMware\VMware vSphere CLI\bin\esxcli.exe'
#
# PowerCLI スナップイン追加
#
Add-PSSnapin vmware.vimautomation.core
#
# 対話モード動作確認
#
if ( $args -contains '-interactive' ) {
$typename = "Management.Automation.Host.ChoiceDescription"
$yes = New-Object $typename("&Yes","全仮想マシンを停止する")
$no = New-Object $typename("&NO","キャンセル")
$choice = [Management.Automation.Host.ChoiceDescription[]]($yes,$no)
$ans = $Host.UI.PromptForChoice("<実行確認>","実行しますか?",$choice,1)
if ( $ans -ne 0 ) {
exit
}
}
#
# vCenter 接続
#
Connect-VIServer -Server $vCenterAddress -User $vCenterUser -Password $vCenterPasswd
#
# 全仮想マシンのシャットダウン
#
$vms = @(Get-VM | Where-Object { $_.Name -ne $vCenterVMName -and $_.PowerState -eq 'PoweredOn' })
$vms | Select -ExpandProperty Name | Out-File $pewerOnVMs
$vms | Shutdown-VMGuest -Confirm:$false
Start-Sleep 60
#
# vCenter仮想マシンをシャットダウン
#
$vCenter = (Get-VM $vCenterVMName)
$vCenter | Shutdown-VMGuest -Confirm:$false
上記PowerCLI起動用のバッチファイル(UPS管理ソフトからPowerShellを直接起動すると、GetExecutionPolicy=RemoteSignedでもダメだった為)
psexec.exe \\localhost -h -u Administrator -p ぱすわーど -accepteula C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe C:\vm\down-all-vms.ps1
※上記スクリプト実行後は、UPSの機能で電源を落とす
/etc/rc.local.d/local.sh(以下を追加)
vc=`vim-cmd vmsvc/getallvms | grep " vm-vcenter " | awk '{print $1}'`
[ x"$vc" == "x" ] || vim-cmd vmsvc/power.on $vc
vCenter仮想サーバ(Windows)起動時に動くようにタスク設定したバッチファイル
psexec.exe \\localhost -h -u Administrator -p パスワード -accepteula C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe C:\vm\up-all-vms.ps1
実際に全ゲストを起動するPowerCLIスクリプト
#
# 基本設定
#
$vCenterVMName = 'vm-vcenter'
$vCenterAddress = 'IPアドレス'
$vCenterUser = 'administrator@vsphere.local'
$vCenterPasswd = 'パスワード'
$pewerOnVMs = 'c:\vm\PowerOnVMs.txt'
#
# PowerCLI スナップイン追加
#
Add-PSSnapin vmware.vimautomation.core
#
# vCenter 接続
#
do {
Start-Sleep -s 60
Connect-VIServer -Server $vCenterAddress -User $vCenterUser -Password $vCenterPasswd
} until ( $? )
$vms = @(Get-Content $pewerOnVMs)
del $pewerOnVMs
#
# 指定仮想マシンの起動
#
$vms | foreach {
if (( Get-VM -Name $_ ).PowerState -eq 'PoweredOff' ) {
Start-VM -VM $_
}
}
以上です。