VMware HA有効時に仮想マシンの自動起動をしたい


VMware HA利用時って、ESXiの仮想マシン自動起動設定が使えません。
そんなわけで、いままではvCenter ServerとしてWindowsサーバを別途ハードウェアを用意し、そこから、スクリプトを使って仮想マシンを起動させていたりました。

しかし、いまは、vCenter Server Appliance(vCSA)。
仮想マシンでたてちゃえば、Windowsライセンスもいらないのでお気軽・・・ってことになっています。
(vCSAは、SuSE Linux+Linux版vCenter Serverです)

が・・・VMware HA有効時は、仮想マシンの自動起動が使えない→vCSAも起動しない。
さて、どうしよう?

正規な解決手法は無い模様。

ハードウェアを追加で購入して対応する、というのであれば、UPSソリューションズの「シャットダウンボックス UPSS-SDB02」というアプライアンスを使って解決する、という手があります。

ESXiサーバだけでなんとか解決する手法はないものか、いろいろ捜索してみた結果、ESXiの起動時に実行される/etc/rc.local.d/local.shを利用して起動させる、というあたりが最適かな、という結論に。
(rc.localに関するVMwareのKB:Modifying the rc.local or local.sh file in ESX/ESXi to execute commands while booting)

警告!!!以下の手順はVMware公式の手順ではありません。

ESXi5.1の場合、ESXi Shellを有効にしてログイン、もしくはsshを有効にしてログインしたあと、/etc/rc.local.d/local.shを編集します。

元々のlocal.shはこんな感じ。

~ # cat /etc/rc.local.d/local.sh
#!/bin/sh
# local configuration options
# Note: modify at your own risk!  If you do/use anything in this
# script that is not part of a stable API (relying on files to be in
# specific places, specific tools, specific output, etc) there is a
# possibility you will end up with a broken system after patching or
# upgrading.  Changes are not supported unless under direction of
# VMware support.
exit 0

ここに仮想マシン起動のコマンドを入れ込みます。
いろいろ実験した結果、すぐに実行すると仮想マシンファイルのロック問題が発生し、vMotionができない状況が発生したりしたので、若干スリープを入れて処理を遅延させます。
・・・時間調整が面倒だったので、切りよく5分(300秒)で設定しちゃってますけどね。

#!/bin/sh
# local configuration options
# Note: modify at your own risk!  If you do/use anything in this
# script that is not part of a stable API (relying on files to be in
# specific places, specific tools, specific output, etc) there is a
# possibility you will end up with a broken system after patching or
# upgrading.  Changes are not supported unless under direction of
# VMware support.
LOGS=/vmfs/volumes/sharedstore/tmp/`hostname`.txt
date >> $LOGS
vim-cmd vmsvc/getallvms >> $LOGS
sleep 300
date >> $LOGS
vim-cmd vmsvc/getallvms >> $LOGS
for vmid in `vim-cmd vmsvc/getallvms | grep "sharedstore" | awk '{ print $1 }'`
do
        vim-cmd vmsvc/power.on $vmid
        sleep 5
done
date >> $LOGS
echo "boot finished" >> $LOGS
exit 0

書き換えた後は「auto-backup.sh」を実行します。
これを忘れると、再起動を行うとlocal.shは初期状態に戻ってしまいます。

~ # auto-backup.sh
Files /etc/vmware/dvsdata.db and /tmp/auto-backup.5979//etc/vmware/dvsdata.db differ
Saving current state in /bootbank
Clock updated.
Time: 00:37:06   Date: 09/20/2013   UTC
~ #

もしかすると、下記の様な感じの出力になるかもしれません。

~ # auto-backup.sh
--- /etc/vmware/hostd/hostsvc.xml
+++ /tmp/auto-backup.5631//etc/vmware/hostd/hostsvc.xml
@@ -8,6 +8,5 @@
   <mode>normal</mode>
   <service>
     <TSM-SSH>on</TSM-SSH>
-    <ntpd>automatic</ntpd>
   </service>
 </ConfigRoot>
\ No newline at end of file
Saving current state in /bootbank
Clock updated.
Time: 00:26:37   Date: 09/20/2013   UTC
~ #

これは、vSphere Clientから行った設定と、いまauto-backup.shで保存した設定に差異があり、vSphere Clientで行った設定が無効になったような場合に表示されます。

その場合は、もう1回、vSphere Clientから設定をやり直します。
上記の場合は、「automatic」が無くなった、ということになりますので、NTPに関する設定をやり直します。


解説

#!/bin/sh
# local configuration options
# Note: modify at your own risk!  If you do/use anything in this
# script that is not part of a stable API (relying on files to be in
# specific places, specific tools, specific output, etc) there is a
# possibility you will end up with a broken system after patching or
# upgrading.  Changes are not supported unless under direction of
# VMware support.
LOGS=/vmfs/volumes/sharedstore/tmp/`hostname`.txt

LOGS=でログファイルの出力先を指定。
「/sharedstore/tmp/」は適宜環境に応じて調整のこと。

date >> $LOGS
vim-cmd vmsvc/getallvms >> $LOGS

この段階での、このESXiホストが管理している仮想マシン一覧を取得。

sleep 300
date >> $LOGS
vim-cmd vmsvc/getallvms >> $LOGS

300秒待ったあと、再度、仮想マシン一覧を取得。
ここでウェイトを入れなかった場合、ESXi間での共有ファイルロックがおかしくなったようで、vMotionがうまくできなくなったという事例が発生した。
どれくらい待てばいいのかという最適値は不明。とりあえず切りよく300秒としただけ。

for vmid in `vim-cmd vmsvc/getallvms | grep "sharedstore" | awk '{ print $1 }'`
do
        vim-cmd vmsvc/power.on $vmid
        sleep 5
done

仮想マシン一覧を「vim-cmd vmsvc/getallvms」で取得し、そのなかから、起動したい仮想マシンだけをうまいこと選択できるキーワードを使ってgrepで抜き出し、その最初の数字を抜き出す。
その数字の仮想マシンをpower.onする。
という感じ。

今回は「sharedstore」という文字列が入っているものを起動させている。
ここら辺は、うまいことやる必要がある。

仮想マシンの台数が多いときは、この部分を2つに分けて、最初のforループでは、vCSAの起動を。
そこから2分(sleep 120)ぐらい間を置き、
次のforループでは、それ以外の仮想マシンを起動するようにした方がいいと思う。

date >> $LOGS
echo "boot finished" >> $LOGS
exit 0

警告:保証がある、という方向性で考えると、UPSソリューションズの「シャットダウンボックス UPSS-SDB02」など、外部機器を用意し、そちらからコントロールする手法をお薦めします。

Leave a Comment


NOTE - You can use these HTML tags and attributes:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>