將 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 在其部落格 Harvesting Clouds 上提供了實用的復原方案內容指令碼範例。

在您開始使用 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 位址的指令碼。 在另一個案例中,您可能想要將不同的 NSG 套用至不同的 VM (並非所有 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,請將 NSG 套用至 VM:

    $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

下一步