Заставьте Azure powershell ждать завершения задачи - PullRequest
0 голосов
/ 06 июня 2018

У меня есть скрипт powershell, который останавливает / запускает виртуальную машину параллельно в определенное время, используя Jenkins.В этом сценарии используется командлет -AsJob powershell. Таким образом, виртуальные машины показывают, что они остановлены в выводе Jenkins, но на самом деле они находятся в процессе освобождения на портале Azure.

У меня также есть таймер сна на 5 минут для получения команды Get-AzureRmVM -Status.

Вопрос: - Есть ли способ зациклить его, где я могу проверить состояниеВиртуальные машины и, если виртуальные машины НЕ находятся в состоянии «Выделено» или «Работает», сценарий выполняет проверку примерно через минуту или около того.Как только виртуальные машины наконец находятся в освобожденном или запущенном состоянии, сценарий / задание завершается успешно.

Фрагмент кода

$JobList = @()

foreach ($VM in $vms)
{
    if ($env:OPTION -eq "start") 
    {
        Write-Output "Starting :- $($VM.Name) in $($VM.ResourceGroupName)"

        $JobList += Start-AzureRmVM -ResourceGroupName $VM.ResourceGroupName -Name $VM.Name -AsJob -Verbose

        Write-Output "$($VM.Name) has started successfully `n"
        Write-Output "--------------------------------------------------"
    }

    elseif ($env:OPTION -eq "stop") 
    {
        Write-Output "Deallocating :- $($VM.Name) in $($VM.ResourceGroupName)"

        $JobList += Stop-AzureRmVM -ResourceGroupName $VM.ResourceGroupName -Name $VM.Name -Force -AsJob -Verbose

        Write-Output "$($VM.Name) has been deallocated successfully `n"
        Write-Output "--------------------------------------------------"
    }

    else
    {
        Write-Output "ERROR!!! No option selected, select an option"
    }

}

sleep 300

Write-Output "`n##############################################"
Write-Output "###   Writing Status of VMs to Workspace   ###"
Write-Output "##############################################"
Get-AzureRmVM -Status | Where-Object {($_.tags.ManagedBy -eq "blaah") -And ($_.tags.Environment -eq "stage")}

EDIT - этот код проверяет состояние виртуальной машины, чтобы увидеть,освобожден.Я не могу заставить его снова запустить цикл, потому что виртуальные машины находятся в состоянии Run. screenshot

$vms = (Get-AzureRmResource | Where-Object {($_.tags.ManagedBy -eq "blaah") -And ($_.tags.Environment -eq "Stage")}

foreach ($VM in $VMs) {

    $vmDetail = Get-AzureRmVM -Name $VM.Name -ResourceGroupName $VM.ResourceGroupName -Status

        foreach ($vmDetail in $vmDetail.Statuses[1]) {

            $VMStatusDetail = $vmDetail.DisplayStatus

            if ($VMStatusDetail -ne "Stopped") {      

                Write-Output "Waiting for $($VM.Name) to deallocate"
                Write-Output "State:- $($VM.Name) is $VMStatusDetail"

                start-sleep -s 5
            }
            else {
                    Write-Output "State:- $($VM.Name) is $VMStatusDetail"
            }

       }
}

1 Ответ

0 голосов
/ 22 августа 2018

Если вы выбрасываете Stop-AzureRMVM как Jobs и сохраняете вывод в массиве Jobs с именем $ JobList, после запуска всех заданий, в конце и вне цикла вы можете добавить следующую команду, чтобы дождаться завершения задания.

Write-Host $JobList
$JobList| Get-Job | Wait-Job |  Receive-Job |  Format-Table -AutoSize 
...