Развертывание нескольких ресурсов с помощью циклов
Часто требуется развернуть несколько похожих ресурсов. Добавив циклы в файлы Bicep, можно избежать необходимости повторять определения ресурсов. Вместо этого можно динамически задать количество экземпляров ресурса, которые требуется развернуть. Кроме того, можно даже настроить свойства для каждого экземпляра.
Для компании по производству игрушек необходимо развернуть внутреннюю инфраструктуру, в том числе некоторые логические серверы Azure SQL, чтобы обеспечить выпуск новой интеллектуальной плюшевой игрушки. Необходимо развернуть выделенный логический сервер в каждой стране или регионе, где будет доступно устройство, чтобы вы соответствовали законам о защите данных в каждой стране или регионе.
Помимо их расположений, все логические серверы будут настроены таким же образом. Вам нужно использовать код Bicep для развертывания логических серверов, а параметр должен позволять указать регионы, в которых необходимо развернуть логические серверы.
В этом модуле вы узнаете, как развертывать несколько экземпляров ресурсов с помощью циклов копирования.
Примечание.
Команды в этом уроке демонстрируют основные понятия. На этом этапе не выполняйте команды. Вскоре вы поупражняетесь с полученными знаниями.
Использование циклов копирования
При определении ресурса или модуля в шаблоне Bicep можно использовать ключевое слово for
для создания цикла. Поместите ключевое for
слово в объявление ресурса, а затем укажите, как Bicep будет определять каждый элемент в цикле. Как правило, для создания нескольких экземпляров ресурса можно выполнить цикл по массиву объектов. В следующем примере выполняется развертывание нескольких учетных записей хранения, а их имена указываются в качестве значений параметров.
param storageAccountNames array = [
'saauditus'
'saauditeurope'
'saauditapac'
]
resource storageAccountResources 'Microsoft.Storage/storageAccounts@2023-05-01' = [for storageAccountName in storageAccountNames: {
name: storageAccountName
location: resourceGroup().location
kind: 'StorageV2'
sku: {
name: 'Standard_LRS'
}
}]
В этом примере цикл проходит по каждому элементу массива storageAccountNames
. Каждый раз, когда Bicep проходит через цикл, он помещает текущее значение в специальную переменную с именем storageAccountName
, которая используется как значение свойства name
. Обратите внимание, что для Bicep требуется вставить открывающую квадратную скобку ([
) перед ключевым словом for
и символ закрывающей скобки (]
) после определения ресурса.
Если вы развернули этот Bicep-файл, вы увидите, что были созданы три учетные записи хранения с именами, указанными соответствующими элементами в массиве storageAccountNames
.
Цикл на основе счетчика
Иногда цикл может потребоваться, чтобы создать определенное количество ресурсов и не использовать массив в качестве источника. Bicep предоставляет функцию range()
, которая создает массив чисел. Например, если необходимо создать четыре учетные записи хранения, вызываемую sa1
с помощью sa4
, можно использовать определение ресурса следующим образом:
resource storageAccountResources 'Microsoft.Storage/storageAccounts@2023-05-01' = [for i in range(1,4): {
name: 'sa${i}'
location: resourceGroup().location
kind: 'StorageV2'
sku: {
name: 'Standard_LRS'
}
}]
При использовании функции range()
необходимо указать ее начальное значение и количество значений, которые необходимо создать. Например, если вы хотите создать учетные записи хранения с именами sa0
, sa1
а sa2
также использовать функцию range(0,3)
.
Примечание.
При использовании функции range()
вы предоставляете два аргумента. Первый указывает Bicep начальное значение, а второй — количество нужных значений. Например, если вы используете range(3,4)
, Bicep возвращает значения 3
, 4
, 5
и 6
. Убедитесь, что запрашивается правильное количество значений, особенно при использовании начального значения 0.
Доступ к индексу итерации
С помощью Bicep можно выполнить итерацию по массивам и получить индекс текущего элемента в массиве. Например, предположим, что необходимо создать логический сервер в каждом расположении, заданном массивом, и указать имена серверов sqlserver-1
, sqlserver-2
и т. д. Это можно сделать с помощью следующего кода Bicep:
param locations array = [
'westeurope'
'eastus2'
'eastasia'
]
resource sqlServers 'Microsoft.Sql/servers@2023-08-01-preview' = [for (location, i) in locations: {
name: 'sqlserver-${i+1}'
location: location
properties: {
administratorLogin: administratorLogin
administratorLoginPassword: administratorLoginPassword
}
}]
Обратите внимание, что свойство name
содержит выражение i+1
. Первое значение переменной индекса i
равно нулю, поэтому в нее необходимо добавить +1
, если нужно, чтобы имена серверов начинались с 1
.
Совет
В этом примере мы назвали переменную индекса i
. Это стандартное соглашение в Bicep. Однако можно использовать любое имя.
Фильтрация элементов с помощью циклов
В некоторых ситуациях может потребоваться развернуть ресурсы с помощью циклов копирования вместе с условиями. Это можно сделать, объединив ключевые слова if
и for
.
В следующем примере код использует параметр массива для определения набора логических серверов. Условие используется с циклом копирования для развертывания серверов только в том случае, если свойство environmentName
объекта цикла имеет значение Production
.
param sqlServerDetails array = [
{
name: 'sqlserver-we'
location: 'westeurope'
environmentName: 'Production'
}
{
name: 'sqlserver-eus2'
location: 'eastus2'
environmentName: 'Development'
}
{
name: 'sqlserver-eas'
location: 'eastasia'
environmentName: 'Production'
}
]
resource sqlServers 'Microsoft.Sql/servers@2023-08-01-preview' = [for sqlServer in sqlServerDetails: if (sqlServer.environmentName == 'Production') {
name: sqlServer.name
location: sqlServer.location
properties: {
administratorLogin: administratorLogin
administratorLoginPassword: administratorLoginPassword
}
tags: {
environment: sqlServer.environmentName
}
}]
Если вы развернули предыдущий пример, вы увидите два логических сервера sqlserver-we
и sqlserver-eas
, но не sqlserver-eus2
, так как свойство этого объекта environmentName
не соответствует Production
.