コードサンプル
今回作成したXenServer上のすべての仮想マシン(Running状態)のVolumeスナップショットを自動作成するための実装を説明します。
以下のコードをテキストエディタにコピーし、拡張子を.ps1で保存後、XenServer SDK for Windows PowershellのPSSnapIn上で次のように実行することにより動作することを確認可能となります。
PS1 C:\Program Files\Citrix\XenServerPsSnapIn>AutomatedSnapShot.ps1 <スクリプトログファイルのパス> <XenServerホストのURL> root <rootのパスワード>
# Quince スナップショット自動化 param($out_xml, $url, $usr, $pwd) #変数の初期化(はじまり) $BestEffort = $false $NoWarnCertificates = $true $info = $true $warn = $true $err = $true $prog = $false $Eap = $ErrorActionPreference $Vp = $VerbosePreference $Wp = $WarningPreference $Ep = $ErrorPreference $ErrorActionPreference = "Stop" $VerbosePreference="Continue" $WarningPreference="Continue" $ErrorPreference="Continue" $ErrorVariable #変数初期化(おわり) # 内部ユーティリティ関数(はじまり) function prep_xml_output([String]$out_file) { $date = Get-Date "<results>" > $out_file ("<testrun>Test Run Info: PowerShell bindings test {0}</testrun>" -f $date) >> $out_file "<group>" >> $out_file } function close_xml_output([String]$out_file) { "</group>" >> $out_file "</results>" >> $out_file } function log_info([String]$msg) { process { if($info) { write-verbose $msg } } } function log_warn([String]$msg) { process { if($warn) { write-warning $msg } } } function log_error([String]$msg) { process { if($err) { write-error $msg } } } # 内部ユーティリティ関数(おわり) # テーブルに登録された各種関数の処理関数(はじまり) function exec([String]$test_name, [String]$cmd, [String]$expected) { trap [Exception] { add_result $out_xml $cmd $test $_.Exception $fails.Add($test_name, $_.Exception) break } log_info ("Test '{0}' Started: cmd = {1}, expected = {2}" -f $test_name,$cmd,$expected) $result = Invoke-Expression $cmd if ($result -eq $expected) { add_result $out_xml $cmd $test_name $null return $true } else { $exc = new-object Exception("Test '{0}' Failed: expected '{1}'; actual '{2}'" -f $test_name,$expected,$result) add_result $out_xml $cmd $test_name $exc $fails.Add($test_name, $exc) return $false } } # XenServerへのセッション確立(はじまり) function connect_server([String]$url, [String]$usr, [String]$pwd) { log_info ("connecting to server '{0}' '{1}', '{2}'" -f $url, $usr, $pwd) $session = Connect-XenServer -url $url -user $usr -password $pwd if($session.uuid -ne $null) { return "" } else { return $null } } #確立されたセッションの切断(はじまり) function disconnect_server([String]$url) { log_info ("disconnecting from server '{0}'" -f $url) Disconnect-XenServer -url $url return "" } #確立されたセッションの切断(おわり) #指定したXenAPI.VMクラスのインスタンスごとに # quiesceスナップショットを作成(はじまり) function snapshotwithquiesce_vm([XenAPI.VM]$vm, [String]$new_name) { log_info ("snapshotting vm '{0}' to '{1}'" -f $vm.name_label,$new_name) $vm = Invoke-XenServer:VM.snapshot -VM $vm -NewName $new_name return Get-XenServer:VM -name $new_Name } #XenServer上のすべての実行状態にある仮想マシン(Control Domainは除く) #に対してスナップショットの作成(はじまり) function snapshotwihquiesce_running_allvms() { $new_name = Get-Date $running_vm_count=0 foreach ($vm in Get-XenServer:VM) { if ($vm.power_state -ne "Running") { continue } elseif($vm.is_control_domain) { continue } else { $running_vm_count++ snapshotwithquiesce_vm $vm $new_name log_info("powerstate:'{0}', '{1}'" -f $vm.power_state, $vm.name_label) } } log_info ("snapshotting running all vm count '{0}'" -f $running_vm_count) } #XenServer上のすべての実行状態にある仮想マシン(Control Domainは除く) #に対してスナップショットの作成(おわり) #自動化ステップをTableに登録しておく(はじまり) $tests = @( @("Connect Server", "connect_server $url $usr $pwd", ""), @("Snapshotting runnging all vms", "snapshotwihquiesce_running_allvms", ""), @("Disconnect Server", "disconnect_server $url", "") ) #自動化ステップをTableに登録しておく(おわり) #本スクリプトのメイン処理(はじまり) $complete = 0; $max = $tests.Count; $fails = @{} prep_xml_output $out_xml foreach($test in $tests) { trap [Exception] { # we encountered an exception in running the test before it completed # its already been logged, so continue continue } $success = $false #テーブルに登録した各ステップ(1-3)の実行 $success = exec $test[0] $test[1] $test[2] if ($success) { $complete++ } } close_xml_output $out_xml $result = "Result: {0} completed out of {1}" -f $complete,$max; write-host $result -f 2 if($fails.Count -gt 0) { write-host "Failures:" $fails } $ErrorActionPreference = $Eap $VerbosePreference = $Vp $WarningPreference = $Wp $ErrorPreference = $Ep #本スクリプトのメイン処理(おわり)