Краткое руководство. Создание нескольких экземпляров ресурсов в Bicep
Узнайте, как использовать разные синтаксисы for
для создания нескольких экземпляров ресурсов в Bicep. Хотя в этой статье показано только создание нескольких экземпляров ресурсов, для определения копий модуля, переменной, свойства или выходных данных можно использовать эти же методы. Дополнительные сведения см. в статье Циклы Bicep.
Эта статья включает следующие разделы:
- Использование целочисленного индекса
- Использование элементов массива
- Использование массива и индекса
- Использование объекта Dictionary
- Цикл с условием
Необходимые компоненты
Если у вас нет подписки Azure, создайте бесплатную учетную запись, прежде чем приступить к работе.
Сведения о настройке среды для разработки Bicep см. в разделе Установка средств Bicep. После этого у вас будет Visual Studio Code и расширение Bicep. У вас также есть последняя версия Azure CLI или модуля Azure PowerShell.
Создание одного экземпляра
В этом разделе нужно определить файл Bicep для создания учетной записи хранения, а затем развернуть его. В последующих разделах приведены примеры Bicep для разных синтаксисов for
. Вы можете использовать один метод развертывания для развертывания этих примеров и экспериментирования с ними. Если развертывание завершится ошибкой, скорее всего, это одна из двух причин:
- Слишком длинное имя учетной записи хранения. Имя учетной записи хранения должно содержать от 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:
resourceGroupName = "{provide-a-resource-group-name}"
templateFile="{provide-the-path-to-the-bicep-file}"
az group create --name $resourceGroupName --location eastus
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() первое число — это начальное число, а второе — число раз выполнения цикла. Таким образом, если изменить его на диапазон(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'
}]
Цикл создает две учетных записи хранения. SKU учетной записи хранения с именем, которое начинается на fabrikam, — 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'
}]
После развертывания предыдущего примера создаются две учетные записи хранения, похожие на следующие:
Использование объекта Dictionary
Для итерации по элементами в объекте Dictionary используйте функцию 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'
}]
Цикл создает две учетных записи хранения. SKU учетной записи хранения с именем, которое начинается на fabrikam, — 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