SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

XenServer自動化スクリプティング集

XenServer SDK for PowerShellを使った仮想マシンのバックアップ自動化

XenServerスクリプティング(2)

コードサンプル

 今回作成したXenServer上のすべての仮想マシン(Running状態)のVolumeスナップショットを自動作成するための実装を説明します。

 以下のコードをテキストエディタにコピーし、拡張子を.ps1で保存後、XenServer SDK for Windows PowershellのPSSnapIn上で次のように実行することにより動作することを確認可能となります。

AutomatedSnapShot.ps1の実行
PS1 C:\Program Files\Citrix\XenServerPsSnapIn>AutomatedSnapShot.ps1 <スクリプトログファイルのパス> <XenServerホストのURL> root <rootのパスワード>
AutomatedSnapShot.ps1
# 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

#本スクリプトのメイン処理(おわり)

参考文献

  1. XenServer SDK for PowerShellを使ったXenServer仮想環境の自動化
  2. XenServer SDK API Reference
  3. XenServer SDK for Windows PowerShellサンプルコード
  4. Microsoft TechNet 「Recovery and Reliability Technologies

この記事は参考になりましたか?

連載通知を行うには会員登録(無料)が必要です。
既に会員の方はを行ってください。
XenServer自動化スクリプティング集連載記事一覧
この記事の著者

シトリックス・システムズ・ジャパン株式会社(シトリックス・システムズ・ジャパン カブシキガイシャ)

シトリックス・システムズ・ジャパン株式会社

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/5287 2010/07/19 14:00

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー