Service Management Automation 中的子 Runbook
在 Service Management Automation (SMA) 中,最佳做法是使用其他 Runbook 可以使用的離散函式來撰寫可重複使用的模組化 Runbook。 父 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 以正確參照子 Runbook。 如果任何子 Runbook 已變更,您就不需要重新發佈父 Runbook,因為關聯已經建立。
稱為內嵌的子 Runbook 參數可以是任何數據類型,包括複雜物件,而且當您使用管理入口網站或 Start-SmaRunbook Cmdlet 啟動 Runbook 時,沒有任何 JSON 串行化。
Runbook 類型
Runbook 只能使用與使用內嵌執行之子 Runbook 相同 類型的 另一個 Runbook。 這表示 PowerShell 工作流程 Runbook 無法使用 PowerShell Runbook 做為使用內嵌執行的子系,而 PowerShell Runbook 則無法使用 PowerShell 工作流程 Runbook。
當您使用內嵌執行呼叫 PowerShell 工作流程子 Runbook 時,只要使用 Runbook 的名稱即可。 當您呼叫 PowerShell 子 Runbook 時,您必須在名稱前面加上 .\ 來指定腳本位於本機目錄中。
範例
下列範例會叫用接受三個參數、一個複雜物件、一個整數和一個布林值的測試子 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
使用 Cmdlet 啟動子 Runbook
您可以使用 Start-SMARunbook Cmdlet ,透過 Windows PowerShell 啟動 Runbook。 當您從 Cmdlet 啟動子 Runbook 時,在為子 Runbook 建立工作後,父 Runbook 會立即移到下一行。 如果您需要從 Runbook 擷取任何輸出,則您需要使用 Get-SMAJobOutput存取工作。
使用 Cmdlet 從子 Runbook 啟動的工作,會與父 Runbook 執行的工作分開執行。 這會產生比叫用工作流程內嵌更多的作業、增加背景工作伺服器上的額外負荷,並使其更難追蹤。不過,父代可以啟動多個子 Runbook,而不需要等待每個 Runbook 完成。 若為相同種類、且平行呼叫子 Runbook 內嵌的工作,父 Runbook 將需要使用 平行關鍵字。
使用 Cmdlet 啟動的子 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。
內嵌 | 指令程式 | |
---|---|---|
工作 (Job) | 與父代在相同的工作中執行的子 Runbook。 | 會為子 Runbook 建立不同的工作。 |
執行 | 父 Runbook 會等到子 Runbook 完成,然後再繼續執行。 | 啟動子 Runbook 之後會立即繼續執行父 Runbook。 |
輸出 | 父 Runbook 可以直接從子 Runbook 取得輸出。 | 父 Runbook 必須擷取子 Runbook 工作的輸出。 |
參數 | 會個別指定子 Runbook 參數的值,而且可以使用任何資料類型。 | 子 Runbook 參數的值必須結合成單一哈希表,而且只能包含使用 JSON 串行化的簡單、陣列和對象數據類型。 |
發佈 | 發佈父 Runbook 之前必須先發佈子 Runbook。 | 子 Runbook 必須在父 Runbook 啟動之前隨時發佈。 |
下一步
- 瞭解 自動化 Runbook。