Share via


別の Runbookからの Runbook の起動

 

適用対象: Windows Azure Pack for Windows Server,System Center 2012 R2 Orchestrator

サービス管理オートメーション で、別の Runbook で使用できる個別の関数を使った再利用可能なモジュールの Runbook を記述することはお勧めできます。 親 Runbook は多くの場合、必要な機能を実行する 1 つまたは複数の子の Runbook を呼び出します。 子 Runbook を呼び出すには 2 つの方法があり、それぞれ明確に違うことを理解しておくことでさまざまな場合でどちらが適しているかを判断できるようになります。

  • インライン実行で子 Runbook を起動する

  • コマンドレットを使用して子 Runbook を開始する

インライン実行で子 Runbook を起動する

別の Runbook からインラインで Runbook を呼び出すには、Runbook の名前を使用して使用するアクティビティやコマンドレットと同じパラメーターの値を指定します。 同じ サービス管理オートメーション 環境のすべての Runbook が、この方法で使用される他のすべてに利用できます。 親 Runbook は子 Runbook が完了してから次の行に移動し、すべての出力は直接親に返されます。

インラインで Runbook を呼び出すときは、親 Runbook と同じジョブが実行されます。 実行された子 Runbook はジョブ履歴には表示されません。 子 Runbook からのすべての例外とストリーム出力は、親に関連付けられます。 これより、子 Runbook やストリーム出力のいずれかによって発生した例外が親 Runbook のジョブに関連付けられるため、ジョブの数が減って追跡しやすくなり、問題の解決がしやすくなります。

Runbook が置換されるときは、コールする子 Runbook にはすべて、置換されたバージョンが備わっています。 これは、Runbook がコンパイルされるときに、オートメーション によって子 Runbook と関連付けられることが理由です。 そうでない場合、親 Runbook は適切に置換して表示されますが、起動時に例外が発生します。 この場合、親 Runbook を再度置換して子 Runbook を正しく参照するようにします。 子 Runbook が変更された場合でも、関連付けはすでに作成されているため、親 Runbook を再度置換する必要はありません。

インラインでコールされた子 Runbook のパラメーターは、複雑なオブジェクトを含め任意のデータ型にすることができますが、JSON のシリアル化は管理ポータルや Start-smarunbook コマンドレットを使って Runbook を起動したときに行われるため、このケースでは生じません。

次の例では、3 つのパラメーター (複雑なオブジェクト、整数、ブール値) を受領する、テスト用の子 runbook を呼び出します。 子 Runbook の出力には、変数が割り当てられます。

$vm = Get-VM –Name "MyVM" –ComputerName "MyServer"
$output = Test-ChildRunbook –VM $vm –RepeatCount 2 –Restart $true

コマンドレットを使用して子 Runbook を開始する

Start-SMARunbook コマンドレットを使用して、「Windows PowerShell を使用した Runbook の開始」の説明に従って Runbook を開始できます。 コマンドレットから子 Runbook を起動すると、親 Runbook は子 Runbook に対してジョブが作成されるとすぐに次の行に移動します。 Runbook から出力を取得する必要がある場合、Get SMAJobOutput を使ってジョブにアクセスする必要があります。

コマンドレットで起動した子 Runbook からのジョブは、親 Runbook からの別のジョブで実行されます。 これにより、インラインでワークフローを呼び出すより多くのジョブが実行されることになり、作業サーバーのオーバーヘッドが増加し、追跡がより困難になります。 親は、完了するまで待機する必要なく、複数の子 Runbook を起動できます。 子 Runbook をインラインで呼び出す同種の並列実行では、親 Runbook で並列キーワードが使われる必要があります。

コマンドレットで起動した子 Runbook のパラメーターは、「Runbook のパラメーター」に記載されているように、ハッシュ テーブルとして提供されます。資格情報: に記載されているように資格情報のアセットの名前を指定できますが、単純なデータ型のみを使用できます。 Runbook が複雑なデータ型のパラメーターを持っている場合は、インラインで呼び出す必要があります。

次の例では、パラメーターを持つ子 runbook を起動して完了まで待機します。 完了すると、親 Runbook によってその出力がジョブから収集されます。

$webServer = 'https://MyServer'
$port = 9090
$runbookName = "Test-Runbook"
$params = @{"VMName"="MyVM";"RepeatCount"=2;"Restart"=$true} 

$job = Start-SmaRunbook –WebServiceEndpoint $webServer –Port $port –Name $runbookName –Parameters $params

$doLoop = $true
While ($doLoop) {
   $job = Get-SmaJob –WebServiceEndpoint $webServer –Port $port -Id $job.Id
   $status = $job.Status
   $doLoop = (($status -ne "Completed") -and ($status -ne "Failed") -and ($status -ne "Suspended") -and ($status -ne "Stopped") 
}

Get-SmaJobOutput –WebServiceEndpoint $webServer –Port $port -Id $job.Id –Stream Output

子 Runbook を呼び出すためのメソッドを比較する

次の表では、別の Runbook から Runbook を呼び出す 2 つのメソッドの違いをまとめたものです。

インライン

コマンドレット

ジョブ

子 Runbook は、親と同じジョブで実行されます。

子 Runbook には別のジョブが作成されます。

実行

親 Runbook は、子 Runbook が終了してから続行します。

親 Runbook は、子 Runbook の起動後にすぐに続行します。

出力

親 Runbook は子 Runbook から出力を直接取得できます。

親 Runbook は、子 Runbook のジョブから出力を取得する必要があります。

パラメーター

子 Runbook のパラメーターの値とは別に指定され、任意のデータ型を使用できます。

子 Runbook のパラメーター値は 1 つのハッシュ テーブルに結合する必要があり、JSON のシリアル化を活用するシンプルな、配列やオブジェクトのデータ型のみである必要があります。

置換

親 runbook が置換される前に、子 runbook を置換する必要があります。

子 Runbook は、親の Runbook の起動前に置換される必要があります。