Azure Automation-runbooks aan herstelplannen toevoegen

In dit artikel wordt beschreven hoe u Azure Automation runbooks kunt integreren om de herstelplannen Azure Site Recovery uit te breiden. We laten u zien hoe u basistaken automatiseert die anders handmatig moeten worden uitgevoerd en hoe u een herstelactie met meerdere stappen kunt converteren naar een actie met één klik.

Herstelplannen

U kunt herstelplannen gebruiken wanneer u een fail over on-premises machines of Azure-VM's hebt. Met herstelplannen kunt u een systematisch herstelproces definiëren dat definieert hoe machines een failover uitvoeren en hoe ze na een failover starten en herstellen.

Herstel van grote apps kan complex zijn. Herstelplannen zorgen voor een consistente volgorde, zodat herstel consistent, herhaalbaar en geautomatiseerd is. U kunt taken in een herstelplan automatiseren met behulp van scripts, evenals Azure Automation runbooks. Typische voorbeelden zijn het configureren van instellingen op een azure-VM na een failover of het opnieuw configureren van een app die wordt uitgevoerd op de VM.

Runbooks in herstelplannen

U voegt een Azure Automation-account en runbooks toe aan een herstelplan. Het runbook wordt aangeroepen wanneer het herstelplan wordt uitgevoerd.

  • Het Automation-account kan zich in elke Azure-regio en moet zich in hetzelfde abonnement als de Site Recovery kluis.
  • Een runbook kan in een herstelplan worden uitgevoerd tijdens een failover van een primaire locatie naar een secundaire locatie of tijdens een failback van de secundaire locatie naar de primaire locatie.
  • Runbooks in een herstelplan worden serieel uitgevoerd, de ene na de andere, in de stellen volgorde.
  • Als runbooks in een herstelplan VM's configureren om in verschillende groepen te starten, wordt het herstelplan alleen voortgezet wanneer Azure alle VM's rapporteert als actief.
  • Herstelplannen blijven worden uitgevoerd, zelfs als een script mislukt.

Context van herstelplan

Wanneer een script wordt uitgevoerd, wordt de context van een herstelplan in het runbook geplaatst. De context bevat de variabelen die in de tabel worden samengevat.

Naam van de variabele Beschrijving
RecoveryPlanName Naam van herstelplan. Wordt gebruikt in acties op basis van de naam.
FailoverType Hiermee geeft u op of het een test- of productie-failover is.
FailoverDirection Hiermee geeft u op of herstel naar een primaire of secundaire locatie is.
GroupID Hiermee wordt het groepsnummer in het herstelplan geïdentificeerd wanneer het plan wordt uitgevoerd.
VmMap Een matrix van alle VM's in de groep.
VMMap-sleutel Een unieke sleutel (GUID) voor elke VM.
SubscriptionId De Azure-abonnements-id waarin de VM is gemaakt.
ResourceGroupName Naam van de resourcegroep waarin de VM zich bevindt.
CloudServiceName De naam van de Azure-cloudservice waaronder de VM is gemaakt.
RoleName De naam van de Azure-VM.
RecoveryPointId De tijdstempel voor het herstel van de VM.

Notitie

De waarde voor de variabele 'FailoverDirection' is 'PrimaryToSecondary' in het geval van failover en 'SecondaryToPrimary' in het geval van failback.

In het volgende voorbeeld ziet u een contextvariabele:

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

Als u alle VM's in VMMap in een lus wilt openen, kunt u de volgende code gebruiken:

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

De blog over van Aman Sharma in Clouds met een nuttig voorbeeld van een contextscript voor een herstelplan.

Voordat u begint

  • Als u geen tijd hebt Azure Automation, kunt u zich registreren en voorbeeldscripts downloaden.

  • Zorg ervoor dat het Automation-account de volgende modules heeft:

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

    Alle modules moeten compatibele versies hebben. De eenvoudigste manier is om altijd de nieuwste versies van alle modules te gebruiken.

Het herstelplan aanpassen

  1. Selecteer herstelplannen in de kluis (Site Recovery)

  2. Klik op +Herstelplan om een herstelplan te maken. Meer informatie. Als u al een herstelplan hebt, selecteert u om dit te openen.

  3. Klik op de pagina herstelplan op Aanpassen.

    Klik op de knop Aanpassen

  4. Klik op het beletsel (...) naast Groep 1: De actie Post toevoegen > starten.

  5. Controleer in de actie Invoegen of Script is geselecteerd en geef een naam op voor het script (Hallo wereld).

  6. Geef een Automation-account op en selecteer een runbook. Klik op OK om het script op te slaan. Het script wordt toegevoegd aan groep 1: na stappen.

Een runbookscript opnieuw gebruiken

U kunt één runbookscript in meerdere herstelplannen gebruiken met behulp van externe variabelen.

  • U gebruikt Azure Automation om parameters op te slaan voor het uitvoeren van een herstelplan.
  • Door de naam van het herstelplan als voorvoegsel toe te voegen aan de variabele, kunt u afzonderlijke variabelen maken voor elk herstelplan. Gebruik vervolgens de variabelen als parameters.
  • U kunt een parameter wijzigen zonder het script te wijzigen, maar nog steeds de manier wijzigen waarop het script werkt.

Een eenvoudige tekenreeksvariabele gebruiken in een runbookscript

In dit voorbeeld wordt met een script de invoer van een netwerkbeveiligingsgroep (NSG) gebruikt en toegepast op de VM's in een herstelplan.

  1. Gebruik deze context voor het herstelplan, zodat het script kan detecteren welk herstelplan wordt uitgevoerd:

    workflow AddPublicIPAndNSG {
        param (
              [parameter(Mandatory=$false)]
              [Object]$RecoveryPlanContext
        )
    
        $RPName = $RecoveryPlanContext.RecoveryPlanName
    
  2. Noteer de NSG-naam en de resourcegroep. U gebruikt deze variabelen als invoer voor herstelplanscripts.

  3. In de Automation-accountactiva. maak een variabele voor het opslaan van de NSG-naam. Voeg een voorvoegsel toe aan de naam van de variabele met de naam van het herstelplan.

    Een NSG-naamvariabele maken

  4. Maak een variabele om de naam van de resourcegroep voor de NSG-resource op te slaan. Voeg een voorvoegsel toe aan de naam van de variabele met de naam van het herstelplan.

    Een NSG-resourcegroepnaam maken

  5. Gebruik deze referentiecode in het script om de variabele waarden op te halen:

    $NSGValue = $RecoveryPlanContext.RecoveryPlanName + "-NSG"
    $NSGRGValue = $RecoveryPlanContext.RecoveryPlanName + "-NSGRG"
    
    $NSGnameVar = Get-AutomationVariable -Name $NSGValue
    $RGnameVar = Get-AutomationVariable -Name $NSGRGValue
    
  6. Gebruik de variabelen in het runbook om de NSG toe te passen op de netwerkinterface van de VM met een mislukte overboeking:

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

Maak voor elk herstelplan onafhankelijke variabelen zodat u het script opnieuw kunt gebruiken. Voeg een voorvoegsel toe met behulp van de naam van het herstelplan.

Bekijk dit script voor een volledig end-to-end-script voor dit scenario.

Een complexe variabele gebruiken om meer informatie op te slaan

In sommige scenario's kunt u mogelijk geen afzonderlijke variabelen maken voor elk herstelplan. Denk aan een scenario waarin u één script wilt gebruiken om een openbaar IP-adres toe te wijzen aan specifieke VM's. In een ander scenario wilt u mogelijk verschillende NSG's toepassen op verschillende VM's (niet op alle VM's). Opmerking:

  • U kunt een script maken dat herbruikbaar is voor elk herstelplan.
  • Elk herstelplan kan een variabel aantal VM's hebben.
  • Een voorbeeld: een SharePoint herstel heeft twee front-ends. Een eenvoudige LOB-toepassing (Line-Of-Business) heeft slechts één front-end.
  • In dit scenario kunt u geen afzonderlijke variabelen maken voor elk herstelplan.

In het volgende voorbeeld maken we een complexe variabele in het Azure Automation account.

We doen dit door meerdere waarden op te geven met behulp van Azure PowerShell.

  1. Meld u in PowerShell aan bij uw Azure-abonnement:

    Connect-AzureRmAccount
    $sub = Get-AzureRmSubscription -Name <SubscriptionName>
    $sub | Select-AzureRmSubscription
    
  2. Als u de parameters wilt opslaan, maakt u de complexe variabele met behulp van de naam van het herstelplan:

    $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. In deze complexe variabele is VMDetails de VM-id voor de beveiligde VM. Bekijk de VM-eigenschappen in de Azure Portal om de VM-id op te halen. In de volgende schermopname ziet u een variabele die de details van twee VM's op slaat:

    De VM-id gebruiken als guid

  4. Gebruik deze variabele in uw runbook. Als de aangegeven VM-GUID wordt gevonden in de context van het herstelplan, moet u de NSG toepassen op de VM:

    $VMDetailsObj = (Get-AutomationVariable -Name $RecoveryPlanContext.RecoveryPlanName).ToObject([hashtable])
    
  5. Loop in uw runbook door de VM's van de context van het herstelplan. Controleer of de VM bestaat in $VMDetailsObj. Als deze bestaat, gaat u naar de eigenschappen van de variabele om de NSG toe te passen:

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

U kunt hetzelfde script gebruiken voor verschillende herstelplannen. Voer verschillende parameters in door de waarde die overeenkomt met een herstelplan op te slaan in verschillende variabelen.

Voorbeeldscripts

Als u voorbeeldscripts wilt implementeren in uw Automation-account, klikt u op de knop Implementeren in Azure.

Implementeren in Azure

Deze video biedt een ander voorbeeld. Hier wordt gedemonstreerd hoe u een WordPress-toepassing met twee lagen herstelt naar Azure:

Volgende stappen