Service Management Automation の子 Runbook
Service Management Automation (SMA) では、他の Runbook で使用できる個別の関数を使用して再利用可能なモジュール式 Runbook を記述することをお勧めします。 親 Runbook は、多くの場合、必要な機能を実行するために 1 つ以上の子 Runbook を呼び出します。 子 Runbook を呼び出すには 2 つの方法があり、それぞれ異なる違いを理解して、さまざまなシナリオに最適な Runbook を決定できるようにする必要があります。
インライン実行を使用して子 Runbook を呼び出す
別の Runbook からインラインで Runbook を呼び出すには、Runbook の名前を使用し、アクティビティやコマンドレットに使用するのと同じパラメーター値を指定します。 同じ SMA 環境内のすべての Runbook は、この方法で使用するために他のすべての Runbook で使用できます。 親 Runbook は子 Runbook が完了してから次の行に移動し、すべての出力は直接親に返されます。親 Runbook は子 Runbook が完了してから次の行に移動し、すべての出力は直接親に返されます。
Runbook をインラインで呼び出すと、親 Runbook と同じジョブで実行されます。 実行された子 Runbook はジョブ履歴には表示されません。 子 Runbook からのすべての例外とストリーム出力は、親に関連付けられます。 その結果、ジョブが少なくなるため、子 Runbook によってスローされた例外と、親 Runbook ジョブに関連付けられているストリーム出力が原因で、ジョブの追跡とトラブルシューティングが容易になります。
Runbook が置換されるときは、コールする子 Runbook にはすべて、置換されたバージョンが備わっています。 これは、Runbook のコンパイル時に、Automation によって子 Runbook との関連付けが作成されるためです。 そうでない場合、親 Runbook は正しく発行されているように見えますが、起動時に例外が生成されます。 例外が発生した場合、親 Runbook を再発行して、子 Runbook が正しく参照されるようにします。 関連付けが既に作成されているため、子 Runbook のいずれかが変更された場合は、親 Runbook を再発行する必要はありません。
インラインと呼ばれる子 Runbook のパラメーターには、複合オブジェクトを含む任意のデータ型を指定できます。また、管理ポータルまたは Start-SmaRunbook コマンドレットを使用して Runbook を開始する場合があるためJSON シリアル化はありません。
Runbook の種類
Runbook では、インライン実行を使用する子 Runbook として同じタイプの別の Runbook のみを使用できます。 つまり、PowerShell Workflow Runbookはインライン実行を使用する子としてPowerShell Runbook を使用できません。また、PowerShell Runbook では PowerShell Workflow Runbook を使用できません。
インライン実行を使用して PowerShell ワークフローの子 Runbook を呼び出す場合は、Runbook の名前のみを使用します。 PowerShell 子 Runbook を呼び出すときは、その名前の前に .\ を付けて、スクリプトがローカル ディレクトリにあることを指定する必要があります。
例
次の例では、複雑なオブジェクト、整数、およびブール値の 3 つのパラメーターを受け入れるテスト用の子 Runbook を呼び出します。 子 Runbook の出力は、変数に割り当てられます。 この場合は、子 Runbook は PowerShell ワークフロー Runbook です。
$vm = Get-VM -Name "MyVM" -ComputerName "MyServer"
$output = Test-ChildRunbook -VM $vm -RepeatCount 2 -Restart $true
PowerShell スクリプト Runbook を子として使用するのと同じ例を次に示します。
$vm = Get-VM -Name "MyVM" -ComputerName "MyServer"
$output = .\Test-ChildRunbook.ps1 -VM $vm -RepeatCount 2 -Restart $true
コマンドレットを使用して子 Runbook を開始する
Start-SMARunbook コマンドレットを使用、Windows PowerShell で Runbook を開始。 コマンドレットから子 Runbook を起動すると、親 Runbook は子 Runbook に対してジョブが作成されるとすぐに次の行に移動します。 Runbook から出力を取得する必要がある場合、 Get SMAJobOutputを使ってジョブにアクセスする必要があります。
コマンドレットで開始した子 Runbook のジョブは、親 Runbook とは別のジョブで実行されます。 これにより、ワークフローをインラインで呼び出すよりも多くのジョブが発生し、ワーカー サーバーのオーバーヘッドが増加し、追跡が困難になります。ただし、親は、それぞれが完了するのを待たずに、複数の子 Runbook を開始できます。 複数の子 Runbook をインラインで同じように並列実行するには、親 Runbook で parallel キーワードを使用する必要があります。
コマンドレットで開始した子 Runbook のパラメーターは、「 Runbook のパラメーター」で説明されているハッシュテーブルとして提供されます。 Credentialsに記載されているように資格情報のアセットの名前を指定できますが、単純なデータ型のみを使用できます。 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 を発行する必要があります。 |