Adicionar runbooks de Automação do Azure aos planos de recuperação

Este artigo descreve como integrar runbooks de Automação do Azure para estender os planos de recuperação do Azure Site Recovery. Mostraremos como automatizar tarefas básicas que, de outra forma, precisariam de intervenção manual e como converter uma recuperação de várias etapas em uma ação de clique único.

Planos de recuperação

Você pode usar planos de recuperação ao fazer failover de computadores locais ou VMs do Azure. Os planos de recuperação ajudam você a definir um processo de recuperação sistemático que define como os computadores fazem failover e como eles são iniciados e recuperados após o failover.

A recuperação de aplicativos grandes pode ser complexa. Os planos de recuperação ajudam a impor a ordem para que a recuperação seja consistentemente precisa, reproduzível e automática. Você pode automatizar tarefas em um plano de recuperação usando scripts, bem como runbooks de Automação do Azure. Exemplos típicos podem ser definir configurações em uma VM do Azure após o failover ou reconfigurar um aplicativo em execução na VM.

Runbooks em planos de recuperação

Você adiciona uma conta de Automação do Azure e runbooks a um plano de recuperação. O runbook é invocado quando o plano de recuperação é executado.

  • A conta de automação pode estar em qualquer região do Azure e deve estar na mesma assinatura que o cofre de Site Recovery.
  • Um runbook pode ser executado em um plano de recuperação durante o failover de um local primário para secundário ou durante o failback do local secundário para o primário.
  • Os runbooks em um plano de recuperação são executados em série, um após o outro, na ordem definida.
  • Se os runbooks em um plano de recuperação configurarem as VMs para iniciar em diferentes grupos, o plano de recuperação só continuará quando o Azure relatar todas as VMs como em execução.
  • Os planos de recuperação continuarão a ser executados, ainda que um script falhe.

Contexto do plano de recuperação

Quando um script é executado, ele injeta um contexto do plano de recuperação no runbook. O contexto contém as variáveis resumidas na tabela.

Nome da variável Descrição
RecoveryPlanName Nome do plano de recuperação. Usado em ações com base no nome.
FailoverType Especifica se é um failover de teste ou de produção.
FailoverDirection Especifica se a recuperação é feita em um local primário ou secundário.
GroupID Identifica o número de grupo no plano de recuperação quando o plano está em execução.
VmMap Uma matriz de todas as VMs do grupo.
Chave VMMap Uma chave exclusiva (GUID) para cada VM.
SubscriptionId A ID da assinatura do Azure em que a VM foi criada.
ResourceGroupName Nome do grupo de recursos em que a VM está localizada.
CloudServiceName O nome de serviço de nuvem do Azure no qual a VM foi criada.
RoleName O nome da VM do Azure.
RecoveryPointId O carimbo de data/hora para a recuperação da VM.

Observação

O valor da variável "FailoverDirection" será "PrimaryToSecondary" no caso de failover e "SecondaryToPrimary" no caso de failback.

O seguinte exemplo mostra uma variável de contexto:

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

Se você quiser acessar todas as VMs no VMMap em um loop, use o seguinte código:

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

O blog de Aman Sharma no Harvesting Clouds tem um exemplo útil de um script de contexto de plano de recuperação.

Antes de começar

  • Se você estiver conhecendo a Automação do Azure agora, inscreva-se e baixe scripts de exemplo. Para obter mais informações, consulte Runbooks de automação - problemas conhecidos e limitações.

  • Garanta que a conta de Automação tem os seguintes módulos:

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

    Todos os módulos devem ser de versões compatíveis. A maneira mais simples é sempre usar as versões mais recentes de todos os módulos.

Personalizar o plano de recuperação

  1. No cofre, selecione Planos de Recuperação (Site Recovery)

  2. Para criar um plano de recuperação, selecione +Plano de recuperação. Saiba mais. Se você já tiver um plano de recuperação, selecione para abri-lo.

  3. Na página do plano de recuperação, selecione Personalizar.

    Select the Customize button

  4. Selecione as elipses (...) ao lado de Grupo 1: Iniciar>Adicionar ação de postagem.

  5. Em Inserir ação, verifique se o Script está selecionado e especifique um nome para o script (Olá, Mundo).

  6. Especifique uma conta de automação e selecione um runbook. Para salvar o script, selecione OK. O script é adicionado ao Grupo 1: Pós-etapas.

Reutilizar um script de runbook

Use um único script de runbook em vários planos de recuperação com variáveis externas.

  • As variáveis de Automação do Azure são usadas para armazenar parâmetros para executar um plano de recuperação.
  • Adicionando o nome do plano de recuperação como um prefixo da variável, você pode criar variáveis individuais para cada plano de recuperação. Em seguida, use as variáveis como parâmetros.
  • Altere um parâmetro sem alterar o script, mas ainda altere a maneira como o script funciona.

Usar uma variável de cadeia de caracteres simples em um script de runbook

Neste exemplo, um script usa a entrada de um NSG (Grupo de Segurança de Rede) e a aplica às VMs em um plano de recuperação.

  1. Para que o script possa detectar qual plano de recuperação está em execução, use este contexto do plano de recuperação:

    workflow AddPublicIPAndNSG {
        param (
              [parameter(Mandatory=$false)]
              [Object]$RecoveryPlanContext
        )
    
        $RPName = $RecoveryPlanContext.RecoveryPlanName
    }
    
  2. Anote o nome NSG e o grupo de recursos. Use essas variáveis como entradas para scripts do plano de recuperação.

  3. Nos ativos da conta de Automação. Crie uma variável para armazenar o nome do NSG. Adicione um prefixo ao nome da variável com o nome do plano de recuperação.

    Create an NSG name variable

  4. Crie uma variável para armazenar o nome do grupo de recursos do recurso do NSG. Adicione um prefixo ao nome da variável com o nome do plano de recuperação.

    Create an NSG resource group name

  5. No script, use este código de referência para obter os valores de variáveis:

    Create an NSG resource group name

  6. No script, use este código de referência para obter os valores de variáveis:

    $NSGValue = $RecoveryPlanContext.RecoveryPlanName + "-NSG"
    $NSGRGValue = $RecoveryPlanContext.RecoveryPlanName + "-NSGRG"
    
    $NSGnameVar = Get-AutomationVariable -Name $NSGValue
    $RGnameVar = Get-AutomationVariable -Name $NSGRGValue
    
  7. Use as variáveis no runbook para aplicar o NSG ao adaptador de rede da VM com failover:

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

Para cada plano de recuperação, crie variáveis independentes, de modo que você possa reutilizar o script. Adicione um prefixo usando o nome do plano de recuperação.

Usar uma variável complexa para armazenar mais informações

Em alguns cenários, talvez não seja possível criar variáveis separadas para cada plano de recuperação. Considere um cenário no qual você deseja que um único script ative um endereço IP público em VMs específicas. Em outro cenário, talvez você deseje aplicar NSGs diferentes a VMs diferentes (não em todas as VMs). Observe que:

  • Você pode criar um script que é reutilizável para qualquer plano de recuperação.
  • Cada plano de recuperação pode ter um número variável de VMs.
  • Por exemplo, uma recuperação do SharePoint tem dois front-ends. Um aplicativo LOB (linha de negócios) básico tem apenas um front-end.
  • Nesse cenário, você não pode criar variáveis separadas para cada plano de recuperação.

No exemplo a seguir, usamos uma nova técnica e criamos uma variável complexa nos ativos da conta de Automação do Azure.

Fazemos isso especificando vários valores, usando o Azure PowerShell.

  1. No PowerShell, entre em sua assinatura do Azure:

    Connect-AzureRmAccount
    $sub = Get-AzureRmSubscription -Name <SubscriptionName>
    $sub | Select-AzureRmSubscription
    
  2. Para armazenar os parâmetros, crie uma variável complexa usando o mesmo nome do plano de recuperação:

    $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. Nessa variável complexa, VMDetails é a ID de VM da VM protegida. Para obter a ID de VM, no portal do Azure, exiba as propriedades da VM. A seguinte captura de tela mostra uma variável que armazena os detalhes de duas VMs:

    Use the VM ID as the GUID

  4. Use essa variável no runbook. Se o GUID de VM indicado for encontrado no contexto do plano de recuperação, aplique o NSG à VM:

    $VMDetailsObj = (Get-AutomationVariable -Name $RecoveryPlanContext.RecoveryPlanName).ToObject([hashtable])
    
  5. No runbook, percorra as VMs do contexto do plano de recuperação. Verifique se a VM existe em $VMDetailsObj. Se ela existir, acesse as propriedades da variável para aplicar o 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
            }
        }
    

Use o mesmo script para planos de recuperação diferentes. Insira parâmetros diferentes armazenando o valor que corresponde a um plano de recuperação em variáveis diferentes.

Scripts de exemplo

Para implantar scripts de amostra na sua conta de Automação, selecione o botão implantar no Azure.

Deploy to Azure

Próximas etapas