快速入门:在 Bicep 中创建多个资源实例
了解如何使用不同的 for
语法在 Bicep 中创建多个资源实例。 尽管本文仅介绍了如何创建多个资源实例,但同样的方法可用于定义模块、变量、属性或输出的副本。 要了解详细信息,请参阅 Bicep 循环。
本文包含以下主题:
先决条件
如果没有 Azure 订阅,请在开始前创建一个试用版订阅。
若要设置环境以进行 Bicep 开发,请参阅安装 Bicep 工具。 完成这些步骤后,你将具备 Visual Studio Code 和 Bicep 扩展。 你还将具备最新的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 文件后,将获得两个类似于以下内容的存储帐户:
在 range() 中,第一个数字为起始数字,第二个数字为循环运行的次数。 因此,如果将其更改为 range(3,2),也将获得两个存储账户:
上述示例的输出显示了如何引用循环中创建的资源。 输出类似于:
"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