將 Azure 自動化 Runbook 新增至復原方案

本文說明如何整合 Azure 自動化 Runbook,以擴充 Azure Site Recovery 復原 方案。 我們會示範如何將需要手動介入的基本工作自動化,以及如何將多步驟復原轉換成單鍵動作。

復原計畫

當您容錯移轉內部部署機器或 Azure VM 時,可以使用復原方案。 復原方案可協助您定義系統復原程式,以定義機器容錯移轉的方式,以及如何在容錯移轉後啟動和復原。

復原大型應用程式可能相當複雜。 復原方案有助於強制執行順序,讓復原一致正確、可重複且自動化。 您可以使用腳本,以及Azure 自動化 Runbook,將復原計畫中的工作自動化。 一般範例可能是在容錯移轉之後設定 Azure VM 上的設定,或重新設定 VM 上執行的應用程式。

復原方案中的 Runbook

您會將Azure 自動化帳戶和 Runbook 新增至復原方案。 復原方案執行時會叫用 Runbook。

  • 自動化帳戶可以位於任何 Azure 區域中,且必須與 Site Recovery 保存庫位於相同的訂用帳戶中。
  • Runbook 可以在從主要位置容錯移轉至次要位置,或從次要位置容錯回復至主要位置期間,在復原計畫中執行。
  • 復原方案中的 Runbook 會依設定順序逐一執行。
  • 如果復原方案中的 Runbook 將 VM 設定為在不同的群組中啟動,則只有在 Azure 將所有 VM 回報為執行時,復原計畫才會繼續。
  • 復原計畫會繼續執行,即使腳本失敗也一樣。

復原方案內容

當腳本執行時,它會將復原計畫內容插入 Runbook。 內容包含資料表中摘要的變數。

變數名稱 說明
RecoveryPlanName 復原方案名稱。 用於以名稱為基礎的動作。
FailoverType 指定它是測試或生產容錯移轉。
FailoverDirection 指定復原是否為主要或次要位置。
GroupID 識別執行計畫時復原方案中的組號。
VmMap 群組中所有 VM 的陣列。
VMMap 金鑰 每個 VM 的唯一索引鍵 (GUID)。
SubscriptionId 建立 VM 的 Azure 訂用帳戶識別碼。
resourceGroupName VM 所在的資源組名。
CloudServiceName 建立 VM 的 Azure 雲端服務名稱。
RoleName Azure VM 的名稱。
RecoveryPointId VM 復原的時間戳記。

注意

變數 'FailoverDirection' 的值會在容錯移轉時是 'PrimaryToSecondary',如果是容錯回復,則為 'SecondaryToPrimary'。

下列範例顯示內容變數:

{"RecoveryPlanName":"hrweb-recovery",

```json
{
"RecoveryPlanName":"hrweb-recovery",

"FailoverType":"Test",
"FailoverDirection":"PrimaryToSecondary",
"GroupId":"1",
"VmMap":{"7a1069c6-c1d6-49c5-8c5d-33bfce8dd183":
    { "SubscriptionId":"7a1111111-c1d6-49c5-8c5d-111ce8dd183",
    "ResourceGroupName":"ContosoRG",
    "CloudServiceName":"pod02hrweb-Chicago-test",
    "RoleName":"Fabrikam-Hrweb-frontend-test",
    "RecoveryPointId":"TimeStamp"}
    }
}

如果您想要在迴圈中存取 VMMap 中的所有 VM,您可以使用下列程式碼:

param (
    [parameter(Mandatory=$false)]
    [Object]$RecoveryPlanContext
)
$VMinfo = $RecoveryPlanContext.VmMap | Get-Member | Where-Object MemberType -EQ NoteProperty | select -ExpandProperty Name
$vmMap = $RecoveryPlanContext.VmMap
    foreach($VMID in $VMinfo)
    {
        $VM = $vmMap.$VMID                
            if( !(($VM -eq $Null) -Or ($VM.ResourceGroupName -eq $Null) -Or ($VM.RoleName -eq $Null))) {
            #this check is to ensure that we skip when some data is not available else it will fail
    Write-output "Resource group name ", $VM.ResourceGroupName
    Write-output "Rolename " = $VM.RoleName
            }
        }

Aman Sharma 在收穫雲端 部落格有一個 實用的復原計畫內容腳本 範例。

在您開始使用 Intune 之前

  • 如果您不熟悉Azure 自動化,您可以 註冊 下載範例腳本 。 如需詳細資訊,請參閱 自動化 Runbook - 已知問題和限制

  • 確定自動化帳戶具有下列模組:

    • AzureRM.profile
    • AzureRM.Resources
    • AzureRM.Automation
    • AzureRM.Network
    • AzureRM.Compute

    所有模組都應該是相容的版本。 最簡單的方式是一律使用所有模組的最新版本。

自訂復原方案

  1. 在保存庫中,選取 [復原方案] (Site Recovery)

  2. 若要建立復原方案,請選取 [+復原方案 ]。 深入了解。 如果您已經有復原方案,請選取以開啟它。

  3. 在 [復原方案] 頁面中,選取 [ 自訂 ]。

    Select the Customize button

  4. 選取群組 1:開始 > 新增後置動作 旁邊的 省略號 (...)。

  5. 在 [ 插入] 動作 中,確認 已選取 [腳本 ],並指定腳本的名稱 ( Hello World )。

  6. 指定自動化帳戶並選取 Runbook。 若要儲存腳本,請選取 [ 確定 ]。 腳本會新增至 群組 1:後續步驟

重複使用 Runbook 腳本

您可以使用外部變數,在多個復原方案中使用單一 Runbook 腳本。

  • 您可以使用 Azure 自動化變數 來儲存執行復原計畫的參數。
  • 藉由將復原方案名稱新增為變數的前置詞,您可以為每個復原方案建立個別變數。 然後,使用變數作為參數。
  • 您可以變更參數而不變更腳本,但仍變更腳本的運作方式。

在 Runbook 腳本中使用簡單的字串變數

在此範例中,腳本會接受網路安全性群組 (NSG) 的輸入,並將它套用至復原方案中的 VM。

  1. 因此,腳本可以偵測正在執行的復原計畫,請使用此復原方案內容:

    workflow AddPublicIPAndNSG {
        param (
              [parameter(Mandatory=$false)]
              [Object]$RecoveryPlanContext
        )
    
        $RPName = $RecoveryPlanContext.RecoveryPlanName
    }
    
  2. 記下 NSG 名稱和資源群組。 您可以使用這些變數作為復原計畫腳本的輸入。

  3. 在自動化帳戶資產中。 建立變數來儲存 NSG 名稱。 使用復原方案的名稱,將前置詞新增至變數名稱。

    Create an NSG name variable

  4. 建立變數來儲存 NSG 資源的資源組名。 使用復原方案的名稱,將前置詞新增至變數名稱。

    Create an NSG resource group name

  5. 在腳本中,使用此參考程式碼來取得變數值:

    Create an NSG resource group name

  6. 在腳本中,使用此參考程式碼來取得變數值:

    $NSGValue = $RecoveryPlanContext.RecoveryPlanName + "-NSG"
    $NSGRGValue = $RecoveryPlanContext.RecoveryPlanName + "-NSGRG"
    
    $NSGnameVar = Get-AutomationVariable -Name $NSGValue
    $RGnameVar = Get-AutomationVariable -Name $NSGRGValue
    
  7. 使用 Runbook 中的變數,將 NSG 套用至容錯移轉 VM 的網路介面:

    InlineScript {
    if (($Using:NSGname -ne $Null) -And ($Using:NSGRGname -ne $Null)) {
            $NSG = Get-AzureRmNetworkSecurityGroup -Name $Using:NSGname -ResourceGroupName $Using:NSGRGname
            Write-output $NSG.Id
            #Apply the NSG to a network interface
            #$vnet = Get-AzureRmVirtualNetwork -ResourceGroupName TestRG -Name TestVNet
            #Set-AzureRmVirtualNetworkSubnetConfig -VirtualNetwork $vnet -Name FrontEnd `
            #  -AddressPrefix 192.168.1.0/24 -NetworkSecurityGroup $NSG
        }
    }
    

針對每個復原方案,建立獨立的變數,以便重複使用腳本。 使用復原方案名稱新增前置詞。

如需此案例的完整端對端腳本,請檢閱 此腳本

使用複雜變數來儲存詳細資訊

在某些情況下,您可能無法為每個復原方案建立個別的變數。 請考慮您希望單一腳本在特定 VM 上指派公用 IP 位址的案例。 在另一個案例中,您可能想要在不同的 VM 上套用不同的 NSG(而不是在所有 VM 上)。 請注意:

  • 您可以製作任何復原方案可重複使用的腳本。
  • 每個復原方案可以有一個可變數目的 VM。
  • 例如,SharePoint 復原有兩個前端。 基本的企業營運 (LOB) 應用程式只有一個前端。
  • 在此案例中,您無法為每個復原方案建立個別變數。

在下列範例中,我們會在 Azure 自動化 帳戶中建立 複雜變數

我們藉由使用 Azure PowerShell 指定多個值來執行此動作。

  1. 在 PowerShell 中,登入您的 Azure 訂用帳戶:

    Connect-AzureRmAccount
    $sub = Get-AzureRmSubscription -Name <SubscriptionName>
    $sub | Select-AzureRmSubscription
    
  2. 若要儲存參數,請使用復原計畫的名稱建立複雜變數:

    $VMDetails = @{"VMGUID"=@{"ResourceGroupName"="RGNameOfNSG";"NSGName"="NameOfNSG"};"VMGUID2"=@{"ResourceGroupName"="RGNameOfNSG";"NSGName"="NameOfNSG"}}
        New-AzureRmAutomationVariable -ResourceGroupName <RG of Automation Account> -AutomationAccountName <AA Name> -Name <RecoveryPlanName> -Value $VMDetails -Encrypted $false
    
  3. 在這個複雜變數中, VMDetails 是受保護 VM 的 VM 識別碼。 若要取得 VM 識別碼,請在Azure 入口網站中檢視 VM 屬性。 下列螢幕擷取畫面顯示儲存兩個 VM 詳細資料的變數:

    Use the VM ID as the GUID

  4. 在 Runbook 中使用這個變數。 如果在復原方案內容中找到指定的 VM GUID,請在 VM 上套用 NSG:

    $VMDetailsObj = (Get-AutomationVariable -Name $RecoveryPlanContext.RecoveryPlanName).ToObject([hashtable])
    
  5. 在您的 Runbook 中,迴圈查看復原方案內容的 VM。 檢查 VM 是否存在於 $VMDetailsObj 中。 如果存在,請存取變數的屬性以套用 NSG:

        $VMinfo = $RecoveryPlanContext.VmMap | Get-Member | Where-Object MemberType -EQ NoteProperty | select -ExpandProperty Name
        $vmMap = $RecoveryPlanContext.VmMap
    
        foreach ($VMID in $VMinfo) {
            $VMDetails = $VMDetailsObj[$VMID].ToObject([hashtable]);
            Write-output $VMDetails
            if ($VMDetails -ne $Null) { #If the VM exists in the context, this will not be Null
                $VM = $vmMap.$VMID
                # Access the properties of the variable
                $NSGname = $VMDetails.NSGName
                $NSGRGname = $VMDetails.NSGResourceGroupName
    
                # Add code to apply the NSG properties to the VM
            }
        }
    

您可以針對不同的復原方案使用相同的腳本。 將對應至復原計畫的值儲存在不同的變數中,以輸入不同的參數。

範例指令碼

若要將範例腳本部署至您的自動化帳戶,請選取 [ 部署至 Azure ] 按鈕。

Deploy to Azure

下一步