Я пытаюсь проверить, работают ли мои Azure виртуальные машины, прежде чем развертывать на них тесты CodedUI. Все это делается в Azure конвейере DevOps.
Сценарий работал нормально вне рабочего процесса. Мы хотели преобразовать ForEach l oop для параллельной работы, поэтому мы решили попробовать включить его в рабочий процесс (мы делаем это для нескольких виртуальных машин одновременно).
По какой-то причине я могу Похоже, я не получаю список статусов для виртуальной машины, когда это делается в рабочем процессе.
Я понимаю, что могу просто использовать Test-Connection, чтобы увидеть, работает ли виртуальная машина, но это действительно беспокоит меня что этот метод не работает.
$context = Get-AzSubscription -SubscriptionId 'Subscription GUID'
Set-AzContext $context
workflow Check-VM-Status {
Param ([string[]]$VMNames)
if($VMNames.Count -eq 0)
{
Write-Output "You must provide one or more VM names."
}
else
{
#Start-Sleep -Seconds 120
$VMListJSON = Get-AzVM -Name MyVM* | ConvertTo-Json
$VMList = $VMListJSON | ConvertFrom-Json
ForEach -Parallel ($VMName in $VMNames)
{
Write-Output "Checking VM status for $VMName."
$VM = $VMList | where { $_.Name -eq $VMName }
$VM = Get-AzVM -ResourceGroupName $VM.ResourceGroupName -Name $VM.Name -Status
$attempts = 0
$statuses = $VM.Statuses
$code = $statuses[1].Code
if($code -ne 'PowerState/running')
{
do
{
Write-Output -InputObject "Check #$attempts. $($VM.Name) is not yet running. Re-checking in 120 seconds..."
Start-Sleep -Seconds 120
$VM = Get-AzVM -ResourceGroupName $VM.ResourceGroupName -Name $VM.Name -Status
$attempts++
}
while ($($VM.Statuses[1].Code) -ne 'PowerState/running' -and $attempts -lt 11)
if ($($VM.Statuses[1].Code) -eq 'PowerState/running')
{
Write-Output "$($VM.Name) is running. Allow VM to finish the start up process (120 seconds) before continuing."
Start-Sleep -Seconds 120
$Ping = Test-Connection -ComputerName $VMName -Delay 5 -Quiet
if ($Ping)
{
Write-Output "$($VM.Name) is started and running."
}
else
{
Write-Output "$($VM.Name) failed to respond."
}
}
else
{
Write-Error "$($VM.Name) is still not running after 10 attempts to check status (20 minutes). Status is $($VM.Statuses[1].Code)."
}
}
else
{
Write-Output "$($VM.Name) is already running. Allow VM to finish the start up process (120 seconds) before continuing."
Start-Sleep -Seconds 120
$Ping = Test-Connection -ComputerName $VMName -Delay 5 -Quiet
if ($Ping)
{
Write-Output "$($VM.Name) is started and running."
}
else
{
Write-Output "$($VM.Name) failed to respond."
}
}
}
}
}
Check-VM-Status ('MyVM01')