2020年9月9日水曜日

PowerCLIでSRMのリカバリプランを実行する

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 件のコメント:

コメントを投稿

人気の投稿