Udostępnij za pośrednictwem


Definiowanie kolejności uruchamiania maszyn wirtualnych laboratorium DevTest Lab przy użyciu Azure Automation

W tym artykule wyjaśniono, jak uruchomić maszyny wirtualne usługi DevTest Labs w określonej kolejności przy użyciu elementu Runbook programu PowerShell w Azure Automation. Skrypt programu PowerShell używa tagów na maszynach wirtualnych laboratorium, dzięki czemu można zmienić kolejność uruchamiania bez konieczności zmiany skryptu.

Funkcja automatycznego startu usługi DevTest Labs umożliwia skonfigurowanie maszyn wirtualnych laboratorium do automatycznego uruchamiania w określonym czasie. Czasami jednak może być konieczne uruchomienie maszyn wirtualnych laboratorium w określonej sekwencji. Jeśli na przykład maszyna wirtualna serwera przesiadkowego w laboratorium jest punktem dostępu do innych maszyn wirtualnych, maszyna wirtualna serwera przesiadkowego musi zostać uruchomiona przed innymi maszynami wirtualnymi.

Wymagania wstępne

  • Utwórz i zastosuj tag o nazwie StartupOrder do wszystkich maszyn wirtualnych laboratorium z odpowiednią wartością początkową od 0 do 10. Wyznacz wszystkie maszyny, które nie wymagają uruchamiania jako -1.

  • Utwórz konto Azure Automation, postępując zgodnie z instrukcjami w temacie Tworzenie autonomicznego konta Azure Automation. Wybierz opcję Konta Uruchom jako podczas tworzenia konta.

Tworzenie elementu Runbook programu PowerShell

  1. Na stronie Przegląd dla konta usługi Automation wybierz pozycję Elementy Runbook z menu po lewej stronie.
  2. Na stronie Elementy Runbook wybierz pozycję Utwórz element Runbook.
  3. Postępuj zgodnie z instrukcjami w temacie Tworzenie elementu Runbook programu PowerShell usługi Automation przy użyciu tożsamości zarządzanej , aby utworzyć element Runbook programu PowerShell. Wypełnij element Runbook następującym skryptem programu PowerShell.

Przygotowywanie skryptu programu PowerShell

Poniższy skrypt przyjmuje nazwę subskrypcji i nazwę laboratorium jako parametry. Skrypt pobiera wszystkie maszyny wirtualne w laboratorium i analizuje informacje o tagach, aby utworzyć listę nazw maszyn wirtualnych i ich kolejność uruchamiania. Skrypt przeprowadzi cię przez listę w kolejności i uruchomi maszyny wirtualne.

Jeśli istnieje wiele maszyn wirtualnych w określonym numerze zamówienia, te maszyny wirtualne są uruchamiane asynchronicznie przy użyciu zadań programu PowerShell. Maszyny wirtualne, które nie mają tagu, mają ustawioną wartość początkową na 10 i domyślnie są uruchamiane jako ostatnie. Skrypt ignoruje wszystkie maszyny wirtualne, które mają wartości tagów inne niż od 0 do 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"
    }
}

Uruchamianie skryptu

  • Aby uruchomić ten skrypt codziennie, utwórz harmonogram na koncie usługi Automation i połącz harmonogram z elementem Runbook.

  • W scenariuszu przedsiębiorstwa, który ma kilka subskrypcji z wieloma laboratoriami, możesz przechowywać informacje o parametrach dla różnych laboratoriów i subskrypcji w pliku. Przekaż plik do skryptu zamiast przekazywania poszczególnych parametrów.

  • W tym przykładzie użyto Azure Automation do uruchomienia skryptu programu PowerShell, ale można również użyć innych opcji, takich jak potok kompilacji/wydania.

Następne kroki