2012-08-15追記
VMware ESXi 5.0 update 1のAutoStartManagerがBugFixされていたで、AutoStartManagerがBugFixされていたことを書いています。
『VMware ESXi 5.0 update 1のAutoStartManagerの件』で「起動も含めてもうちょっとこうマシなやつを…」と書いたんですけど、少し調べるとAutoStartManagerがバグっぽい挙動してて、ちょいと書いてみれば良さ気な雰囲気が漂っていたので、とりあえずスクリプトを書いてみました。
即興で書いたので足りない部分も多々あるし、おかしかったり無駄だったりする処理もあるだろうし、見にくい部分もあったりしますが、そこはまぁ適当に補正してください。(つーかメンテナンスするつもりもあんまりないんですが…)
なおこれを使う場合、くれぐれも自己責任の下で実施してくださいね。
当然サポート範囲外でしょうし、何か不具合が起きても当然ながら私では責任は取れませんし、何より私が書いたスクリプトっていう時点でもうね……orz
というか、このブログ等で私が書いていることがほとんどの場合、自己責任の下で実施してもらう必要がものばかりなわけですが^^;
環境とか
ここではデータストアを “datastore1” とし、その “datastore1” に “bin” というディレクトリを作成して “vmware-autostart.sh” というスクリプトを設置します。
フルパスで書くと “/vmfs/volumes/datastore1/bin/vmware-autostart.sh” となります。
この辺の値は適当に自分の環境に置き換えてください。
また、完全ではないのですが、vSphere Client の『仮想マシンと起動およびシャットダウン』で自動起動/自動シャットダウンを設定されている仮想マシンの取得と、起動/シャットダウンの遅延時間を取得するようにしますので、設定自体は通常のように下のGUIで出来るようになるはずです。
/etc/rc.local の設定
ではまず、”/etc/rc.local” に次の行を追加します。
## AutoStartVMs sed -i 's@/sbin/vmware-autostart.sh stop@sh /vmfs/volumes/datastore1/bin/vmware-autostart.sh stop@g' /sbin/shutdown.sh sh /vmfs/volumes/datastore1/bin/vmware-autostart.sh start
1行目は “/sbin/shutdown.sh” に書かれている “/sbin/vmware-autostart.sh stop” という部分を、”sh /vmfs/volumes/datastore1/bin/vmware-autostart.sh stop” という記述に置き換えています。
2行目は “sh /vmfs/volumes/datastore1/bin/vmware-autostart.sh” を “start” という引数で実行しています。
この2行目の記述が、AutoStartManagerで自動起動設定している仮想マシンを起動する動作となります。
スクリプトの設置
次に “/vmfs/volumes/datastore1/bin” に “vmware-autostart.sh” を設置します。
中身は次の通りです。
#!/bin/sh # # Copyright (C) 2012 Lunatilia.net # # ShellID : vmware-autostart.sh # Date : 2012/04/19 # Version : 0.1a # Author : Mitsuki Shirase # #--------------------------------------- # Env #--------------------------------------- export PATH=/bin:/sbin SCRIPT_DIR=$( cd $(dirname $0); pwd ) VIMSH=/bin/vim-cmd ROOT_USER="root" INC=0 #--------------------------------------- # Get AutoStart Config #--------------------------------------- GET_AUTOSTARTSEQ="hostsvc/autostartmanager/get_autostartseq" GET_DEFAULT="hostsvc/autostartmanager/get_default" #--------------------------------------- # VMIDs save file #--------------------------------------- AUTOSTARTVMID="/AutoStartVMID" AUTOSTOPVMID="/AutoStopVMID" #--------------------------------------- # Delay parameter #--------------------------------------- START_DELAY=$( ${VIMSH} -U ${ROOT_USER} ${GET_DEFAULT} | grep startDelay | grep -o "[0-9]\{1,\}" ) STOP_DELAY=$( ${VIMSH} -U ${ROOT_USER} ${GET_DEFAULT} | grep stopDelay | grep -o "[0-9]\{1,\}" ) #--------------------------------------- # Number of VMIDs #--------------------------------------- NUMBER_OF_VMS=$( ${VIMSH} -U ${ROOT_USER} ${GET_AUTOSTARTSEQ} | grep vim.VirtualMachine | grep -o "[0-9]\{1,\}" | wc -l ) #--------------------------------------- # Get VMIDs #--------------------------------------- ${VIMSH} -U ${ROOT_USER} ${GET_AUTOSTARTSEQ} | grep vim.VirtualMachine | grep -o "[0-9]\{1,\}" > ${SCRIPT_DIR}${AUTOSTARTVMID} echo > ${SCRIPT_DIR}${AUTOSTOPVMID} while read BUFF do sed -i "1i ${BUFF}" ${SCRIPT_DIR}${AUTOSTOPVMID} done < ${SCRIPT_DIR}${AUTOSTARTVMID} sed -i '$d' ${SCRIPT_DIR}${AUTOSTOPVMID} #--------------------------------------- # AutoStart VMs #--------------------------------------- vmware_autostart_vms() { if [ ${NUMBER_OF_VMS} -eq 0 ]; then logger -t 'VMware[startup]' " Not defined." exit fi logger -t 'VMware[startup]' " Starting VMs(custom script)" while read VMID do ${VIMSH} vmsvc/power.on ${VMID} logger -t 'VMware[startup]' " Starting VMID ${VMID}." INC=`expr ${INC} + 1` if [ ${INC} -eq ${NUMBER_OF_VMS} ]; then break fi sleep ${START_DELAY} done < ${SCRIPT_DIR}${AUTOSTARTVMID} } #--------------------------------------- # AutoStop VMs #--------------------------------------- vmware_autostop_vms() { if [ ${NUMBER_OF_VMS} -eq 0 ]; then logger -t 'Vmware[shutdown]' " Not defined." fi logger -t 'VMware[shutdown]' " Stopping VMs(custom script)" while read VMID do ${VIMSH} vmsvc/power.shutdown ${VMID} logger -t 'VMware[shutdown]' " Stopping VMID ${VMID}." INC=`expr ${INC} + 1` if [ ${INC} -eq ${NUMBER_OF_VMS} ]; then break fi sleep ${STOP_DELAY} done < ${SCRIPT_DIR}${AUTOSTOPVMID} } #--------------------------------------- # Usage #--------------------------------------- usage() { echo "Usage: `basename "$0"` {start|stop|restart}" } #--------------------------------------- # Call function #--------------------------------------- case $1 in "start") vmware_autostart_vms ;; "stop") vmware_autostop_vms ;; "restart") vmware_autostop_vms vmware_autostart_vms ;; *) usage exit 1 esac
“Env” はまぁそのまんま。
“Get AutoStart Config” は、自動起動/自動シャットダウンが設定されている仮想マシンのVMID取得と、遅延時間の取得に必要なコマンドを書いています。
“VMIDs save file” は、自動起動/自動シャットダウンが設定されている仮想マシンのVMIDを格納するリストファイルの名前を書いています。
“Delay parameter” は、起動時の遅延時間と、シャットダウン時の遅延時間を取得しています。
“Number of VMIDs” は、自動起動/自動シャットダウンが設定されている仮想マシンの数を取得しています。
“Get VMIDs” は、自動起動/自動シャットダウンが設定されている仮想マシンのVMIDを取得して、ファイルに吐き出しています。
また、シャットダウン時に起動時の逆順に処理するためのリストも作成しています。
“AutoStart VMs” は、取得したVMIDを読み込んで、実際に仮想マシンを起動する処理を実行しています。
“AutoStop VMs” は、逆順処理用のリストからVMIDを読み込んで、実際に仮想マシンをシャットダウンする処理を実行しています。
とりあえずここに貼るときにコピーミスをしていなければ、一応の動作確認はしていますので動くと思います。
しかも一度設置してしまえば、vSphere Clientからの シャットダウン/再起動 でも動きますので、毎回sshでコマンドを叩く必要はありません。
とりあえずこれで今日のところは勘弁してください(´・ω・`)
むしろどなたか、しっかりした例外処理とか、個別の仮想マシンの自動起動/自動シャットダウン対応とかを実装した「完全版スクリプト」をください……w
おはようございます。評価ライセンスが切れてから、自動起動しなくなって悩んでいて、こちらを見つけました。大変参考になり、感謝です。
早速使わせて頂きましたが、このままでは startAction = “None” のマシンまで起動してしまいますので、VIMSHの結果の処理を以下のようにしてみました。
${VIMSH} -U ${ROOT_USER} ${GET_AUTOSTARTSEQ} | egrep ‘vim.VirtualMachine|startAction’|sed ‘Ns/\(.*\)\n/\1/’|grep PowerOn | grep -o “[0-9]\{1,\}”
これで、startActionがPowerOnのものだけが起動するはずです。
ご参考になれば。
> bignumorgさん
コメントありがとうございます。
あまり深くは追っていなかったもので、こちらのスクリプトではいろいろと見逃しているところがあったかと思います。
startActionについて、ご指摘ありがとうございました。
是非とも参考にさせていただきたく思います。
初めまして。
評価ライセンスの期限が切れたとたん、自動起動しないで悩んでいたところ、こちらを見つけました。大変参考になり、助かりました。
このスクリプトですと、startAction = “None”のマシンまで起動してしまいますので、VIMSHの出力処理を以下のようにしてみました。
${VIMSH} -U ${ROOT_USER} ${GET_AUTOSTARTSEQ} | egrep ‘vim.VirtualMachine|startAction’|sed ‘Ns/\(.*\)\n/\1/’|grep PowerOn | grep -o “[0-9]\{1,\}”
これで、startAction = “PowerOn”のものだけ起動するはずです。
ご参考になれば幸いです。
はじめまして
起動時に遅延時間を個別の設定に従うようにしました。
また、vSphere Clientで立ち上げたVMも同時に落とせるようにしました。
詳細は、以下のソースを見てください。
#!/bin/sh
#——————————————-
# Copyright (C) 2012 Lunatilia.net
#
# ShellID : vmware-autostart.sh
# Date : 2012/04/30
# Version : 0.2a
# Author : Mitsuki Shirase, modified by bignumorg / Iwamoto
#——————————————-
#—————————————
# Define Environment Variable
#—————————————
export PATH=/bin:/sbin
SCRIPT_DIR=$( cd $(dirname $0); pwd )
VIMSH=/bin/vim-cmd
ROOT_USER=”root”
#—————————————
# Define AutoStartManager commands
#—————————————
GET_AUTOSTARTSEQ=”hostsvc/autostartmanager/get_autostartseq”
GET_DEFAULT=”hostsvc/autostartmanager/get_default”
GET_STATE=”vmsvc/power.getstate”
CMD_POWERON=”vmsvc/power.on”
CMD_SHUTDOWN=”vmsvc/power.shutdown”
CMD_POWEROFF=”vmsvc/power.off”
CMD_SUSPEND=”vmsvc/power.suspend”
CMD_MESSAGE=”vmsvc/message”
#—————————————
# Define Work Files
#—————————————
AUTORUN_DEF=${SCRIPT_DIR}”/Auto_”$1″_Default.dat”
AUTORUN_TEMP=${SCRIPT_DIR}”/Auto_”$1″_Temp.dat”
AUTORUN_SEQ=${SCRIPT_DIR}”/Auto_”$1″_Seq.dat”
AUTORUN_WORK=${SCRIPT_DIR}”/Auto_”$1″_Work.dat”
rm #{AUTORUN_DEF}
rm ${AUTORUN_TEMP}
rm ${AUTORUN_SEQ}
rm ${AUTORUN_WORK}
#——————————————-
# Make VM List
#——————————————-
make_vm_list() {
##logger -t “VMware[Auto Start/Stop ]” ” Debug : Starting [make_vm_list]”
_status=255
INC=0
RETRY_MAX=15
DELAY_TIME=2
while [ ${_status} -ne 0 ]
do
${VIMSH} -U ${ROOT_USER} ${GET_AUTOSTARTSEQ} > ${AUTORUN_TEMP}
_status=$?
if [ ${_status} -ne 0 ]
then
INC=`expr ${INC} + 1`
if [ ${INC} -gt ${RETRY_MAX} ]
then
logger -t “VMware[Auto Start/Stop ]” ” get_autostartseq Command Failed ; Retry over ${RETRY_MAX} times”
break
fi
##logger -t “VMware[Auto Start/Stop ]” ” Debug : get_autostartseq Command Failed RC=${_status} ; Retry after ${DELAY_TIME} second”
sleep ${DELAY_TIME}
fi
done
if [ ${_status} -ne 0 ]
then
logger -t “VMware[Auto Start/Stop ]” ” Command Failed RC=${_status} ; ${GET_AUTOSTARTSEQ}”
return ${_status}
fi
##logger -t “VMware[Auto Start/Stop ]” ” Debug : Command Normal End ; ${GET_AUTOSTARTSEQ}”
egrep ‘key|startOrder|Action|Delay’ ${AUTORUN_TEMP} | sed ‘NNNNNs/\n//g ; s/ //g ; s/Guest//g’ > ${AUTORUN_SEQ}
NUMBER_OF_VMS=$( wc -l ${AUTORUN_SEQ} | grep -o “[0-9]\{1,\}” )
if [ ${NUMBER_OF_VMS} -lt 1 ]
then
logger -t “VMware[Auto Start/Stop ]” ” no VM defined.”
return 1
fi
##logger -t “VMware[Auto Start/Stop ]” ” Debug : GET_AUTOSTARTSEQ into ${AUTORUN_SEQ}”
}
#——————————————-
# get Default Values
#——————————————-
get_default_values() {
##logger -t “VMware[Auto Start/Stop ]” ” Debug : Starting [get_default_values]”
_status=255
INC=0
RETRY_MAX=5
DELAY_TIME=1
while [ ${_status} -ne 0 ]
do
${VIMSH} -U ${ROOT_USER} ${GET_DEFAULT} > ${AUTORUN_DEF}
_status=$?
if [ ${_status} -ne 0 ]
then
INC=`expr ${INC} + 1`
if [ ${INC} -gt ${RETRY_MAX} ]
then
logger -t “VMware[Auto Start/Stop ]” ” get_default Command Failed ; Retry over ${RETRY_MAX} times”
break
fi
##logger -t “VMware[Auto Start/Stop ]” ” Debug : get_default Command Failed RC=${_status} ; Retry after ${DELAY_TIME} second”
sleep ${DELAY_TIME}
fi
done
if [ ${_status} -ne 0 ]
then
logger -t “VMware[Auto Start/Stop ]” ” Command Failed RC=${_status} ; ${GET_DEFAULT}”
DEF_START_DELAY_TIME=120
DEF_STOP_DELAY_TIME=120
DEF_STOP_ACTION=”PowerOff”
else
##logger -t “VMware[Auto Start/Stop ]” ” Debug : Command Normal End ; ${GET_DEFAULT}”
DEF_START_DELAY_TIME=$( grep startDelay ${AUTORUN_DEF} | grep -o “[0-9]\{1,\}” )
DEF_STOP_DELAY_TIME=$( grep stopDelay ${AUTORUN_DEF} | grep -o “[0-9]\{1,\}” )
DEF_STOP_ACTION=$( grep stopAction ${AUTORUN_DEF} | grep -o \”.*\” | grep -o “[^\”]\{1,\}” )
fi
##AUTO_MESSAGE=”StartDelay=${DEF_START_DELAY_TIME} StopAction=${DEF_STOP_ACTION} StopDelay=${DEF_STOP_DELAY_TIME}”
##logger -t “VMware[Auto shutdown ]” ” ${AUTO_MESSAGE}”
}
#——————————————-
# Edit Auto Start/Stop VMs Parameter
#——————————————-
edit_paramerter() {
##logger -t “VMware[Auto Start/Stop ]” ” Debug : Starting [edit_paramerter]”
VMID=$( echo ${BUF_key} | grep -o “[0-9]\{1,\}” )
START_DELAY_TIME=$( echo ${BUF_startDelay} | grep -o “[0-9-]\{1,\}” )
START_ORDER=$( echo ${BUF_startOrder} | grep -o “[0-9-]\{1,\}” )
START_ACTION=$( echo ${BUF_startAction} | grep -o \”.*\” | grep -o “[^\”]\{1,\}” )
STOP_DELAY_TIME=$( echo ${BUF_stopDelay} | grep -o “[-0-9]\{1,\}” )
STOP_ACTION=$( echo ${BUF_stopAction} | grep -o \”.*\” | grep -o “[^\”]\{1,\}” )
if [ ${VMID} -gt 0 ]
then
VM_STATE=$( ${VIMSH} ${GET_STATE} ${VMID} | tail -1 )
## ++<>++ ##
if [ ${START_DELAY_TIME} -lt 0 ]; then
START_DELAY_TIME=${DEF_START_DELAY_TIME}
fi
## ++<>++ ##
if [ ${STOP_DELAY_TIME} -lt 0 ]; then
STOP_DELAY_TIME=${DEF_STOP_DELAY_TIME}
fi
## ++<>++ ##
if [ ${STOP_ACTION} = “SystemDefault” ]
then
STOP_ACTION=${DEF_STOP_ACTION}
fi
else
VM_STATE=”UnDefine”
fi
}
#——————————————-
# AutoStart VMs
#——————————————-
vmware_autostart_vms() {
##logger -t “VMware[Auto Startup ]” ” Debug : Starting : [vmware_autostart_vms]”
grep PowerOn ${AUTORUN_SEQ} > ${AUTORUN_WORK}
NUMBER_OF_VMS=$( wc -l ${AUTORUN_WORK} | grep -o “[0-9]\{1,\}” )
if [ ${NUMBER_OF_VMS} -lt 1 ]
then
logger -t “VMware[Auto Startup ]” ” Start VM not defined.”
return
fi
logger -t “VMware[Auto Startup ]” ” AutoStart VM Number=${NUMBER_OF_VMS} ”
INC=0
while read BUF_key BUF_startOrder BUF_startDelay BUF_startAction BUF_stopDelay BUF_stopAction
do
edit_paramerter
AUTO_MESSAGE=”VMID=${VMID} Order=${START_ORDER} Action=${START_ACTION} Delay=${START_DELAY_TIME}.”
##logger -t “VMware[Auto Startup ]” ” Debug : Buffer Values : ${AUTO_MESSAGE}”
if [ ${VMID} -gt 0 ]
then
if [ ${VM_STATE} = “Powered on” ]
then
##AUTO_MESSAGE=” VMID = ${VMID} Delay=${START_DELAY_TIME} State=${VM_STATE}.”
##logger -t “VMware[Auto Startup ]” ” Debug : VM Start Skip ; ${AUTO_MESSAGE}”
continue
fi
AUTO_MESSAGE=”VMID=${VMID} Order=${START_ORDER} Delay=${START_DELAY_TIME} State=${VM_STATE}.”
logger -t “VMware[Auto Startup ]” ” PowerOn VM now ; ${AUTO_MESSAGE}”
${VIMSH} ${CMD_POWERON} ${VMID}
_status=$?
if [ ${_status} -eq 0 ]
then
INC=`expr ${INC} + 1`
## ++<>++ ##
if [ ${START_ORDER} -gt 0 ]
then
sleep ${START_DELAY_TIME}
fi
else
logger -t “VMware[Auto Startup ]” ” PowerOn VM Failed RC=${_status} – Skip ; VMID=${VMID}”
fi
fi
done ${AUTORUN_WORK}
_status=$?
if [ ${_status} -ne 0 ]
then
logger -t “VMware[Auto shutdown ]” ” Reverce Work File Failed RC=${_status}”
return ${_status}
fi
NUMBER_OF_VMS=$( wc -l ${AUTORUN_WORK} | grep -o “[0-9]\{1,\}” )
if [ ${NUMBER_OF_VMS} -lt 1 ]
then
logger -t “Vmware[Auto shutdown ]” ” Stop VM not defined.”
return
fi
logger -t “VMware[Auto shutdown ]” ” Check AutoStop VM Number=${NUMBER_OF_VMS}”
INC=0
while read BUF_key BUF_startOrder BUF_startDelay BUF_startAction BUF_stopDelay BUF_stopAction
do
edit_paramerter
##logger -t “VMware[Auto shutdown ]” ” Debug : Buffer Values : VMID=${VMID} Action=${STOP_ACTION} Delay=${STOP_DELAY_TIME}.”
if [ ${VMID} -gt 0 ]
then
if [ “${VM_STATE}” != “Powered on” ]
then
##AUTO_MESSAGE=”VMID=${VMID} Action=${STOP_ACTION} Delay=${STOP_DELAY_TIME} State=${VM_STATE}.”
##logger -t “VMware[Auto shutdown ]” ” Debug : VM Stop Skip ; ${AUTO_MESSAGE}”
continue
fi
AUTO_MESSAGE=”VMID=${VMID} Order=${START_ORDER} Action=${STOP_ACTION} Delay=${STOP_DELAY_TIME} State=${VM_STATE}.”
case ${STOP_ACTION} in
“Suspend”)
logger -t “VMware[Auto shutdown ]” ” Suspend VM now ; ${AUTO_MESSAGE}”
${VIMSH} ${CMD_SUSPEND} ${VMID}
_status=$?
;;
“PowerOff”)
logger -t “VMware[Auto shutdown ]” ” PowerOff VM now ; ${AUTO_MESSAGE}”
${VIMSH} ${CMD_POWEROFF} ${VMID}
_status=$?
;;
*)
logger -t “VMware[Auto shutdown ]” ” Shutdown VM now ; ${AUTO_MESSAGE}”
${VIMSH} ${CMD_SHUTDOWN} ${VMID}
_status=$?
esac
if [ ${_status} -eq 0 ]
then
INC=`expr ${INC} + 1`
## ++<>++ ##
if [ ${START_ORDER} -gt 0 ]
then
sleep ${STOP_DELAY_TIME}
fi
else
logger -t “VMware[Auto shutdown ]” ” VM Stop Failed RC=${_status} – Skip ; VMID=${VMID}”
fi
fi
done < ${AUTORUN_WORK}
logger -t "VMware[Auto shutdown ]" " Stoped VM Number=${INC}"
}
#——————————————-
# Usage
#——————————————-
usage() {
echo "Usage: `basename "$0"` {start|stop|restart}"
}
#——————————————-
# Call function
#——————————————-
logger -t "VMware[Auto Start/Stop ]" " Start of $1 Process ; [$0]"
_status=0
make_vm_list
if [ ${_status} -eq 0 ]
then
get_default_values
IFS_SAVE=$IFS
IFS=,
case $1 in
"start")
vmware_autostart_vms
;;
"stop")
vmware_autostop_vms
;;
"restart")
vmware_autostop_vms
vmware_autostart_vms
;;
*)
logger -t "VMware[Auto Start/Stop ]" " Invalid Parameter ( $1 ) for $0"
usage
_status=1
esac
IFS=$IFS_SAVE
fi
logger -t "VMware[Auto Start/Stop ]" " End of $1 Process RC=${_status} ; [$0]"
exit ${_status}
コメントありがとうございます。
是非参考にさせていただきたく思います。
また勝手ながら、コメントに載せていただいたソースを、別エントリーの本文に掲載させていただきます。