Delen via


Definieer de opstartvolgorde voor DevTest Lab-VM's 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 Automatisch starten van DevTest Labs kunt u lab-VM's configureren om automatisch op een opgegeven tijdstip te starten. Soms wilt u echter dat lab-VM's in een specifieke volgorde worden gestart. Als bijvoorbeeld een jumpbox-VM in een lab het toegangspunt is voor de andere VM's, moet de jumpbox-VM vóór de andere VM's worden gestart.

Vereisten

  • Maak een tag met de naam StartupOrderen pas deze toe op alle lab-VM's met de juiste opstartwaarde, 0 tot en met 10. Geef alle computers op die niet als -1 hoeven te worden gestart.

  • Maak een Azure Automation-account door de instructies te volgen in Een zelfstandig Azure Automation-account maken. Kies de optie 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 op de pagina Runbooksde optie Een runbook maken.
  3. Volg de instructies in Een Automation PowerShell-runbook maken met behulp van een beheerde identiteit om een PowerShell-runbook te maken. Vul het runbook in met het volgende PowerShell-script.

Het PowerShell-script voorbereiden

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

Als er meerdere VM's in een specifiek volgordenummer zijn, worden die 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 ondernemingsscenario 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