在 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 脚本中的循环。
要求:使用 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 脚本中的循环。