vSphere環境の仮想マシンの操作をPowerShellベースのコマンドで操作することができる「PowerCLI」は広く使われているツールであるが、実はPowerCLIは、vRealize Operations Manager (vROps) やVMware Site Recovery Manager (以下SRM) といった他のVMware製品群の操作をすることができる。
今回、実際にSRMに対してPowerCLIを使って操作をしてみたのだが、当初はGet-XXXとかStart-XXX
といったPowerShellの構文によるコマンド実行ができると予想していた。しかし、SRMの操作コマンドは通常のPowerCLIのコマンド体系と大きく異なっており、SRMのリカバリプラン実行にたどり着くまでかなりの苦労を要した。
今回は、その苦労の備忘を兼ねて、PowerCLIでSRMのリカバリプランを実行する手順を記載することにする。
環境
環境としては以下の通り。SRMはアプライアンス版を使用して確認を行った。
- vCSA 6.7 Update 3
- SRM 8.2.0、ビルド 14761908
- VMware PowerCLI 12.0.0 build 15947286
PowerCLIにSRMを操作するためのモジュールは含まれているので、個別にインストール等の作業は不要となる。PowerCLIのインストール手順は、以前記事にしているので参照いただきたい。
PowerCLIでSRMに接続
まずは、リカバリサイト側に配置されるvCenter ServerにPowerCLIで接続する。これはいつも通り、Connect-VIServer
のコマンドレットを使えばよい。
PS C:\> Connect-VIServer 192.168.11.170 -User administrator@vsphere.local -Password XXXXXXXX -Force
繰り返しになるが、必ずリカバリサイト側のvCenter Serverに接続すること。保護サイト側に接続してSRMを操作しようとしても、以下メッセージが表示されてリカバリの実行で失敗するので注意。
PS C:\> $rp.start($RPmode)
"1" 個の引数を指定して "Start" を呼び出し中に例外が発生しました: "This operation is not allowed in the current state."
発生場所 行:1 文字:1
+ $rp.start($RPmode)
+ ~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (:) [], MethodInvocationException
+ FullyQualifiedErrorId : VimException
次にSRMに接続する。SRMにはConnect-SrmServer
コマンドレットを使う。ここで注意事項として、アプライアンス版のSRMの仮想マシンを使う場合は-Port 443
オプションを付ける必要がある。これがわからずに、いつまでも接続ができず非常に時間を要した。
PS C:\> Connect-SrmServer -Port 443
ServiceUri : https://t1174vsrm.intrat.local/vcdr/extapi/sdk
SessionSecret : "b1063f9def0c841c25c2e74e5f9e68ffd68f14c9"
User : VSPHERE.LOCAL\Administrator
IsConnected : True
Port : 443
Version : 8.2.0
Build : 14761908
ProductLine : srm
InstanceUuid : a5bec4a1-3959-4324-9b82-f3317d24b262
RefCount : 1
ExtensionData : VMware.VimAutomation.Srm.Views.SrmServiceInstance
Uid : /SrmServer=vsphere.local\administrator@t1174vsrm.intrat.local:443/
Id : /SrmServer=vsphere.local\administrator@t1174vsrm.intrat.local:443/
Name : t1174vsrm.intrat.local
IsInUse : True
SRMの接続時のパラメータは$global:DefaultSrmServers
という変数に代入される。長いので、短い変数に代入しておこう。
PS C:\> $srm = $global:DefaultSrmServers
なお、以下のように記述することで、接続と変数代入は同時に実施することもできる。
PS C:\> $srm = Connect-SrmServer -Port 443
リカバリプランの選択
リカバリを実行する前に、実行対象とするリカバリプランを確認する。
PS C:\> $srm.extensiondata.Recovery.ListPlans().GetInfo()
Name Description State ProtectionGroups
---- ----------- ----- ----------------
RP-01 Ready {VMware.VimAutomation.Srm.Views.SrmProtectionGroup}
今回のテスト環境では「RP-01」というリカバリプランのリカバリを実行する。コマンドが長いので、以下のように変数に代入しておこう。
PS C:\> $rp = $srm.extensiondata.Recovery.ListPlans() | where { $_.getinfo().Name -eq "RP-01" }
テストリカバリの実行
それではテストリカバリを実行してみよう。テストリカバリの実行とテスト後の戻し (クリーンアップ) の2つの作業をPowerCLIを使って実行してみる。
①テストリカバリ
先ほど変数に入れたリカバリプランのStart
メソッドを使うことで実行できるのだが、メソッドの引数に実行するモードを指定する必要がある。引数は以下のオブジェクトを指定する必要があるので、Net-Object
で変数としてオブジェクトの作成を行っておく。
PS C:\> $mode = New-Object VMware.VimAutomation.Srm.Views.SrmRecoveryPlanRecoveryMode
実行するモードは、先ほどのオブジェクトのValue__
のプロパティの値に応じて以下の通り決定される。
Value__ の値 |
動作 | 説明 |
---|---|---|
0 | Failover | リカバリ (ディザスタリカバリ) |
1 | Test | テスト実行 |
2 | CleanupTest | テスト実行のクリーンアップ |
3 | Reprotect | 再保護 |
4 | Revert | ? |
5 | Migrate | リカバリ (計画移行) |
今回はテストリカバリの実行なので「1」を指定する。
PS C:\> $mode.Value__ = 1 ; $mode
Test
それでは実行してみよう。Start
メソッドは実行完了を待たずにプロンプトが返ってくるので、$rp.GetInfo().State
にてリカバリプランのステータスを5秒おきに確認するようコマンドを作ってみた。
PS C:\> $rp.Start($mode)
PS C:\> do { sleep 5 ; echo $rp.GetInfo().State } while ($rp.GetInfo().State -eq "Running")
Running
Running
Running
~(中略)~
Running
Running
NeedsCleanup ←★テスト完了のステータス
②クリーンアップ
クリーンアップは「2」を指定する。
PS C:\> $mode.Value__ = 2 ; $mode
CleanupTest
Start
メソッドを実行すると、クリーンアップが実行された。
PS C:\> $rp.Start($mode)
PS C:\> do { sleep 5 ; echo $rp.GetInfo().State } while ($rp.GetInfo().State -eq "Running")
Ready ←★準備完了のステータス
リカバリ (ディザスタリカバリ) の実行
次にテストではないリカバリ (ディザスタリカバリ) を行う。リカバリの実行とリカバリ後の再保護の2つ作業をPowerCLIを使って実行してみる。
①リカバリ
リカバリは「0」を指定する。
PS C:\> $mode.Value__ = 0 ; $mode
Failover
PS C:\> $rp.Start($mode)
PS C:\> do { sleep 5 ; echo $rp.GetInfo().State } while ($rp.GetInfo().State -eq "Running")
Running
Running
Running
~(中略)~
Running
Running
FailedOver ←★リカバリ完了のステータス
PS C:\> $mode.Value__ = 3 ; $mode
Reprotect
PS C:\> $rp.Start($mode)
PS C:\> do { sleep 5 ; echo $rp.GetInfo().State } while ($rp.GetInfo().State -eq "Running")
Protecting
②再保護
リカバリ完了後の再保護は「3」を指定する。GUI上では「準備完了」のステータスだが、テストリカバリのクリーンアップ後とは異なり「Protecting」というステータスで表示される。
PS C:\> $mode.Value__ = 3 ; $mode
Reprotect
PS C:\> $rp.Start($mode)
PS C:\> do { sleep 5 ; echo $rp.GetInfo().State } while ($rp.GetInfo().State -eq "Running")
Protecting ←★再保護完了のステータス
まとめ
以上で、PowerCLIでSRMのリカバリプランを実行できることが確認できた。
少しコマンドが分かりづらくなってしまったので、パラメータを変数にしたり必要コマンドを整理した。
# 必要情報を変数に代入
$vcip = "192.168.11.170" # vCenter ServerのIPアドレスまたはホスト名
$vcuser = "administrator@vsphere.local" # ログインユーザ
$vcpass = "XXXXXXXX" # ログインのパスワード
$rpname = "RP-01" # リカバリプラン名
$rpmode = 1 # リカバリモード (0:ディザスタリカバリ, 1:テストリカバリ, 2:クリーンアップ, 3:再保護, 5:計画移行)
# vCenter Server及びSRMに接続
Connect-VIServer $vcip -User $vcuser -Password $vcpass -Force
$srm = Connect-SrmServer -Port 443
# リカバリプランを選択
$rp = $srm.extensiondata.Recovery.ListPlans() | where { $_.getinfo().Name -eq $rpname }
# リカバリプランの実行モードを選択
$mode = New-Object VMware.VimAutomation.Srm.Views.SrmRecoveryPlanRecoveryMode
$mode.Value__ = $rpmode ; $mode
# リカバリを実行
$rp.Start($mode)
do { sleep 5 ; echo $rp.GetInfo().State } while ($rp.GetInfo().State -eq "Running")
上記をスクリプト化などして使えば、SRMのGUIにログインせずともSRMのリカバリプランを実行することができる。
0 件のコメント:
コメントを投稿