Adicionar runbooks de Automatizaçã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 . Mostramos-lhe como automatizar tarefas básicas, que de outra forma precisariam de intervenção manual, e como converter uma recuperação com vários passos numa ação de clique único.

Planos de recuperação

Você pode usar planos de recuperação ao fazer failover de máquinas locais ou VMs do Azure. Os planos de recuperação ajudam a definir um processo de recuperação sistemático que define como as máquinas fazem failover e como elas são iniciadas e recuperadas após o failover.

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

  • Saiba mais sobre os planos de recuperação.
  • Saiba mais sobre os runbooks de Automação do Azure.

Runbooks nos 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 do Site Recovery.
  • Um runbook pode ser executado em um plano de recuperação durante o failover de um local primário para o secundário ou durante o failback do local secundário para o principal.
  • 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 VMs para iniciar em grupos diferentes, o plano de recuperação continuará somente quando o Azure relatar todas as VMs como em execução.
  • Os planos de recuperação continuam a ser executados, mesmo que um script falhe.

Contexto do plano de recuperação

Quando um script é executado, ele injeta um contexto de 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 teste ou failover de produção.
FailoverDirection Especifica se a recuperação é para um local primário ou secundário.
ID do Grupo Identifica o número do grupo no plano de recuperação quando o plano está em execução.
VmMap Uma matriz de todas as VMs no grupo.
Chave VMMap Uma chave exclusiva (GUID) para cada VM.
SubscriptionId A ID de assinatura do Azure na qual a VM foi criada.
ResourceGroupName Nome do grupo de recursos no qual a VM está localizada.
CloudServiceName O nome do serviço de nuvem do Azure sob o qual a VM foi criada.
RoleName O nome da VM do Azure.
RecoveryPointId O carimbo de data/hora para a recuperação da VM.

Nota

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

O exemplo a seguir 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, você pode usar 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ê é novo na Automação do Azure, pode se inscrever e baixar scripts de exemplo. Para obter mais informações, consulte Runbooks de automação - problemas e limitações conhecidos.

  • Certifique-se de que a conta de automação tenha 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 (Recuperação de Site)

  2. Para criar um plano de recuperação, selecione +Plano de recuperação. Mais informações. Se 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 reticências (...) ao lado de Grupo 1: Iniciar>Adicionar ação de postagem.

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

  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 runbook

Você pode usar um único script de runbook em vários planos de recuperação, usando variáveis externas.

  • Você usa variáveis de Automação do Azure para armazenar parâmetros para executar um plano de recuperação.
  • Ao adicionar o nome do plano de recuperação como um prefixo à variável, você pode criar variáveis individuais para cada plano de recuperação. Em seguida, use as variáveis como parâmetros.
  • Você pode alterar um parâmetro sem alterar o script, mas ainda assim alterar a maneira como o script funciona.

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

Neste exemplo, um script pega 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 detetar qual plano de recuperação está em execução, use este contexto de plano de recuperação:

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

  3. Nos ativos da conta de automação. crie uma variável para armazenar o nome 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 para o recurso 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 das variáveis:

    Create an NSG resource group name

  6. No script, use este código de referência para obter os valores das 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 à interface 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 para 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 atribua um endereço IP público em VMs específicas. Em outro cenário, talvez você queira aplicar NSGs diferentes em VMs diferentes (não em todas as VMs). Tenha em atenção que:

  • Você pode criar um script que seja 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 básico de linha de negócios (LOB) tem apenas um front-end.
  • Nesse cenário, não é possível criar variáveis separadas para cada plano de recuperação.

No exemplo a seguir, criamos uma variável complexa na conta de Automação do Azure.

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

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

    Connect-AzureRmAccount
    $sub = Get-AzureRmSubscription -Name <SubscriptionName>
    $sub | Select-AzureRmSubscription
    
  2. Para armazenar os parâmetros, crie a variável complexa usando o 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. Nesta variável complexa, VMDetails é o ID da VM para a VM protegida. Para obter a ID da VM, no portal do Azure, exiba as propriedades da VM. A captura de tela a seguir mostra uma variável que armazena os detalhes de duas VMs:

    Use the VM ID as the GUID

  4. Use essa variável em seu runbook. Se o GUID da VM indicado for encontrado no contexto do plano de recuperação, aplique o NSG na 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 no $VMDetailsObj. Se 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
            }
        }
    

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

Scripts de amostra

Para implantar scripts de exemplo em sua conta de Automação, selecione o botão Implantar no Azure .

Deploy to Azure

Próximos passos