Dela via


Definiera startordningen för virtuella DevTest Lab-datorer med Azure Automation

Den här artikeln beskriver hur du startar virtuella DevTest Labs-datorer i en viss ordning med hjälp av en PowerShell-runbook i Azure Automation. PowerShell-skriptet använder taggar på virtuella labbdatorer, så du kan ändra startordningen utan att behöva ändra skriptet.

Funktionen DevTest Labs autostart kan konfigurera virtuella labbdatorer så att de startar automatiskt vid en angiven tidpunkt. Ibland kanske du dock vill att de virtuella labbdatorerna ska starta i en viss sekvens. Om en virtuell jumpbox-dator i ett labb till exempel är åtkomstpunkten till de andra virtuella datorerna måste den virtuella jumpbox-datorn starta före de andra virtuella datorerna.

Förutsättningar

Skapa PowerShell-runbooken

  1. På sidan Översikt för Automation-kontot väljer du Runbooks på den vänstra menyn.
  2. På sidan Runbooks väljer du Skapa en runbook.
  3. Följ anvisningarna i Skapa en Automation PowerShell-runbook med hanterad identitet för att skapa en PowerShell-runbook. Fyll i runbooken med följande PowerShell-skript.

Förbereda PowerShell-skriptet

Följande skript tar prenumerationsnamnet och labbnamnet som parametrar. Skriptet hämtar alla virtuella datorer i labbet och parsar deras tagginformation för att skapa en lista över namn på virtuella datorer och deras startordning. Skriptet går igenom listan i ordning och startar de virtuella datorerna.

Om det finns flera virtuella datorer i ett visst ordningsnummer startar de virtuella datorerna asynkront med Hjälp av PowerShell-jobb. Virtuella datorer som inte har någon tagg har sitt startvärde inställt på 10 och börjar sist som standard. Skriptet ignorerar alla virtuella datorer som har andra taggvärden än 0 till och med 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"
    }
}

Kör skriptet

  • Om du vill köra det här skriptet dagligen skapar du ett schema i Automation-kontot och länkar schemat till runbooken.

  • I ett företagsscenario som har flera prenumerationer med flera labb kan du lagra parameterinformationen för olika labb och prenumerationer i en fil. Skicka filen till skriptet i stället för att skicka de enskilda parametrarna.

  • I det här exemplet används Azure Automation för att köra PowerShell-skriptet, men du kan också använda andra alternativ, till exempel en bygg-/versionspipeline.

Nästa steg