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

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

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

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

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

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

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

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

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

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

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

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

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

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

  • Убедитесь, что в учетную запись службы автоматизации добавлены следующие модули.

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

    Все эти модули должны иметь совместимые версии. Самый простой способ — всегда использовать последние версии всех модулей.

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

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

    $NSGValue = $RecoveryPlanContext.RecoveryPlanName + "-NSG"
    $NSGRGValue = $RecoveryPlanContext.RecoveryPlanName + "-NSGRG"
    
    $NSGnameVar = Get-AutomationVariable -Name $NSGValue
    $RGnameVar = Get-AutomationVariable -Name $NSGRGValue
    
  6. Используйте переменные в модуле 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

В этом видеоролике приведен еще один пример. в котором показано, как выполнить восстановление двухуровневого приложения WordPress в Azure.

Дальнейшие действия