在 yaml 中使用 Azure 管道同时循环遍历 2 个变量

Using Azure pipeline in yaml to loop through 2 variables simultaneously

要求:使用 powershell 关闭或启动特定资源组中的 VM

变量:VM 列表以逗号分隔存储在变量组中的变量中,我使用 split(,) 在循环迭代期间读取每个变量。 资源组名称也需要存储在变量中,也可以作为参数存储。

我的 powershell 脚本:

 Param 
    (    
        [Parameter(Mandatory=$true)][ValidateNotNullOrEmpty()] 
        $AzureVMList,
        [Parameter(Mandatory=$true)][ValidateNotNullOrEmpty()] 
        $Rgname
    ) 
     
        $AzureVMs = $AzureVMList.Split(",") 
        [System.Collections.ArrayList]$AzureVMsToHandle = $AzureVMs 



foreach ( $AzureVM in $AzureVMsToHandle )
{
    Stop-AzureRmVM -ResourceGroupName "$Rgname" -Name  "$AzureVM"
    
}

我的 Azure 管道大纲

parameters:
- name: Rgname
  type: object
  default:
  - rg1
  - rg2  
- variables
    vmlist1: vm1,vm2,vm3
    vmlist2: vm4,vm5,vm6

stages: 
  - stage: turnon
    displayName: 'Turn ON VM'
    jobs: 
      - job: 'TurnONVM'
        displayName: 'Turn on VM'
        pool:
          vmImage: 'vs2017-win2016'  
        steps:
        - ${{ each rgname in parameters.resourcegroup }}:
          - task: AzurePowerShell@5
            displayName: turn on myvm"
            inputs:
              azureSubscription: 'MySubscription'
              ScriptType: 'FilePath'
              ScriptPath: '$(System.DefaultWorkingDirectory)/vm-pipelines/turn-on-vm.ps1'
              ScriptArguments: '-AzureVMList $(vmlist1) -Rgname ${{ parameters.rgname }}'
              azurePowerShellVersion: 'LatestVersion'
              errorActionPreference: silentlyContinue

如果我只有一个资源组,这可能会奏效。我需要指定多个资源组和相应的变量来存储虚拟机列表。我不知道我将如何以这样的方式定义管道,即使用 VMlist1 同样执行 RG1 的脚本,使用 VMlist2

执行 RG2

这是我能想到的一个解决方法,可以让 on/off 多个资源组中的多个 VM 正在使用 matrix (or Multi-job configuration)。

例如:

stages: 
  - stage: turnon
    displayName: 'Turn ON VM'
    jobs: 
      - job: 'TurnONVM'
        displayName: 'Turn on VM'
        strategy:
          matrix:
            RG1_VM1:
              Rgname: `rg1`
              VM: `vm1`
            RG1_VM2:
              Rgname: `rg1`
              VM: `vm2`
            . . .
        steps:
        - script: |
            echo $(Rgname)
            echo $(VM)

这样,

  • 您需要枚举每个虚拟机及其对应资源组的所有对。
  • 您不需要 PowerShell 脚本中的循环。