鷲尾です。
本日は第2回目【コマンドレット利用編】となります。
前回までのあらすじ
(第1回目はこちら → AzureVMの起動・停止自動化によるコストの最適化【準備編】)
- Windows Azure PowerShellをダウンロード、インストール
- Azure PowerShellでコマンドレットが利用できるように認証
- Get-AzureVMコマンドで、動作確認
今回は実際に起動・停止それぞれのスクリプトとそれを呼び出すバッチを書いて、実行していきます。
※ここでは検証用環境として、クラウドサービス名に「TestCS-001」、AzureVM名に「TestVM-001」を使用します。
5.使用するコマンド
今回使用するコマンドは、以下の3つです。
- Get-AzureVM - 指定したAzureVMの一覧や、ステータスを取得します。
- Start-AzureVM - 指定したAzureVMを起動します。
- Stop-AzureVM - 指定してAzureVMを停止します。コマンド末尾に"-force"オプションをつけることで、コンファームオプションを省略することが出来ます。
6.起動用バッチと起動用スクリプト
今回Windows PowerShellで作成するスクリプトは、スクリプト単体でも動作しますが、今回は自動化のためにA-AUTOとの連携を行うので、バッチファイルからPowerShellを呼び出す構成としています。
作成するファイルは、以下の4つです。
・起動用バッチファイル
・起動用スクリプトファイル
・停止用バッチファイル
・停止用スクリプトファイル
それでは順に説明していきます。
※ダウンロードする各種サンプルは、2015年6月現在のインターフェースを基に記載しています。提供元でインターフェースが変更されるとことがありますので、最新の情報は各提供元でご確認ください。
【起動用バッチ:STARTAZ.bat】
起動用バッチのサンプルはこちらからダウンロードできます。
起動用バッチの概要は、以下のとおりです。
◆処理概要
パラメータの数をチェックし、StartAz.ps1からのリターンコードを受け取ります。
また、起動用スクリプトからの戻り値をA-AUTO 50へ返却します。
クラウドサービス名と、AzureVM名の2つのパラメータを用意します。
第1パラメータ:クラウドサービス名(必須)
第2パラメータ:AzureVM名(必須)
◆リターンコード
0:正常に終了した(AzureVMが正常に起動した)
1:起動しようとしたAzureVMが既に起動していた
4:必須パラメータが入力されていない
8:AzureVMの起動に失敗した
STARTAZ.bat
@echo off
set
date1=%date%
set
time1=%time: =0%
set
dt1=%date1% %time1%
echo
%dt1:~0,19% ### AzureVM start batch started. ServiceName=%1,Name=%2
cd %~dp0
set
PowerShellPath=C:\Windows\SysWOW64\WindowsPowerShell\v1.0\(※1)
set
ScriptPath=C:\BSP\AUW\INSTALL\PRIMSCRIPT\(※2)
if
"%1"=="" (
goto PARAM_INVALID
)
if
"%2"=="" (
goto PARAM_INVALID
)
%PowerShellPath%powershell.exe
-NoProfile -command "%ScriptPath%StartAz.ps1 %1 %2 ;exit
$LASTEXITCODE"
set
RC=%ERRORLEVEL%
goto END
:PARAM_INVALID
set
date2=%date%
set
time2=%time: =0%
set
dt2=%date2% %time2%
echo
%dt2:~0,19% ### parameter invalid.
set RC=4
goto END
:END
set
date3=%date%
set
time3=%time: =0%
set
dt3=%date3% %time3%
echo
%dt3:~0,19% ### AzureVM start batch ended (RC=%RC%). ServiceName=%1,Name=%2
exit %RC%
※1 PowerShellのパスを設定する際は、ご自身の環境に合わせて、以下のように設定します。
【32ビットOSの場合】
C:\Windows\system32\WindowsPowerShell\v1.0\powershell.exe
【64ビットOSの場合】
C:\Windows\Sysnative\WindowsPowerShell\v1.0\powershell.exe
64ビットOSでの注意点
A-AUTO モニタは32ビットアプリケーションのため、32ビット版のpowershell.exeのパスを指定してください。
※2 スクリプトファイルの保存先を指定してください。
サンプルはA-AUTO 50のバッチファイル格納ディレクトリと同一にしています。
【起動用スクリプトファイル:StartAz.ps1】
起動用スクリプトのサンプルはこちらからダウンロードできます。
起動用スクリプトの概要は、以下のとおりです。
◆処理概要
起動用バッチから受け取ったパラメータを使用して、指定したサービス名とAzureVM名が実在するかどうかをチェックし、AzureVMが停止していれば起動コマンドを発行します。
起動コマンド発行後、指定回数以内(サンプルでは30秒毎に10回ステータスを確認します)にAzureVMが起動できたかチェックし、起動結果を返却します。
◆パラメータ
クラウドサービス名と、AzureVM名の2つのパラメータを受け取ります。
第1パラメータ:クラウドサービス名
第2パラメータ:AzureVM名
◆リターンコード
0:正常に終了した(AzureVMが正常に起動した)
1:起動しようとしたAzureVMが既に起動していた
4:必須パラメータが入力されていない
8:AzureVMの起動に失敗した
StartAz.ps1
Param(
$servicename,
$vmname
)
$cnt = 0
$checkloop
= 10
$checkspan
= 30
$VM_STARTED_RC
= 0
$ALREADY_STARTING_VM_RC
= 1
$PARAM_INVALID_RC
= 4
$FAILD_VM_START_RC
= 8
#サブルーチン定義
#インスタンス起動完了
function
VM_STARTED($FinTime)
{
echo "$FinTime ### VM start
successful."
RETURN_END $VM_STARTED_RC
}
#既にインスタンスが起動していた
function
ALREADY_STARTING_VM($ReceiveVMname,$FinTime)
{
echo "$FinTime ### Start-AzureVM not
called because vm name $ReceiveVMname was allready running."
RETURN_END $ALREADY_STARTING_VM_RC
}
#クラウドサービス名が不正
function
NOT_FOUND_CLOUDSERVICE($ReceiveServicename,$FinTime)
{
echo "$FinTime ### No deployment found
in service: $ReceiveServicename"
RETURN_END $PARAM_INVALID_RC
}
#インスタンス名が不正
function
NOT_FOUND_VM($ReceiveVMname,$FinTime)
{
echo "$FinTime ### $ReceiveVMname is
not exist."
RETURN_END $PARAM_INVALID_RC
}
#一定時間内にインスタンスの起動が確認できなかった
function
FAILD_VM_START($FinTime)
{
echo "$FinTime ### VM start
failed."
RETURN_END $FAILD_VM_START_RC
}
#バッチへリターンコードを返却
function
RETURN_END($ReturnBatchRC)
{
EXIT $ReturnBatchRC
}
#メイン処理
#クラウドサービスから情報取得
$azurevminfo
= (Get-AzureVM -ServiceName $servicename)
#クラウドサービスの存在確認
if
($azurevminfo.length -eq 0)
{
$time = get-date -Format "yyyy/MM/dd
HH:mm:ss:ss"
NOT_FOUND_CLOUDSERVICE $servicename $time
}
#インスタンスの存在確認
$azurevminfo
= (Get-AzureVM -ServiceName $servicename -Name $vmname)
if
($azurevminfo.length -eq 0)
{
$time = get-date -Format "yyyy/MM/dd
HH:mm:ss"
NOT_FOUND_VM $vmname $time
}
#クラウドサービス、インスタンス名がともに正しい
#インスタンスステータス確認
if
($azurevminfo.InstanceStatus -ne "StoppedDeallocated")
{
$time = get-date -Format "yyyy/MM/dd
HH:mm:ss"
ALREADY_STARTING_VM $vmname $time
}
#インスタンス起動
Start-AzureVM
-ServiceName $servicename -Name $vmname
$time =
get-date -Format "yyyy/MM/dd HH:mm:ss"
echo
"$time ### VM starting..."
#起動確認(<)
while
($cnt -lt $checkloop)
{
# 30秒スリープ
Start-Sleep -s $checkspan
# 結果を変数に格納
$time = get-date -Format "yyyy/MM/dd
HH:mm:ss"
echo "$time ### Checking vm
status..."
$azurevminfo = (Get-AzureVM -ServiceName
$servicename -Name $vmname)
$time = get-date -Format "yyyy/MM/dd
HH:mm:ss"
$str1 = "$time ### VM status :
"
$str2 = $str1 + $azurevminfo.InstanceStatus
echo $str2
if ($azurevminfo.InstanceStatus -eq
"ReadyRole")
{
$time = get-date -Format
"yyyy/MM/dd HH:mm:ss"
VM_STARTED $time
}
$cnt++
$time = get-date -Format "yyyy/MM/dd
HH:mm:ss"
echo "$time ### VM status check count
= $cnt"
}
#スタートに失敗
$time =
get-date -Format "yyyy/MM/dd HH:mm:ss"
FAILD_VM_START
$time
【停止用バッチファイル:StartAz.ps1、停止用スクリプトファイル:StartAz.ps1】
停止用バッチ、停止用スクリプトは基本的に起動用ファイルと動作は変わらないので、説明は割愛します。なお、各ファイルの詳細はサンプルを参照してください。
停止用バッチのサンプルはこちらからダウンロードできます。
停止用スクリプトのサンプルはこちらからダウンロードできます。
※ バッチサンプル、スクリプトサンプルの拡張子は、".txt"となっています。
使用する際は、それぞれ以下のようにリネームしてご利用ください。
・起動
STARTAZ.txt → STARTAZ.bat
StartAz.txt → StartAz.ps1
・停止
STOPAZ.txt → STOPAZ.bat
StopAz.txt → StopAz.ps1
◆手作業による実行
それでは、A-AUTO 50と連携させる前に、手動でバッチファイルとスクリプトファイルを実行して、正しく動作することを確認してみましょう。