快速入门:在 Bicep 中创建多个资源实例

了解如何使用不同的 for 语法在 Bicep 中创建多个资源实例。 尽管本文仅介绍了如何创建多个资源实例,但同样的方法可用于定义模块、变量、属性或输出的副本。 要了解详细信息,请参阅 Bicep 循环

本文包含以下主题:

先决条件

如果没有 Azure 订阅,请在开始前创建一个试用版订阅

若要设置环境以进行 Bicep 开发,请参阅安装 Bicep 工具。 完成这些步骤后,你将具备 Visual Studio CodeBicep 扩展。 你还将具备最新的Azure CLI 或最新的 Azure PowerShell 模块

创建单个实例

在本部分中,你将定义用于创建存储帐户的 Bicep 文件,然后部署 Bicep 文件。 后续部分提供了不同 for 语法的 Bicep 示例。 可以使用相同的部署方法对这些示例进行部署和试验。 如果部署失败,可能是以下两个原因之一:

  • 存储帐户名称太长。 存储帐户名称必须为 3 到 24 个字符,并且只能包含数字和小写字母。
  • 存储帐户名称不是唯一的。 存储帐户名称在 Azure 中必须是唯一的。

以下 Bicep 文件定义了一个存储帐户:

param rgLocation string = resourceGroup().location

resource createStorage 'Microsoft.Storage/storageAccounts@2023-04-01' = {
  name: 'storage${uniqueString(resourceGroup().id)}'
  location: rgLocation
  sku: {
    name: 'Standard_LRS'
  }
  kind: 'StorageV2'
}

在本地保存 Bicep 文件,然后使用 Azure CLI 或 Azure PowerShell 部署 Bicep 文件:

resourceGroupName = "{provide-a-resource-group-name}"
templateFile="{provide-the-path-to-the-bicep-file}"

az group create --name $resourceGroupName --location chinaeast

az deployment group create --resource-group $resourceGroupName --template-file $templateFile

使用整数索引

以下示例中使用带有索引的 for 循环来创建两个存储帐户:

param rgLocation string = resourceGroup().location
param storageCount int = 2

resource createStorages 'Microsoft.Storage/storageAccounts@2023-04-01' = [for i in range(0, storageCount): {
  name: '${i}storage${uniqueString(resourceGroup().id)}'
  location: rgLocation
  sku: {
    name: 'Standard_LRS'
  }
  kind: 'StorageV2'
}]

output names array = [for i in range(0,storageCount) : {
  name: createStorages[i].name
} ]

索引号用作存储帐户名称的一部分。 部署 Bicep 文件后,将获得两个类似于以下内容的存储帐户:

使用整数索引,以 0 作为起始数

在 range() 中,第一个数字为起始数字,第二个数字为循环运行的次数。 因此,如果将其更改为 range(3,2),也将获得两个存储账户:

使用整数索引,以 3 作为起始数

上述示例的输出显示了如何引用循环中创建的资源。 输出类似于:

"outputs": {
  "names": {
    "type": "Array",
    "value": [
      {
        "name": "0storage52iyjssggmvue"
      },
      {
        "name": "1storage52iyjssggmvue"
      }
    ]
  }
},

使用数组元素

可以循环遍历数组。 以下示例显示了一个字符串数组。

param rgLocation string = resourceGroup().location
param storageNames array = [
  'contoso'
  'fabrikam'
]

resource createStorages 'Microsoft.Storage/storageAccounts@2023-04-01' = [for name in storageNames: {
  name: '${name}str${uniqueString(resourceGroup().id)}'
  location: rgLocation
  sku: {
    name: 'Standard_LRS'
  }
  kind: 'StorageV2'
}]

循环使用数组中的所有字符串作为存储帐户名称的一部分。 在这种情况下,它会创建两个存储帐户:

使用字符串数组

也可以循环遍历对象数组。 该循环不仅能自定义存储帐户名称,也可配置 SKU。

param rgLocation string = resourceGroup().location
param storages array = [
  {
    name: 'contoso'
    skuName: 'Standard_LRS'
  }
  {
    name: 'fabrikam'
    skuName: 'Premium_LRS'
  }
]

resource createStorages 'Microsoft.Storage/storageAccounts@2023-04-01' = [for storage in storages: {
  name: '${storage.name}obj${uniqueString(resourceGroup().id)}'
  location: rgLocation
  sku: {
    name: storage.skuName
  }
  kind: 'StorageV2'
}]

该循环创建两个存储帐户。 名称以“fabrikam”开头的存储帐户的 SKU 是“Premium_LRS” 。

使用字符串数组

使用数组和索引

在相同情况下,可能希望将数组循环与索引循环结合起来。 以下示例显示了如何使用数组和索引号进行命名约定。

param rgLocation string = resourceGroup().location
param storageNames array = [
  'contoso'
  'fabrikam'
]

resource createStorages 'Microsoft.Storage/storageAccounts@2023-04-01' = [for (name, i) in storageNames: {
  name: '${i}${name}${uniqueString(resourceGroup().id)}'
  location: rgLocation
  sku: {
    name: 'Standard_LRS'
  }
  kind: 'StorageV2'
}]

部署上述示例后,将创建两个类似于以下内容的存储帐户:

使用字符串和索引号的数组

使用字典对象

要在字典对象中循环访问元素,请使用 items 函数,该函数会将对象转换为数组。 请使用 value 属性获取对象的属性。

param rgLocation string = resourceGroup().location

param storageConfig object = {
  storage1: {
    name: 'contoso'
    skuName: 'Standard_LRS'
  }
  storage2: {
    name: 'fabrikam'
    skuName: 'Premium_LRS'
  }
}

resource createStorages 'Microsoft.Storage/storageAccounts@2023-04-01' = [for config in items(storageConfig): {
  name: '${config.value.name}${uniqueString(resourceGroup().id)}'
  location: rgLocation
  sku: {
    name: config.value.skuName
  }
  kind: 'StorageV2'
}]

该循环创建两个存储帐户。 名称以“fabrikam”开头的存储帐户的 SKU 是“Premium_LRS” 。

使用字典对象

带条件的循环

对于资源和模块,可以使用循环语法添加 if 表达式,以按条件部署集合。

param rgLocation string = resourceGroup().location
param storageCount int = 2
param createNewStorage bool = true

resource createStorages 'Microsoft.Storage/storageAccounts@2023-04-01' = [for i in range(0, storageCount): if(createNewStorage) {
  name: '${i}storage${uniqueString(resourceGroup().id)}'
  location: rgLocation
  sku: {
    name: 'Standard_LRS'
  }
  kind: 'StorageV2'
}]

有关详细信息,请参阅 Bicep 中的条件部署

清理资源

如果不再需要本文中创建的 Azure 资源,请使用 Azure CLI 或 Azure PowerShell 模块删除快速入门资源组。

resourceGroupName = "{provide-the-resource-group-name}"

az group delete --name $resourceGroupName