Добавление модулей Runbook службы автоматизации Azure в планы восстановления

В этой статье объясняется, как интегрировать модули runbook службы автоматизации Azure для расширения планов восстановления Azure Site Recovery. Мы покажем, как автоматизировать основные задачи, которые в противном случае выполняются вручную, и превратить многоэтапный процесс восстановление в действие, выполняемое одним щелчком.

Планы восстановления

Вы можете использовать планы восстановления при отработки отказа локальных компьютеров или виртуальных машин Azure. Планы восстановления помогают выработать системный процесс восстановления, в котором определено, как происходит отработка отказа компьютеров и как они запускаются и восстанавливаются после такой отработки.

Восстановление больших приложений может быть сложным. Планы восстановления помогают систематизировать действия, чтобы реализовать точное, воспроизводимое и автоматическое восстановление. Вы можете автоматизировать задачи в плане восстановления с помощью скриптов, а также модулей runbook службы автоматизации Azure. Типовыми примерами могут быть настройка параметров на виртуальной машине Azure после отработки отказа или перенастройка приложения, которое работает на виртуальной машине.

Модули runbook в планах восстановления

В план восстановления добавляются учетная запись службы автоматизации Azure и модули runbook. Модуль runbook вызывается при выполнении плана восстановления.

  • Учетная запись службы автоматизации может находиться в любом регионе Azure, но должна быть в той же подписке, что и хранилище Site Recovery.
  • Модуль runbook может выполняться в плане восстановления во время отработки отказа из основного расположения в дополнительное или во время восстановления из дополнительного расположения в основное.
  • Модули runbook в плане восстановления выполняются последовательно: один за другим в заданном порядке.
  • Если модули runbook в плане восстановления настраивают виртуальные машины для запуска в разных группах, выполнение плана восстановления продолжится, только когда Azure сообщит, что все виртуальные машины запущены.
  • Планы восстановления продолжают выполняться, даже если в скрипте возникает ошибка.

Контекст плана восстановления

При запуске скрипт внедряет в модуль runbook контекст плана восстановления. Контекст содержит переменные, представленные в таблице ниже.

Имя переменной Description
RecoveryPlanName Имя плана восстановления. Используется в действиях на основе имени.
FailoverType Указывает, является ли отработка отказа тестовой или рабочей.
FailoverDirection Указывает, производится ли восстановление в основное или дополнительное расположение.
GroupID Определяет номер группы в плане восстановления при выполнении плана.
VmMap Массив всех виртуальных машин в группе.
Ключ VMMap Уникальный ключ (GUID) для каждой виртуальной машины.
SubscriptionId Идентификатор подписки Azure, в которой создана виртуальная машина.
ResourceGroupName Имя группы ресурсов, в которой находится виртуальная машина.
CloudServiceName Имя облачной службы Azure, в которой создана виртуальная машина.
RoleName Имя виртуальной машины Azure.
RecoveryPointId Метка времени восстановления виртуальной машины.

Примечание.

Значение переменной 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 в цикле, можно использовать следующий код:

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 есть полезный пример скрипта контекста плана восстановления.

Перед началом работы

Настройка плана восстановления

  1. В хранилище выберите Recovery Plans (Site Recovery) (Планы восстановления, Site Recovery).

  2. Чтобы создать план восстановления, выберите + План восстановления. Подробнее. Если у вас уже есть план восстановления, выберите его, чтобы открыть.

  3. На странице плана восстановления выберите "Настроить".

    Нажмите кнопку

  4. Выберите многоточие (...) рядом с группой 1. Запустите действие "Добавить>запись".

  5. Убедитесь, что в поле Вставка действия выбран параметр Скрипт, и укажите имя скрипта (Hello World).

  6. Укажите учетную запись службы автоматизации и выберите runbook. Чтобы сохранить скрипт, нажмите кнопку "ОК". Сценарий будет добавлен в группу Группа 1: последующие действия.

Повторное использование скрипта runbook

Один и тот же скрипт runbook можно использовать в нескольких планах восстановления, передавая ему внешние переменные.

  • Переменные службы автоматизации Azure используются для хранения параметров для запуска плана восстановления.
  • Если перед именем переменной вы укажете имя плана восстановления, для каждого плана восстановления будут созданы собственные переменные, которые можно использовать в качестве параметров.
  • Эти параметры можно изменять, чтобы управлять работой скрипта, не изменяя его содержимое, однако принцип работы сценария будет изменен.

Использование простых строковых переменных в сценарии Runbook

Рассмотрим скрипт, который принимает входные данные группы безопасности сети (NSG) и применяет их к виртуальным машинам в плане восстановления.

  1. Чтобы определить для скрипта текущий выполняемый план восстановления, используйте контекст плана восстановления.

    workflow AddPublicIPAndNSG {
        param (
              [parameter(Mandatory=$false)]
              [Object]$RecoveryPlanContext
        )
    
        $RPName = $RecoveryPlanContext.RecoveryPlanName
    }
    
  2. Запишите имя NSG и группы ресурсов. Используйте эти переменные в качестве входных данных для сценариев плана восстановления.

  3. В ресурсах учетной записи службы автоматизации: Создайте переменную для хранения имени NSG. В качестве префикса добавьте перед ней имя плана восстановления.

    Создание переменной для имени NSG

  4. Создайте переменную для хранения имени группы ресурсов NSG. В качестве префикса добавьте перед ней имя плана восстановления.

    Создание имени группы ресурсов NSG

  5. В скрипте извлеките значения этих переменных, используя следующий код:

    Создание имени группы ресурсов NSG

  6. В скрипте извлеките значения этих переменных, используя следующий код:

    $NSGValue = $RecoveryPlanContext.RecoveryPlanName + "-NSG"
    $NSGRGValue = $RecoveryPlanContext.RecoveryPlanName + "-NSGRG"
    
    $NSGnameVar = Get-AutomationVariable -Name $NSGValue
    $RGnameVar = Get-AutomationVariable -Name $NSGRGValue
    
  7. Используйте переменные в модуле Runbook, что позволит применить NSG к сетевому интерфейсу виртуальной машины, для которой выполняется отработка отказа.

    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
        }
    }
    

Для каждого плана восстановления создайте независимые переменные, чтобы скрипт можно было использовать повторно. Перед именами переменных добавьте имя плана восстановления.

Использование сложной переменной для хранения дополнительных сведений

В некоторых случаях создание отдельных переменных для каждого плана восстановления может оказаться невозможным. Рассмотрим ситуацию, когда один скрипт должен назначать общедоступный IP-адрес на определенных виртуальных машинах. Этот же подход будет полезен, если нужно применить разные группы безопасности сети для нескольких (но не всех) виртуальных машин. Обратите внимание на следующие условия.

  • Такой скрипт можно многократно использовать для других планов восстановления.
  • Каждый план восстановления может иметь разное число виртуальных машин.
  • Например, точка восстановления SharePoint имеет два внешних интерфейса, а простые бизнес-приложения — только один.
  • В этом сценарии нельзя создавать отдельные переменные для каждого плана восстановления.

В следующем примере мы создадим в учетной записи службы автоматизации 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 содержит идентификатор защищенной виртуальной машины. Этот идентификатор указан в свойствах виртуальной машины на портале Azure. На снимке экрана ниже показано, что мы создали переменную для хранения сведений о двух виртуальных машинах.

    Использование идентификатора виртуальной машины в качестве GUID

  4. Используйте эту переменную в модуле runbook. Если указанный GUID виртуальной машины находится в контексте плана восстановления, примените группу NSG к виртуальной машине.

    $VMDetailsObj = (Get-AutomationVariable -Name $RecoveryPlanContext.RecoveryPlanName).ToObject([hashtable])
    
  5. В модуле Runbook выполните циклический перебор виртуальных машин, входящих в контекст плана восстановления, проверяя наличие этих виртуальных машин в $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 ".

Развернуть в Azure

Следующие шаги