Λάδι Βιώσας

http://profile.hatena.ne.jp/kenkitii/

ESXi サーバー機の自動電源オンオフ備忘録

ESXi サーバー機スペック

Server HP ProLiant ML110 G7
CPU Intel Xeon E3-1230 @3.20GHZ
MEM 16GB
HDD SATA 250GB

CPUとメモリは換装済み、ESXi 5.1 でゲスト OS (Windows 7) を4つ立ちあげ、1OS毎に2CPU、メモリは4GB割り振ってます。

リモートからサーバー機の電源をオンにする

Integrated Lights-Out(iLO)と ipmiutil

HP iLo は追加のソフトウェアをインストールしなくても購入後すぐに使用でき、サーバーの電源が入ってなくても機能する HP 謹製のツールです。サーバーハードウェアをモニタ可能にするための標準インターフェイス仕様のIPMIに対応しています。そこで IPMI の Windows 用のツールである ipmiutil を使ってリモートからサーバー機の電源操作をしたいと思います。こんな感じのバッチファイルで↓

cd C:\bin\ipmiutil
ipmiutil power -u -N IPAddress -U YourAdministratorName -P YourPassword

リモートからサーバー機の電源をオフにする

vim-cmd でやろうとしたけどなぜか shutdown できないゲストOSがひとつ。仕方ないので、WMIC 経由でゲストOSのシャットダウンをしてから vim-cmd で ESXi のパワーオフすることにする。以下、ruby スクリプトのように見えてバッチファイル。

WMIC /NODE:GUEST001 /USER:foo /PASSWORD:bar OS WHERE Primary=1 CALL Shutdown
WMIC /NODE:GUEST002 /USER:foo /PASSWORD:bar OS WHERE Primary=1 CALL Shutdown
WMIC /NODE:GUEST003 /USER:foo /PASSWORD:bar OS WHERE Primary=1 CALL Shutdown
WMIC /NODE:GUEST004 /USER:foo /PASSWORD:bar OS WHERE Primary=1 CALL Shutdown

@echo off
c:\ruby193\bin\ruby -x %0
@goto EOF

#!/usr/bin/ruby
require 'rubygems'
require 'net/ssh'

HOST = 'youresxihost'
USER = 'root'
PASSWORD = 'youresxipassword'

sleep(60*3) # 3分待機

Net::SSH.start(HOST, USER, :password => PASSWORD) do |ssh|
  output = ssh.exec!("vim-cmd vmsvc/getallvms")
  states = []
  output.split("\n").drop(1).each do |line|
    vmid  = line.split.first
    guest = line.split[1]
    state = ssh.exec!("vim-cmd vmsvc/power.getstate #{vmid}")
    puts (state =~ /Powered on/) ? "on    #{guest}" : "off   #{guest}"
    states << (state =~ /Powered off/)
  end

  # ゲストOSの Powered off の数をカウントし、全部 off なら ESXi をパワーオフ
  if states.size == states.count{|x| x} 
    output = ssh.exec!("poweroff")
    puts output
  end
end
__END__
:EOF

おまけ

このスペックで自分の使用方法だとゲストOS 4つらへんが限界っぽい。〜11:30まで処理中のCPUグラフ↓