共用方式為


從另一個 Runbook 啟動 Runbook

 

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

服務管理自動化 中的最佳作法是撰寫可重複使用的模組化 Runbook,將其具備的不同功能提供給其他 Runbook 使用。 父 Runbook 通常會呼叫一或多個子 Runbook 來執行必要的功能。 有兩種方式可呼叫子 Runbook,且每一個 Runbook 具有您應該瞭解的不同差異,如此您才能判斷不同情況下的最適合 Runbook。

  • 使用內嵌執行叫用子 Runbook

  • 使用 Cmdlet 啟動子 Runbook

使用內嵌執行叫用子 Runbook

若要從其他 Runbook 叫用 Runbook 內嵌,您可以使用 Runbook 的名稱並提供其參數值,如同您使用活動或 Cmdlet 一般。 相同 服務管理自動化 環境中的所有 Runbook,都適用於以這種方式使用的所有其他 Runbook。 父 Runbook 會先等待子 Runbook 完成,然後移至下一行,並將任何輸出直接傳回父代。

當您叫用 Runbook 內嵌時,它會在父 Runbook 所在的相同工作中執行。 其執行的子 Runbook 之工作歷程記錄不會有指示。 來自子 Runbook 的任何例外狀況及任何資料流輸出都會與父代相關聯。 這會導致較少的工作,並使其更容易追蹤和疑難排解,因為子 Runbook 擲回的任何例外狀況,及其任何資料流輸出都與父 Runbook 的工作相關聯。

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

內嵌呼叫的子 Runbook 參數可以是任何資料類型,包括複雜的物件,而且沒有任何 JSON 序列化,當您使用管理入口網站或 Start-SmaRunbook Cmdlet 啟動 Runbook 時應該會有。

下列範例會叫用接受三個參數、一個複雜物件、一個整數和一個布林值的測試子 Runbook。 子 Runbook 的輸出會指派給變數。

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

使用 Cmdlet 啟動子 Runbook

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

使用 Cmdlet 從子 Runbook 啟動的工作,會與父 Runbook 執行的工作分開執行。 這會產生比叫用工作流程內嵌更多的工作、增加背景工作伺服器的負擔,並使其更難以追蹤。 父代可以啟動多個子 Runbook,如此不需要等待每個子項完成。 若為相同種類、且平行呼叫子 Runbook 內嵌的工作,父 Runbook 將需要使用平行關鍵字

使用 Cmdlet 啟動的子 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。

內嵌

Cmdlet

工作

與父代在相同的工作中執行的子 Runbook。

會為子 Runbook 建立不同的工作。

執行

父 Runbook 會等到子 Runbook 完成,然後再繼續執行。

啟動子 Runbook 之後會立即繼續執行父 Runbook。

輸出

父 Runbook 可以直接從子 Runbook 取得輸出。

父 Runbook 必須擷取子 Runbook 工作的輸出。

參數

會個別指定子 Runbook 參數的值,而且可以使用任何資料類型。

子 Runbook 參數的值必須結合成單一雜湊表,而且只可包含簡單、陣列,及運用 JSON 序列化的物件資料類型。

發佈

發佈父 Runbook 之前必須先發佈子 Runbook。

必須在啟動父 Runbook 之前的任何時候發佈子 Runbook。