Невозможно получить Azure Статус виртуальной машины из рабочего процесса - PullRequest
0 голосов
/ 10 марта 2020

Я пытаюсь проверить, работают ли мои 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')

1 Ответ

0 голосов
/ 10 марта 2020

На основании моего теста при параллельном запуске в рабочем процессе следующая команда не работает надлежащим образом:

$VM = Get-AzVM -ResourceGroupName $VM.ResourceGroupName -Name $VM.Name -Status
$VM.Statuses[1].Code # The value is always empty, so all the following scripts fails 

Мое решение состоит в использовании пространства выполнения PowerShell:

function Get-VM-Status([string[]] $VMNames, [int] $ThrottleLimit){

    $SessionState = [system.management.automation.runspaces.initialsessionstate]::CreateDefault()
    $Pool = [runspacefactory]::CreateRunspacePool(1, $ThrottleLimit, $SessionState, $Host)
    $Pool.Open()

    $ScriptBlock = {
        param($Current_VMName,$All_VMs)
        $Current_VM = $All_VMs | where { $_.Name -eq $Current_VMName }
        $Current_VM = Get-AzVM -ResourceGroupName $Current_VM.ResourceGroupName -Name $Current_VM.Name -Status
        Write-Output ("Checking VM status for $Current_VMName -> " + $Current_VM.Statuses[1].Code)
    }

    $threads = New-Object System.Collections.ArrayList

    $VMs = Get-AzVM
    $handles = foreach ($VMName in $VMNames) {
        $powershell = [powershell]::Create().AddScript($ScriptBlock).AddArgument($VMName).AddArgument($VMs)
        $powershell.RunspacePool = $Pool
        $powershell.BeginInvoke()
        $threads += $powershell
    }

    do {
      $i = 0
      $done = $true
      foreach ($handle in $handles) {
        if ($handle -ne $null) {
          if ($handle.IsCompleted) {
            $threads[$i].EndInvoke($handle)
            $threads[$i].Dispose()
            $handles[$i] = $null
          } else {
            $done = $false
          }
        }
        $i++
      }
      if (-not $done) { Start-Sleep -Milliseconds 500 }
    } until ($done)
    $Pool.Close()
    $Pool.Dispose()
}

$vms = Get-AzVM | %{$_.Name} 

Get-VM-Status -VMNames $vms -ThrottleLimit 20

С Приведенный выше сценарий позволяет получить статус 13 виртуальных машин за несколько секунд:

PS C:\WINDOWS\system32> Get-VM-Status -VMNames $vms -ThrottleLimit 20
Checking VM status for test-sql -> PowerState/running
Checking VM status for winsvr-2016 -> PowerState/running
Checking VM status for vs2019 -> PowerState/running
Checking VM status for dc-ericm -> PowerState/running
Checking VM status for ericmex13 -> PowerState/deallocated
Checking VM status for win2016-ericm -> PowerState/running
Checking VM status for testvm -> PowerState/running
Checking VM status for StanLinuxTest -> PowerState/running
Checking VM status for win2012 -> PowerState/running
Checking VM status for testvm2 -> PowerState/running
Checking VM status for CXPCMT -> PowerState/running
Checking VM status for win2019DC -> PowerState/running
Checking VM status for test -> PowerState/running
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...