Bicep 中的变量迭代

本文展示了如何为 Bicep 文件中的变量创建多个值。 可以在 variables 声明中添加循环,并动态设置变量的项数。 避免在 Bicep 文件中重复使用语法。

还可以将复制与 modulesresources资源中的 propertiesoutputs 配合使用。

语法

可通过以下方式使用循环来声明多个变量:

  • 使用循环索引。

    var <variable-name> = [for <index> in range(<start>, <stop>): {
        <properties>
    }]
    

    有关详细信息,请参阅循环索引

  • 循环访问数组。

    var <variable-name> = [for <item> in <collection>: {
        <properties>
    }]
    
    

    有关详细信息,请参阅循环数组

  • 循环访问数组和索引。

    var <variable-name> = [for <item>, <index> in <collection>: {
        <properties>
    }]
    

循环限制

Bicep 文件的循环迭代不能为负数,也不能超过 800 次。

循环索引

以下示例展示了如何创建字符串值的数组:

param itemCount int = 5

var stringArray = [for i in range(0, itemCount): 'item${(i + 1)}']

output arrayResult array = stringArray

输出返回具有以下值的数组:

[
  "item1",
  "item2",
  "item3",
  "item4",
  "item5"
]

下一个示例演示如何创建具有三个属性(namediskSizeGBdiskIndex)的对象的数组。

param itemCount int = 5

var objectArray = [for i in range(0, itemCount): {
  name: 'myDataDisk${(i + 1)}'
  diskSizeGB: '1'
  diskIndex: i
}]

output arrayResult array = objectArray

输出返回具有以下值的数组:

[
  {
    "name": "myDataDisk1",
    "diskSizeGB": "1",
    "diskIndex": 0
  },
  {
    "name": "myDataDisk2",
    "diskSizeGB": "1",
    "diskIndex": 1
  },
  {
    "name": "myDataDisk3",
    "diskSizeGB": "1",
    "diskIndex": 2
  },
  {
    "name": "myDataDisk4",
    "diskSizeGB": "1",
    "diskIndex": 3
  },
  {
    "name": "myDataDisk5",
    "diskSizeGB": "1",
    "diskIndex": 4
  }
]

循环数组

以下示例循环访问以参数形式传入的数组。 变量根据参数以所需格式构造对象。

@description('An array that contains objects with properties for the security rules.')
param securityRules array = [
  {
    name: 'RDPAllow'
    description: 'allow RDP connections'
    direction: 'Inbound'
    priority: 100
    sourceAddressPrefix: '*'
    destinationAddressPrefix: '10.0.0.0/24'
    sourcePortRange: '*'
    destinationPortRange: '3389'
    access: 'Allow'
    protocol: 'Tcp'
  }
  {
    name: 'HTTPAllow'
    description: 'allow HTTP connections'
    direction: 'Inbound'
    priority: 200
    sourceAddressPrefix: '*'
    destinationAddressPrefix: '10.0.1.0/24'
    sourcePortRange: '*'
    destinationPortRange: '80'
    access: 'Allow'
    protocol: 'Tcp'
  }
]

var securityRulesVar = [for rule in securityRules: {
  name: rule.name
  properties: {
    description: rule.description
    priority: rule.priority
    protocol: rule.protocol
    sourcePortRange: rule.sourcePortRange
    destinationPortRange: rule.destinationPortRange
    sourceAddressPrefix: rule.sourceAddressPrefix
    destinationAddressPrefix: rule.destinationAddressPrefix
    access: rule.access
    direction: rule.direction
  }
}]

resource netSG 'Microsoft.Network/networkSecurityGroups@2020-11-01' = {
  name: 'NSG1'
  location: resourceGroup().location
  properties: {
    securityRules: securityRulesVar
  }
}

后续步骤