首页 文章

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

提问于
浏览
0

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

我想并行启动所有其他的并且我尝试使用 Start-Job 这样做但是这会产生一个新的Powershell进程,它不会尝试这样的事情:

[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

    您也可以使用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

  • 0

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

相关问题