將 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",
"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
所有模組都必須是相容版本。 最簡單的方式是所有模組一律使用最新版本。
自訂復原方案
在保存庫中,選取 [復原方案 (Site Recovery)]
若要建立復原方案,請選取 [+復原方案]。 深入了解。 如果您已有復原方案,請加以選取並開啟。
在復原方案頁面中,選取 [自訂]。
選取 [群組 1:開始]>[新增後續動作] 旁的省略符號 (...)。
在 [插入動作] 中,確認已選取 [指令碼],並指定指令碼的名稱 (Hello World)。
指定自動化帳戶,然後選取 Runbook。 若要儲存指令碼,請選取 [確定]。 指令碼會新增至 [群組 1: 後續步驟]。
重複使用 Runbook 指令碼
您可以透過外部變數,在多個復原方案中使用單一 Runbook 指令碼。
- 您可以使用 Azure 自動化變數儲存用來執行復原方案的參數。
- 您可以在變數前面加上復原方案名稱,為每個復原方案建立個別變數。 然後,使用這些變數作為參數。
- 您可以變更參數而不需要變更指令碼,但仍變更指令碼的運作方式。
在 Runbook 指令碼中使用簡單的字串變數
在此範例中,指令碼會接受網路安全性群組 (NSG) 的輸入,並將其套用至復原方案中的 VM。
若要讓指令碼能夠偵測出正在執行的復原方案,請使用此復原方案內容:
workflow AddPublicIPAndNSG { param ( [parameter(Mandatory=$false)] [Object]$RecoveryPlanContext ) $RPName = $RecoveryPlanContext.RecoveryPlanName }
請注意 NSG 名稱和資源群組。 您可以使用這些變數作為復原方案指令碼的輸入。
在自動化帳戶資產中, 建立用來儲存 NSG 名稱的變數。 在變數名稱前面加上復原方案的名稱。
建立變數來儲存 NSG 資源的資源群組名稱。 在變數名稱前面加上復原方案的名稱。
在指令碼中,使用下列參考程式碼來取得變數值:
在指令碼中,使用下列參考程式碼來取得變數值:
$NSGValue = $RecoveryPlanContext.RecoveryPlanName + "-NSG" $NSGRGValue = $RecoveryPlanContext.RecoveryPlanName + "-NSGRG" $NSGnameVar = Get-AutomationVariable -Name $NSGValue $RGnameVar = Get-AutomationVariable -Name $NSGRGValue
在 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 指定多個值。
在 PowerShell 中,登入您的 Azure 訂用帳戶:
Connect-AzureRmAccount $sub = Get-AzureRmSubscription -Name <SubscriptionName> $sub | Select-AzureRmSubscription
若要儲存參數,請使用復原方案的名稱來建立複雜變數:
$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
在此複雜變數中,VMDetails 是受保護 VM 的 VM 識別碼。 您若要取得 VM 識別碼,請在 Azure 入口網站中,檢視 VM 屬性。 下列螢幕擷取畫面顯儲存兩個 VM 之詳細資料的變數:
在您的 Runbook 中使用此變數。 如果在復原方案內容中找到指定的 VM GUID,請將 NSG 套用至 VM:
$VMDetailsObj = (Get-AutomationVariable -Name $RecoveryPlanContext.RecoveryPlanName).ToObject([hashtable])
在您的 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] 按鈕。