Sdílet prostřednictvím


Definování pořadí spuštění pro virtuální počítače DevTest Lab pomocí Azure Automation

Tento článek vysvětluje, jak spustit virtuální počítače DevTest Labs v určitém pořadí pomocí runbooku PowerShellu v Azure Automation. Skript PowerShellu používá značky na virtuálních počítačích testovacího prostředí, takže můžete změnit pořadí spouštění bez nutnosti měnit skript.

Funkce automatického spuštění DevTest Labs může nakonfigurovat virtuální počítače testovacího prostředí tak, aby se automaticky spustily v zadaném čase. Někdy ale můžete chtít, aby se virtuální počítače testovacího prostředí spustily v určitém pořadí. Pokud je například virtuální počítač jumpboxu v testovacím prostředí přístupovým bodem k ostatním virtuálním počítačům, musí se virtuální počítač jumpbox spustit před ostatními virtuálními počítači.

Požadavky

  • Vytvořte a použijte značku s názvem StartupOrder na všechny virtuální počítače testovacího prostředí s odpovídající hodnotou spuštění 0 až 10. Určete všechny počítače, které nemusí spouštět na -1.

  • Vytvořte účet Azure Automation podle pokynů v tématu Vytvoření samostatného účtu Azure Automation. Při vytváření účtu zvolte možnost Účty Spustit jako .

Vytvoření runbooku PowerShellu

  1. Na stránce Přehled účtu Automation v nabídce vlevo vyberte Runbooky .
  2. Na stránce Runbooky vyberte Vytvořit runbook.
  3. Postupujte podle pokynů v tématu Vytvoření runbooku PowerShellu služby Automation pomocí spravované identity a vytvořte runbook PowerShellu. Naplňte runbook následujícím skriptem PowerShellu.

Příprava skriptu PowerShellu

Následující skript přebírá název předplatného a název testovacího prostředí jako parametry. Skript získá všechny virtuální počítače v testovacím prostředí a parsuje informace o jejich značkách a vytvoří seznam názvů virtuálních počítačů a jejich pořadí spuštění. Skript provede seznam v pořadí a spustí virtuální počítače.

Pokud je v určitém pořadí více virtuálních počítačů, spustí se tyto virtuální počítače asynchronně pomocí úloh PowerShellu. Virtuální počítače, které nemají značku, mají spouštěcí hodnotu nastavenou na 10 a ve výchozím nastavení se spouští jako poslední. Skript ignoruje všechny virtuální počítače, které mají jiné hodnoty značek než 0 až 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"
    }
}

Spuštění skriptu

  • Pokud chcete tento skript spouštět každý den, vytvořte plán v účtu Automation a propojte plán s runbookem.

  • V podnikovém scénáři, který má několik předplatných s více testovacími prostředími, můžete uložit informace o parametrech pro různá testovací prostředí a předplatná do souboru. Předejte soubor do skriptu místo předávání jednotlivých parametrů.

  • V tomto příkladu se ke spuštění skriptu PowerShellu používá Azure Automation, ale můžete použít i jiné možnosti, například kanál sestavení nebo verze.

Další kroky