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 och tillämpa en tagg med namnet StartupOrder på alla virtuella labbdatorer med lämpligt startvärde, 0 till och med 10. Ange datorer som inte behöver starta som -1.
Skapa ett Azure Automation konto genom att följa anvisningarna i Skapa ett fristående Azure Automation-konto. Välj alternativet Kör som-konton när du skapar kontot.
Skapa PowerShell-runbooken
- På sidan Översikt för Automation-kontot väljer du Runbooks på den vänstra menyn.
- På sidan Runbooks väljer du Skapa en runbook.
- 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.