共用方式為


在服務管理自動化中的子 Runbook

在 Service Management Automation (SMA)中,最佳做法是撰寫模組化且可重複使用的 Runbook,其中包含其他 Runbook 可以使用的單一功能。 父 Runbook 通常會呼叫一或多個子 Runbook 來執行所需的功能。 有兩種方法可以呼叫子執行腳本,每種方法之間都有明顯的差異,您應該瞭解這些差異,以便判斷哪種方法最適合您的不同情境。

使用內嵌執行叫用子 Runbook

若要在其他 Runbook 中內嵌呼叫 Runbook,您可以使用 Runbook 的名稱並提供其參數值,如同您使用動作或 Cmdlet 一般。 在同一 SMA 環境中的所有 Runbook 都可供其他所有 Runbook 以這種方式進行使用。 父作業簿會等待子作業簿完成後再移至下一行,並將所有輸出直接傳回父作業簿。

當您叫用 Runbook 內嵌時,它會在父 Runbook 所在的相同工作中執行。 子 runbook 的工作歷程記錄將不會顯示其執行的任何資訊。 來自子 Runbook 的任何例外狀況及任何資料流輸出都會與父代相關聯。 這會產生較少的工作,使其更容易追蹤和疑難解答,因為子工作流程所拋出的任何例外狀況,以及與父工作流程作業相關聯並從中產生的任何數據流輸出。

發佈 Runbook 時,其呼叫的任何子 Runbook 都必須已有已發佈版本。 這是因為自動化會在編譯 Runbook 時,建立與任何子 Runbook 的關聯。 如果不是,父 Runbook 會顯示為正確發佈,但會在啟動時產生例外狀況。 如果發生這種情況,您可以重新發佈父 Runbook 以正確參照子 Runbook。 如果任何子 Runbook 已變更,您就不需要重新發佈父 Runbook,因為關聯已經建立。

稱為內嵌的子 Runbook 參數可以是任何數據類型,包括複雜物件。而如果您使用管理入口網站或 Start-SmaRunbook Cmdlet 啟動 Runbook,則不會有 JSON 序列化

Runbook 類型

Runbook 只能在內嵌執行中使用另一個具有相同類型的子 Runbook。 這表示 PowerShell 工作流程 Runbook 無法將 PowerShell Runbook 做為使用內嵌執行的子系,而 PowerShell Runbook 則無法使用 PowerShell 工作流程 Runbook。

當您使用內嵌執行呼叫 PowerShell 工作流程子 Runbook 時,只要使用 Runbook 的名稱即可。 當您呼叫 PowerShell 子 Runbook 時,您必須在名稱前面加上 .\ 來指定腳本位於本機目錄中。

範例

下列範例會叫用一個測試分支 Runbook,它接受一個複雜物件、一個整數和一個布林值這三個參數。 子 Runbook 的輸出被指派給一個變數。 在此案例中,子執行手冊是一個 PowerShell 工作流程執行手冊。

$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

使用 Cmdlet 啟動子 Runbook

您可以使用 Start-SMARunbook Cmdlet ,透過 Windows PowerShell 啟動 Runbook。 當您從 Cmdlet 啟動子 Runbook 時,在為子 Runbook 建立工作後,父 Runbook 會立即移到下一行。 如果您需要從 Runbook 擷取任何輸出,則您需要使用 Get-SMAJobOutput 來存取該工作的輸出。

使用 Cmdlet 從子 Runbook 啟動的工作,會與父 Runbook 執行的工作分開執行。 這會產生比叫用工作流程內嵌更多的作業、增加背景工作伺服器上的額外負荷,並使其更難追蹤。不過,父代可以啟動多個子 Runbook,而不需要等待每個 Runbook 完成。 若要以相同類型的平行執行直接在父 Runbook 中呼叫子 Runbook,則父 Runbook 需要使用 平行關鍵字

使用 Cmdlet 啟動的子 Runbook 的參數會作為雜湊表,如 Runbook 參數所述。 只能使用簡單資料類型,但您可以提供 Credentials所述的認證資產名稱。 如果 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 的兩種方法的差異。

內嵌 命令行程式
工作 子作業手冊與父作業手冊在相同的工作中執行。 會為子執行手冊建立一個單獨的工作。
執行 父執行手冊會等到子執行手冊完成,然後再繼續執行。 啟動子 Runbook 之後會立即繼續執行父 Runbook。
輸出 父 Runbook 可以直接從子 Runbook 取得輸出。 父 Runbook 必須擷取子 Runbook 工作的輸出。
參數 會個別指定子 Runbook 參數的值,而且可以使用任何資料類型。 子 Runbook 參數的值必須結合成單一哈希表,而且只能包含使用 JSON 串行化的簡單、陣列和對象數據類型。
發佈 子 Runbook 必須先於父 Runbook 發佈。 子執行手冊必須在父執行手冊啟動之前的任何時間發佈。

下一步