Delen via


De opstartvolgorde voor DevTest Lab-VM's definiëren met Azure Automation

In dit artikel wordt uitgelegd hoe u virtuele Machines (VM's) van DevTest Labs in een specifieke volgorde start met behulp van een PowerShell-runbook in Azure Automation. Het PowerShell-script maakt gebruik van tags op lab-VM's, zodat u de opstartvolgorde kunt wijzigen zonder dat u het script hoeft te wijzigen.

Met de functie autostart van DevTest Labs kunnen lab-VM's zo worden geconfigureerd dat ze op een bepaald tijdstip automatisch worden gestart. Soms wilt u echter dat lab-VM's in een specifieke volgorde beginnen. Als een jumpbox-VM in een lab bijvoorbeeld het toegangspunt is voor de andere VM's, moet de jumpbox-VM vóór de andere VM's worden gestart.

Vereiste voorwaarden

  • Maak en pas een tag met de naam StartupOrder toe op alle lab-VM's met een geschikte opstartwaarde, 0 tot en met 10. Wijs machines die niet gestart hoeven te worden aan als -1.

  • Maak een Azure Automation-account door de instructies te volgen in Een zelfstandig Azure Automation-account maken. Kies de instelling Uitvoeren-als-accounts wanneer u het account maakt.

Het PowerShell-runbook maken

  1. Selecteer Runbooks in het linkermenu op de pagina Overzicht voor het Automation-account.
  2. Selecteer een runbook maken op de pagina Runbooks.
  3. Volg de instructies in Een Automation PowerShell-runbook maken met beheerde identiteit om een PowerShell-runbook te maken. Vul het runbook in met het volgende PowerShell-script.

Het PowerShell-script voorbereiden

Het volgende script gebruikt de abonnementsnaam en de labnaam als parameters. Het script haalt alle VM's in het lab op en parseert hun taggegevens om een lijst met VM-namen en hun opstartvolgorde te maken. Het script doorloopt de lijst in volgorde en start de VM's.

Als er meerdere VM's in een specifiek ordernummer staan, worden deze VM's asynchroon gestart met behulp van PowerShell-taken. Vm's die geen tag hebben, hebben hun opstartwaarde ingesteld op 10 en beginnen standaard als laatste. Het script negeert vm's met andere tagwaarden dan 0 tot en met 10.

#Requires -Version 3.0
#Requires -Module AzureRM.Resources

param
(
    [Parameter(Mandatory=$false, HelpMessage="Name of the subscription that has the lab")]
    [string] $SubscriptionName,

    [Parameter(Mandatory=$false, HelpMessage="Lab name")]
    [string] $LabName
)

# Connect and add the appropriate subscription
$Conn = Get-AutomationConnection -Name AzureRunAsConnection

Add-AzureRMAccount -ServicePrincipal -Tenant $Conn.TenantID -ApplicationID $Conn.ApplicationId -Subscription $SubscriptionName -CertificateThumbprint $Conn.CertificateThumbprint

# Find the lab
$dtLab = Find-AzResource -ResourceType 'Microsoft.DevTestLab/labs' -ResourceNameEquals $LabName

# Get the VMs
$dtlAllVms = New-Object System.Collections.ArrayList
$AllVMs = Get-AzResource -ResourceId "$($dtLab.ResourceId)/virtualmachines" -ApiVersion 2016-05-15

# Get the StartupOrder tag. If missing, set to start up last (10).
ForEach ($vm in $AllVMs) {
    if ($vm.Tags) {
        if ($vm.Tags['StartupOrder']) {
            $startupValue = $vm.Tags['StartupOrder']
        } else {
            $startupValue = 10
        }
        } else {
            $startupValue = 10
        }
        $dtlAllVms.Add(@{$vm.Name = $startupValue}) > $null
}

# Setup for the async multiple vm start

# Save profile
$profilePath = Join-Path $env:Temp "profile.json"
If (Test-Path $profilePath){
    Remove-Item $profilePath
}
Save-AzContext -Path $profilePath

# Job to start VMs asynch
$startVMBlock = {
    Param($devTestLab,$vmToStart,$profilePath)
    Import-AzContext -Path ($profilePath)
    Invoke-AzResourceAction `
        -ResourceId "$($devTestLab.ResourceId)/virtualmachines/$vmToStart" `
        -Action Start `
        -Force
    Write-Output "Started: $vmToStart"
}

$current = 0
# Start in order from 0 to 10

While ($current -le 10) {
# Get the VMs in the current stage
    $tobeStarted = $null
    $tobeStarted = $dtlAllVms | Where-Object { $_.Values -eq $current}
    if ($tobeStarted.Count -eq 1) {
        # Run sync – jobs not necessary for a single VM
        $returnStatus = Invoke-AzResourceAction `
                -ResourceId "$($dtLab.ResourceId)/virtualmachines/$($tobeStarted.Keys)" `
                -Action Start `
                -Force
        Write-Output "$($tobeStarted.Keys) status: $($returnStatus.status)"
    } elseif ($tobeStarted.Count -gt 1) {
        # Start multiple VMs async
        $jobs = @()
        Write-Output "Start Jobs start: $(Get-Date)"
        
        # Jobs
        $jobs += Start-Job -ScriptBlock $startVMBlock -ArgumentList $dtLab, $($singlevm.Keys), $profilePath
        Write-Output "Start Jobs end: $(Get-Date)"
    }

    # Get results from all jobs
    if($jobs.Count -ne 0) {
        Write-Output "Receive Jobs start: $(Get-Date)"
        foreach ($job in $jobs){
            $jobResult = Receive-Job -Job $job -Wait | Write-Output
        }
        Remove-Job -Job $jobs -Force
    }
    else
    {
        Write-Output "Information: No jobs available"
    }
}

Het script uitvoeren

  • Als u dit script dagelijks wilt uitvoeren, maakt u een planning in het Automation-account en koppelt u de planning aan het runbook.

  • In een bedrijfsscenario met meerdere abonnementen met meerdere labs kunt u de parametergegevens voor verschillende labs en abonnementen opslaan in een bestand. Geef het bestand door aan het script in plaats van de afzonderlijke parameters door te geven.

  • In dit voorbeeld wordt Azure Automation gebruikt om het PowerShell-script uit te voeren, maar u kunt ook andere opties gebruiken, zoals een build-/release-pijplijn.

Volgende stappen