在服務管理自動化中的子 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 時,只要使用 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 發佈。 | 子執行手冊必須在父執行手冊啟動之前的任何時間發佈。 |
下一步
- 瞭解 自動化作業手冊。