如何从Azure Powershell中的VSTS Build并行运行Start-AzureVM?

时间:2018-01-20 13:03:25

标签: powershell azure azure-devops azure-pipelines azure-powershell

我在VSTS中的Azure Powershell任务中运行PowerShell脚本,该任务在DevTest实验室中启动多个Azure虚拟机,但首先启动域控制器,等待它启动,然后依次启动其他域控制器

我想并行启动所有其他人,我尝试使用Start-Job执行此操作,但这会产生一个新的Powershell进程,该进程没有Azure登录的安全上下文,所以它失败了。我正在尝试这样的事情:

[cmdletbinding()]
param (
    [ValidateSet("Start","Stop")][string]$Action,
    $labName = "DevTestLab",
    $labResourceGroup = "DevTestLabRG"
)

if ($Action -eq "Start") {
    Write-Verbose "Starting the domain controller first"
    Get-AzureRmResource | Where-Object {
        $_.Name -match "dc" -and 
        $_.ResourceType -eq "Microsoft.Compute/virtualMachines" -and
        $_.ResourceGroupName -match $labResourceGroup } | Start-AzureRmVM

    Write-Verbose "Starting other machines in the lab as background jobs"
    foreach ($AzureRMResource in Get-AzureRmResource | 
    Where-Object {
        $_.Name -notmatch "dc" -and 
        $_.ResourceType -eq "Microsoft.Compute/virtualMachines" -and
        $_.ResourceGroupName -match $labResourceGroup } )
        {
            Start-Job { 
                $myResource = $using:AzureRMResource                
                Start-AzureRMVM -Name $myResource.Name -ResourceGroupName $myResource.ResourceGroupName
               }            
        }

    # wait for all machines to start before exiting the session
    Get-Job | Wait-Job
    Get-Job | Remove-Job
}

我正在使用托管代理来运行脚本,因此我无法同时运行多个代理,而据我所知,VSTS并不支持并行任务。

关于如何解决这个问题的任何想法?

2 个答案:

答案 0 :(得分:0)

您也可以使用Azure CLI,而不是创建PowerShell脚本。 Azure CLI具有vm startvm stop命令,该命令采用ID列表。您还可以使用CLI查询所需的所有ID。以下是一个简单的Bash片段,用于启动/停止id包含 Test 的所有vms。

# example usage
az vm start --ids $(
    az vm list --query "[].id"
        -o tsv | grep "Test"
)

az vm stop --ids $(
    az vm list --query "[].id"
        -o tsv | grep "Test"
)

来源:Azure CLI 2.0: Quickly Start / Stop ALL VMs

答案 1 :(得分:0)

您也可以通过Azure CLI任务使用带有--no-wait参数的az vm start命令进行尝试。