Azure Automation:使用 CheckPoint 實現可靠的容錯 Runbook 執行

作為 Azure Automation Runbook 的編寫者,我們都希望建立的 Runbook 在遇到意外問題(如錯誤、異常、網路問題和意外中止)時能夠可靠地執行。 Azure Automation 可以幫助您實現這一目標。 Azure Automation 構建於 Windows PowerShell 工作流程基礎之上,支援 Checkpoint 技術,能夠保持工作流程,這樣一旦發生中斷,隨後將可以在中斷點或其附近恢復。因此, Checkpoint 是一項十分強大的功能,大家勢必希望在 Automation Runbook 中加以利用。有效利用 Checkpoint 可使您建立的 Runbook 自動執行長時間運行的流程,順利訪問不同的網路系統,保證不重複那些不應該重複(非冪等任務)或重複起來較為昂貴的操作,並可有計劃地中斷以納入手動步驟。

在本文中,我們將探討在 Automation Runbook 中使用 Checkpoint 的原因、場景和方式。大家可以重溫一些有關 PowerShell 工作流程 Checkpoint 的現有資訊,從而説明理解本文。

什麼是 Checkpoint

Checkpoint 是 Runbook 作業的當前狀態快照,包括當前的變數值、所有輸出及其他可序列化狀態資訊。每個 Checkpoint 均將保存到儲存中。如果有意或無意導致 Runbook 暫定,接著重新恢復,工作流程引擎將使用最新 Checkpoint 數據還原和恢復 Runbook 。

Azure Automation Checkpoint

在 Azure Automation 中,當您保持一個 Runbook 作業時,將會建立 Checkpoint 並將其儲存到 Azure Automation資料庫中。資料庫中僅會儲存存每項作業的最新 Checkpoint 。各 Checkpoint 會替換前一個 Checkpoint 。如果 Runbook 先暫定而後恢復,最後儲存的 Checkpoint 將用於儲存和恢復 Runbook 。

與 PowerShell工作流程(將 Checkpoint 儲存到託管工作流程會話的電腦硬碟中)不同, Azure Automation 將 Checkpoint 儲存到 Azure Automation 資料庫中。因此,如果運行 Runbook 的工作進程發生意外中止,那麼待該進程重新開機後或其他工作進程可以繼續完成作業,使用資料庫中的最新 Checkpoint 恢復作業。

為什麼使用 Checkpoint

以下是在 Runbook 中使用 Checkpoint 的幾點原因:

  • 確保某些操作不重複
  • Checkpoint 對於在 Runbook 發生意外中止(暫定)後又恢復時保證不重複執行那些不應該重複的操作(非冪等任務)。例如,建立虛擬機器後立即核查 Runbook Checkpoint ,如果 Runbook 作業暫定後又恢復,則不能建立重複的虛擬機器。
  • 保護長時間運行的任務
  • 在現實世界中,錯誤時常發生。包含多個步驟、長時間運行的任務容易因網路問題、電腦重啟或意外中止、超時、電源中斷等造成中斷。為避免重新執行昂貴任務,需要檢查 Runbook 的 Checkpoint ,確保任何 Runbook 重新啟動後都不會重新執行任務。
  • 確保長時間運行的 Runbook 完成運行
  • Azure Automation 具有“公平共用”功能,該功能會卸載執行時間達 30 分鐘的所有 Runbook,以便其他 Runbook 繼續運行。最終,將會重新載入被卸載的 Runbook,完成載入後,將從最後一個 Runbook Checkpoint  恢復執行。因此,為保證 Runbook 最終完成,您必須不時添加 Checkpoint 且運行間隔不得超過 30 分鐘。(此論壇文章列舉了有關這個問題的一個示例。)
  • 允許計畫內中斷或手動中斷
  • 在某些場景下,您可能希望暫定正在運行的 Runbook 。例如,暫定 Runbook 作業等到批准後再繼續運行,或者暫定 Runbook 作業等待修復意外或計畫內系統問題。

如何向 Runbook 添加 Checkpoint

Checkpoint-Workflow  活動

Checkpoint-Workflow 活動(別名:Persist)是一項標準的 PowerShell 工作流程活動,在 Runbook 中可用於在某個特定的點建立 Checkpoint 。在 Runbook 中發生 Checkpoint-Workflow 活動的特定點建立 Checkpoint  。


Download-Updates
Reboot-VM
Checkpoint-Workflow
Email-Team
Checkpoint-Workflow

-PSPersist 活動通用參數

每當調用此活動時,都可以納入 –PSPersist 工作流程活動通用參數。這將會在活動完成後,立即強制建立 Checkpoint 。

Download-Updates

Reboot-VM –PSPersist $True

Email-Team –PSPersist $True

$PSPersistPreference 工作流程首選項變數

在 Runbook 中,您可以包含 $PSPersistPreference = $True 語句。這將會導致在完成 preference 語句執行的活動後刪除 Checkpoint 。如果將此 preference 語句設在 Runbook 開頭,那麼將會在 Runbook 中的每項活動後均建立一個 Checkpoint 。您可以通過包含 $PSPersistPreference = $False 語句(這是 Runbook 默認設置)關閉自動Checkpoint,而後運行活動時將不會使用自動 Checkpoint 。

請注意,出於性能和策略原因,每項活動後均執行 Persist 可能並非最佳方法。每個 Checkpoint 均需要處理,以便實現工作流程狀態序列化並將其儲存到資料庫中。另外,在某些場景中(後面的例子),如果 Runbook 暫定,您可能會希望重複一些活動。出於上述原因,不推薦運用此方法。

Download-Updates

$PSPersistPreference = $True

Update-VM

Email-Team

$PSPersistPreference = $False

Suspend-Workflow  活動

當在 Runbook 中使用 Suspend-Workflow 活動時,最直接的結果是建立 Runbook Checkpoint ,然後將 Runbook 暫定。您將需要在 Runbook 中使用此活動,例如,如果需要 Runbook 執行某項作業,然後等待審批再繼續運行。"獲得"批准的方式是恢復 Runbook 作業。

Download-Updates

# Get permission to apply updates

Suspend-Workflow

# Continue if resumed

Reboot-VM –PSPersist $True

Email-Team –PSPersist $True

添加  Checkpoint  的位置

通常情況下,最好明確標記 Persist 工作流程的位置。並不是要設置 $PSPersistPreference 變數在每項活動後執行綜合檢查,通常最好從綜合戰略角度出發,在需要 Persist 操作的工作流程位置使用 Checkpoint-Workflow 活動、 Suspend-Workflow  活動或  –PSPersist 參數。某些位置的確需要 Persist 工作流程,但有些位置確實不需要 Persist 工作流程(示例如下)。另外,請記住, Persist 工作流程需要在系統層實現,這會在一定程度上影響工作流程性能。

最佳實踐: 在下列情況下,您可能需要在工作流程中添加 Checkpoint :

  • 在不希望重複(非冪等)的任何活動後面。

  • 由於成本限制不希望重複的長時間運行或費用昂貴的活動後面。

  • 在執行時間超過 30 分鐘的 Runbook 中。30 分鐘後,將啟用“公平共用”功能,暫時卸載 Runbook,以便其他 Runbook 運行。最終,系統將重新載入該 Runbook ,並從最後一個 Checkpoint 恢復執行。如果未添加任何 Checkpoint ,那麼 Runbook 將從頭恢復,當然還會再次執行公平共用,這種情況將會重複出現,Runbook 將永遠無法完成。
  • 在超出正常問題概率(可能導致故障和工作流程暫定)的任何活動前。您希望在工作流程恢復時重複該活動,從而確保活動工作順利完成。例如,訪問可能受到網路問題影響的遠端系統的活動。

最佳實踐: 不能在下列情況下添加 Checkpoint :

  • 在工作流程暫定後又恢復時希望重複的工作後

  • 重複執行的成本比建立 Checkpoint 費用低的工作後

  • 在 InlineScript 塊中(不允許)

演示場景:更新虛擬機器

  1. 從 Windows 更新下載最新修補程式
  2. 重新開機虛擬機器以應用修補程式
  • Checkpoint

       3. 向團隊發送電子郵件報告已應用更新

  • Checkpoint

       4. …

在此場景下,可以重複步驟 1(因為冪等),但不能重複步驟 2 和步驟 3。因此,需要在步驟 2 和步驟 3 後添加 Checkpoint 。"每項活動後自動 Persist "設置仍然有效;但是,在步驟 1 後添加 Checkpoint 未必會向系統添加工作。

演示場景:通知客戶

  1. 從資料庫獲取客戶清單
  2. 向客戶發送電子郵件通知新策略
  • Checkpoint

       3. 向管理層發送電子郵件,表明已向客戶發送電子郵件

  • Checkpoint…

       4. ...

有時候,您不希望重複活動組,但只有在該組的所有活動均成功完成的情況下才適用。在此場景下,步驟 1 和步驟 2 應始終同時運行,確保在發出電子郵件時檢索到的客戶清單保持最新狀態。因此,如果 Runbook 工作進程在步驟 2(發送客戶電子郵件)前發生意外中止,待到 Runbook 作業恢復後,我們希望它再次從步驟 1(檢索客戶清單)開始運行。但是,如果在步驟 3 前發生意外中止或暫定,那麼我們希望確保不重複執行步驟 2(不希望再次向客戶發送電子郵件)。

最佳實踐: 值得注意的是,不能在工作流程 InlineScript 塊或函數中添加 Checkpoint 。這是因為InlineScript 塊或函數以PowerShell 腳本(而非PowerShell工作流程腳本)的形式運行。因此,為了充分利用工作流程 Persist 的優勢,最好將 Runbook 代碼拆分為多項模組化活動,這樣就能在活動之間添加 Checkpoint ,或者如果需要 InlineScript ,那麼可以使用多個 InlineScript 塊,以便在 InlineScript 塊之間建立 Checkpoint 。

暫定和恢復 Runbook

建立 Checkpoint 和暫定 / 恢復 Runbook 同時使用。向 Runbook 添加 Checkpoint ,這樣當 Runbook 暫定時, Runbook 即可從最後一個Checkpoint 恢復。

Azure Automation 的 Runbook 作業可通過多種方式暫定:

  • 使用者使用 Azure Automation 門戶介面暫定
  • 您可以選擇在 Azure Automation 門戶介面中暫定正在運行的 Runbook 作業。

  • 該作業將在下一個Checkpoint 暫定。如果未在 Runbook 中建立任何 Checkpoint ,那麼 Runbook 將繼續運行直至結束,並且始終顯示“正在暫定”狀態。

  • 用戶在 Runbook 中使用 Suspend-Workflow 暫定
  • 在 Runbook 中包括 Suspend-Workflow 活動。

  • 將為作業建立 Checkpoint ,然後在調用 Suspend-Workflow 的位置暫定。

  • 用戶使用 Suspend-AzureAutomationJobcmdlet 暫定
  • 在 PowerShell 腳本或工作流程中,您可以使用 Suspend-AzureAutomationJob cmdlet 暫定正在運行的 Azure Automation Runbook 作業。

  • 該作業將在下一個 Checkpoint 暫定。如果未在 Runbook 中建立任何 Checkpoint ,那麼 Runbook 將繼續運行直至結束,並且始終顯示“正在暫定”狀態。

  • Azure Automation工作流程引擎在 Runbook 執行時間超過 30 分鐘時暫定
  • 當正在運行的作業執行時間超過 30 分鐘時,將會觸發“公平共用”功能,系統將暫時卸載 Runbook 。作業狀態將被設置為“正在運行,等待資源”。最終,將重新載入 Runbook ,然後從最後一個 Checkpoint 開始執行。
  • Azure Automation 工作流程引擎在 Runbook 發生異常後意外暫定
  • 當正在運行的作業發生異常時, Runbook 工作進程會將其卸載, Runbook 狀態將設置為“已暫定”。
  • 因 Runbook 工作進程發生意外中止而意外暫定
  • 如果 Runbook 工作進程發生意外中止,該工作進程上運行的作業將立即終止。這些作業在資料庫中的狀態仍繼續為“正在運行”。當上述或替換工作進程恢復線上狀態時,將恢復這些作業並從最後一個Checkpoint繼續執行。

Azure Automation 的 Runbook 作業可通過多種方式恢復。在任何情況下,作業都將從最後一個 Checkpoint 進行恢復;若未建立 Checkpoint ,則從頭開始恢復。

  • 在 Azure Automation 門戶介面中手動暫定
  • 您可以選擇使用 Azure Automation 門戶介面恢復暫定的作業。
  • 使用 Resume-AzureAutomationJobcmdlet 暫定
  • 在 Runbook 工作進程意外中止後自動暫定
  • 當工作進程恢復線上狀態或者指定另一個工作進程接替其操作時,該工作進程將會在為其分配的資料庫中查找作業。對於狀態顯示為“正在運行”但尚未在工作進程上運行的任何作業,工作進程將從最後一個 Checkpoint 自動恢復(這與上方暫定列表中的第 5 項的情況相同)。

值得注意的是,恢復 Runbook 時,可在不同於之前暫定的工作進程上恢復 Runbook 。因此,需要重新建立 Runbook 期望使用的任何本地狀態。例如,這意味著,如果 Runbook 需要在 Checkpoint 後的任意一點與 Azure 相連,需要在各 Checkpoint 後再次調用本地檔中設置狀態的命令(如 Connect-Azure、Add-AzureAccount、Select-AzureSubscription 或 Set-AzureSubscription )。

小結

大家可以看到,如果要充分利用PowerShell工作流程的這項關鍵功能並使 Runbook 能夠應對中斷情況,應在 Runbook 中添加 Checkpoint 。添加 Checkpoint 很簡單。創作 Runbook 期間預先計畫,即可保護較為昂貴的長時間運行任務應對意外中斷,真正建立強大可靠的 Runbook 。
 

本文翻譯自 Azure Automation: Reliable, Fault-Tolerant Runbook Execution Using Checkpoints