让 Azure powershell 等待任务完成

Make Azure powershell wait for task to complete

我有一个 powershell 脚本,stops/starts VM 在特定时间使用 Jenkins 并行运行。此脚本使用 -AsJob powershell cmdlet,这样虚拟机在 Jenkins 输出中显示它们已停止,但实际上它们正在 Azure 门户中解除分配。

我还有一个 5 分钟的睡眠计时器来获取 Get-AzureRmVM -Status 命令。

问题:- 有没有办法让它循环,我可以在其中检查 VM 的状态,如果 VM 未处于已释放或 运行 状态,脚本会在一分钟左右检查回来.一旦 VM 最终处于释放状态或 运行ning 状态,script/job 就会成功退出。

代码片段

$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")}

编辑 - 此代码检查 VM 的状态以查看它是否已解除分配。我无法再次进入 运行 循环,因为虚拟机处于 运行 状态。

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

       }
}

如果您将 Stop-AzureRMVM 作为 Jobs 并将输出保存在名为 $JobList 的 Jobs 数组中,一旦所有作业都已启动,您可以在循环的末尾和外部添加以下命令以等待作业完成.

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