
作為 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 的幾點原因:
- 在某些場景下,您可能希望暫定正在運行的 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 :
演示場景:更新虛擬機器
- 從 Windows 更新下載最新修補程式
- 重新開機虛擬機器以應用修補程式
3. 向團隊發送電子郵件報告已應用更新
4. …
在此場景下,可以重複步驟 1(因為冪等),但不能重複步驟 2 和步驟 3。因此,需要在步驟 2 和步驟 3 後添加 Checkpoint 。"每項活動後自動 Persist "設置仍然有效;但是,在步驟 1 後添加 Checkpoint 未必會向系統添加工作。
演示場景:通知客戶
- 從資料庫獲取客戶清單
- 向客戶發送電子郵件通知新策略
3. 向管理層發送電子郵件,表明已向客戶發送電子郵件
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 作業可通過多種方式暫定:
- 如果 Runbook 工作進程發生意外中止,該工作進程上運行的作業將立即終止。這些作業在資料庫中的狀態仍繼續為“正在運行”。當上述或替換工作進程恢復線上狀態時,將恢復這些作業並從最後一個Checkpoint繼續執行。
Azure Automation 的 Runbook 作業可通過多種方式恢復。在任何情況下,作業都將從最後一個 Checkpoint 進行恢復;若未建立 Checkpoint ,則從頭開始恢復。
- 當工作進程恢復線上狀態或者指定另一個工作進程接替其操作時,該工作進程將會在為其分配的資料庫中查找作業。對於狀態顯示為“正在運行”但尚未在工作進程上運行的任何作業,工作進程將從最後一個 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