Runbook 概念

 

發行︰ 2016年7月

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

自動化 Runbook 會以 Windows PowerShell 工作流程的形式實作。 本節將針對 自動化 Runbook 常用的工作流程關鍵功能提供簡要概觀。 與工作流程有關的詳細資料可在 Windows PowerShell 工作流程簡介中取得。

此 Runbook 的結構與 服務管理自動化 及 Microsoft Azure 自動化的 Runbook 結構完全相同,但這兩個 Runbook 通常會使用不同的資源。

Windows PowerShell 工作流程

工作流程是一種程式化、相連接的步驟順序,可執行長時間執行的工作,或需要在多個裝置或受管理的節點之間進行協調。 以一般指令碼進行工作流程的優勢在於可同時在多個裝置執行動作,並可自動進行失敗修復。 Windows PowerShell 工作流程是一種利用 Windows Workflow Foundation 的 Windows PowerShell 指令碼。 此工作流程是以 Windows PowerShell 語法撰寫,並由 Windows PowerShell 啟動,然後由 Windows Workflow Foundation 執行。

基本結構

Windows PowerShell 工作流程是以 Workflow 關鍵字開頭,後面跟著以大括號括住的指令碼本文。 工作流程會依照下列語法中顯示的 Workflow 關鍵字命名。 工作流程的名稱符合 自動化 Runbook 的名稱。

Workflow Test-Runbook  
{  
   <Commands>  
}  

若要在工作流程中加入參數,請使用下列語法中顯示的 Param 關鍵字。 當使用者啟動 Runbook 時,管理入口網站會提示使用者輸入這些參數的值。 此範例使用選擇性的參數屬性以指定此參數是否為必要。

Workflow Test-Runbook  
{  
  Param  
  (  
   [Parameter(Mandatory=<$True | $False>]  
   [Type]$<ParameterName>,  
  
   [Parameter(Mandatory=<$True | $False>]  
   [Type]$<ParameterName>  
  )  
  <Commands>  
}  

命名

工作流程的名稱應符合「動詞-名詞」的 Windows PowerShell 標準格式。 您可以參閱 Approved Verbs for Windows PowerShell Commands (核准的 Windows PowerShell 命令動詞),取得核准使用的動詞清單。 工作流程的名稱必須符合 自動化 Runbook 的名稱。 如果要匯入 Runbook,則檔案名稱必須符合工作流程名稱,且必須以 .ps1 結尾。

限制

如需 Windows PowerShell 工作流程及 Windows PowerShell 之限制及語法差異的完整清單,請參閱指令碼工作流程與指令碼的語法差異

活動

「活動」是工作流程中的一種特定工作。 就如同指令碼是由一或多個命令所組成一樣,工作流程也是由一或多個依序執行的活動所組成。 Windows PowerShell 工作流程會自動將許多 Windows PowerShell 指令程式轉換成在工作流程中執行的活動。 當您在 Runbook 中指定其中一個指令程式時,Windows Workflow Foundation 會實際執行相應的活動。 對於沒有相應活動作的指令程式,Windows PowerShell 工作流程會自動在 InlineScript 活動中執行指令程式。 有一組指令程式明確含括在 InlineScript 區塊中,否則將被排除在外,並無法在工作流程中使用。 如需這些概念的詳細資料,請參閱 Using Activities in Script Workflows (使用指令碼工作流程中的活動)

工作流程活動會共用一組通用參數來設定其作業。 如需工作流程通用參數的詳細資料,請參閱 about_WorkflowCommonParameters

整合模組

整合模組是一種包含 Windows PowerShell 模組的套件,並可匯入至 自動化。 Windows PowerShell 模組包含可以在 自動化 Runbook 中使用的指令程式。 諸如 Operations Manager 及 Azure 之類的產品和服務,都有模組包含其專用的指令程式。

匯入到 自動化 的整合模組會自動提供給所有的 Runbook。 由於 自動化 是以 Windows PowerShell 4.0 為基礎,因此可支援模組的自動載入。這表示您可以使用已安裝模組的指令程式,而不需要透過 Import-Module 將其匯入指令碼。

只要所有其相依性皆可位於單一資料夾中,則任何 Windows PowerShell 模組皆可匯入至 自動化。 如果模組所依賴的登錄設定或檔案並不在預設路徑中,您可以可將其匯入,但可能仍無法運作,因為 自動化 找不到其相依性。 具有外部相依性的模組必須安裝在其他主機上才可在 Runbook 中使用,然後再用 InlineScript 指令碼區塊加以存取。

有了 服務管理自動化 之後,只要將具有外部相依性的模組安裝在每部背景工作伺服器上,就能加以使用。 雖然您可以在 Runbook 中使用這些模組中的指令程式,自動化 將無法探索這些指令程式來支援插入活動精靈等功能。 若要使用此功能,您可以使用 New-SmaPortableModule 指令程式建立可攜式模組。 此指令程式會建立一個模組,其中包含每個 Cmdlet 的虛設常式,並可匯入至 自動化。 當 Runbook 使用其中一個指令程式時,虛設常式會將呼叫重新導向至外部模組中的實際指令程式。 該模組必須安裝在每個 Worker 伺服器上,否則呼叫將會失敗。

平行執行

Windows PowerShell 工作流程的其中一個優勢就是可平行執行一組命令,而不需要像一般指令碼一樣依序執行。 這對於 Runbook 來說特別有用,因為 Runbook 可執行需要大量時間完成的多個動作。 例如,Runbook 可能會佈建一組虛擬機器。 此時您可以同時執行這些動作,而不需要依序執行每個佈建程序,以藉此提高整體效率。 只有完成所有程序之後,Runbook 才可繼續執行。

您可以使用 Parallel 關鍵字以透過多個可同時執行的命令來建立指令碼區塊。 這會使用如下所示的語法。 在此情況中,Activity1 和 Activity2 將會同時開始。 Activity3 則會在 Activity1 和 Activity2 都完成之後才開始。

Parallel  
{  
  <Activity1>  
  <Activity2>  
}  
<Activity3>  

您可以使用 ForEach -Parallel 建構函式同時處理集合中每個項目的命令。 集合中的項目會以平行方式執行,而指令碼區塊中的命令則會以循序方式執行。 這會使用如下所示的語法。 在此情況中,Activity1 將會與集合中的所有項目相同的時間開始。 對每個項目來說,Activity2 將會在 Activity1 完成之後開始。 Activity3 則會在所有項目的 Activity1 和 Activity2 都完成之後才開始。

ForEach -Parallel ($<item> in $<collection>)  
{  
  <Activity1>  
  <Activity2>  
}  
<Activity3>  

Sequence 關鍵字可用來循序執行 Parallel 指令碼區塊中的命令。Sequence 指令碼區塊會與其他命令平行執行,但區塊中的命令則會循序執行。 這會使用如下所示的語法。 在此情況中,Activity1、Activity2 和 Activity3 將會在相同時間開始。 Activity4 則會在 Activity3 完成之後才開始。 Activity5 將會在所有其他活動完成之後開始。

Parallel  
{  
  <Activity1>  
  <Activity2>  
  
  Sequence   
  {  
   <Activity3>  
   <Activity4>  
  }  
}  
<Activity5>  

檢查點

檢查點是工作流程的目前狀態快照,其中包含變數目前的值,以及該檢查點所產生的任何輸出。 在 Runbook 中要完成的最後一件事是儲存到 自動化 資料庫,讓工作流程即使中斷,也可以繼續。 當 Runbook 作業完成時,檢查點資料就會移除。

您可以透過 Checkpoint-Workflow 活動在工作流程中設定檢查點。 當您在 Runbook 中加入此活動時,就會立即執行檢查點。 如果 Runbook 因發生錯誤而暫停,當作業繼續時,將會從上一個設定的檢查點開始執行。

在下列範例程式碼中,在 Activity2 造成 Runbook 暫停之後發生錯誤。 當作業繼續時,會從執行 Activity2 開始,因為這接在上一個檢查點設定之後。

<Activity1>  
Checkpoint-Workflow  
<Activity2>  
<Error>  
<Activity3>  

您應在 Runbook 中於容易發生錯誤的活動之後設定檢查點,並且如果 Runbook 恢復就不重複執行工作。 例如,您的 Runbook 可能會建立虛擬機器。 您可以在命令之前及之後都設定檢查點以建立虛擬機器。 如果建立失敗,則當 Runbook 恢復時會重複執行這些命令。 如果建立成功但 Runbook 在稍後失敗,則當 Runbook 恢復時將不會再次建立虛擬機器。

如需檢查點的詳細資訊,請參閱 Adding Checkpoints to a Script Workflow (將檢查點新增至指令碼工作流程)

暫停 Runbook

您可以透過 Suspend-Workflow 活動強制 Runbook 自行暫停。 此活動將會設定檢查點,並使工作流程立即暫停。 暫止工作流程對需要執行手動步驟,才能執行另一組活動的 Runbook 而言十分實用。

如需暫停工作流程的詳細資訊,請參閱 Making a Workflow Suspend Itself (讓工作流程自行暫停)

InlineScript

InlineScript 活動會在個別的非工作流程工作階段中執行命令區塊,並將其輸出傳回到工作流程。 當工作流程中的命令傳送至 Windows Workflow Foundation 進行處理時,InlineScript 區塊中的命令則會由 Windows PowerShell 執行。 此活動會使用標準工作流程通用參數,包括 PSComputerNamePSCredential,可讓您指定程式碼區塊在其他電腦上執行,或使用替代的認證。

InlineScript 會使用如下所示的語法。

InlineScript  
{  
  <Script Block>  
} <Common Parameters>  

InlineScript 在 Runbook 中最常見的用法是在另一部電腦上執行程式碼區塊。 當 自動化 中未安裝 Runbook 中的指令程式,或活動只有權在目標電腦的本機上執行時,就會需要此指令程式。 下圖將提供詳細說明。

InlineScript

為了在另一部電腦上執行程式碼區塊,將會透過 PSComputer 活動使用 PSCredentialInlineScript 參數。 一般會在 Runbook 中使用像Credential或Connection一類的全域資源來為這些參數提供值。 下列範例程式碼會在電腦上執行一組命令,並以稱為 MyConnection 的連線表示。

$con = Get-AutomationConnection -Name 'MyConnection'  
$securepassword = ConvertTo-SecureString -AsPlainText -String $con.Password -Force  
$cred = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $con.Username, $securepassword  
InlineScript  
{  
  <Commands>  
} –PSComputer $con.ComputerName –PSCredential $cred  

InlineScript 活動在某些 Runbook 中可能非常重要,因此只能基於以下目的使用:

  • 您無法在 InlineScript 區塊中使用檢查點。 區塊中發生失敗,必須從頭開始進行工作。

  • 因為 InlineScript 會保留整個 InlineScript 區塊長度的 Windows PowerShell 工作階段,所以會影響 Runbook 調適能力。

  • Get-AutomationVariableGet-AutomationPSCredential 等活動無法在 InlineScript 區塊中使用。

如果您不需要使用 InlineScript,則應將其範圍縮到最小。 例如,如果您的 Runbook 在集合上反覆查詢,同時在每個項目上套用相同的作業,則會在 InlineScript 之外進行迴圈處理。 這會提供下列優點:

  • 您可以在每次反覆查詢之後為工作流程設定檢查點。 如果作業暫停或中斷後恢復,則迴圈將可繼續。

  • 您可以使用 ForEach –Parallel 同時處理集合項目。

請注意,若是在 Runbook 中使用 InlineScript

  • 您可以透過 $Using 範圍修改程式將這些值傳送至指令碼。 例如在 InlineScript 外部設定名為 $abc 的變數,在 InlineScript 內會變成 $using: abc。

  • 若要從 InlineScript 傳回輸出,請將輸出指派給變數,以任何要傳回輸出資料流的資料。 下列範例會將 “hi” 字串指派給名為 $output 的變數。

    $output = InlineScript { Write-Output "hi" }  
    
  • 請避免在 InlineScript 範圍內定義工作流程。 即使某些工作流程看似正常運作,但全都未經測試。 這可能會導致令人混淆的錯誤訊息或未預期的行為。

如需使用 InlineScript 的詳細資料,請參閱在工作流程中執行 Windows PowerShell 命令about_InlineScript

請參閱

Service Management Automation 中的 Runbook 執行
撰寫自動化 Runbook