다음을 통해 공유


Azure Automation을 사용하여 DevTest Lab VM의 시작 순서 정의

이 문서에서는 Azure Automation에서 PowerShell Runbook을 사용하여 특정 순서대로 DevTest Labs VM(가상 머신)을 시작하는 방법을 설명합니다. PowerShell 스크립트는 랩 VM에서 태그를 사용하므로, 스크립트를 변경하지 않고도 시작 순서를 변경할 수 있습니다.

DevTest Labs 자동 시작 기능에서는 랩 VM이 지정된 시간에 자동으로 시작되도록 구성할 수 있습니다. 그러나 가끔 랩 VM을 특정 시퀀스로 시작하고자 할 수 있습니다. 예를 들어 랩의 jumpbox VM이 다른 VM에 대한 액세스 지점인 경우 jumpbox VM은 다른 VM보다 먼저 시작해야 합니다.

필수 조건

PowerShell Runbook 만들기

  1. Automation 계정의 개요 페이지에 있는 왼쪽 메뉴에서 Runbook을 선택합니다.
  2. Runbook 페이지에서 Runbook 만들기를 선택합니다.
  3. 관리 ID를 사용하여 Automation PowerShell Runbook 만들기의 지침에 따라 PowerShell Runbook을 만듭니다. 다음 PowerShell 스크립트로 Runbook을 채웁니다.

PowerShell 스크립트 준비

다음 스크립트는 구독 이름과 랩 이름을 매개 변수로 사용합니다. 스크립트에서는 랩에 있는 모든 VM을 가져와 태그 정보를 구문 분석하여 VM 이름 및 해당 시작 순서 목록을 만듭니다. 스크립트는 목록을 순서대로 설명하고 VM을 시작합니다.

특정 주문 번호에 여러 VM이 있는 경우, 이러한 VM은 PowerShell 작업을 사용하여 비동기적으로 시작됩니다. 태그가 없는 VM은 시작 값이 10으로 설정되고 기본적으로 마지막에 시작됩니다. 스크립트에서는 태그 값이 0~10이 아닌 VM을 무시합니다.

#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"
    }
}

스크립트 실행

  • 이 스크립트를 매일 실행하려면 Automation 계정에서 일정을 만들고Runbook에 일정을 연결합니다.

  • 랩이 여러 개인 구독이 여럿 있는 엔터프라이즈 시나리오에서는 다른 랩과 구독에 대한 매개 변수 정보를 파일에 저장할 수 있습니다. 개별 매개 변수를 전달하는 대신 스크립트에 파일을 전달합니다.

  • 이 예제에서는 Azure Automation을 사용하여 PowerShell 스크립트를 실행하지만, 빌드/릴리스 파이프라인과 같은 다른 옵션도 사용할 수 있습니다.

다음 단계