Управление выполнением циклов и вложенные циклы
С помощью эффективной функции циклов копирования можно создавать динамические и гибкие шаблоны. Важно понять, как управлять тем, как циклы выполняются при создании ресурсов и как использовать циклы для задания свойств ресурсов и вложенных циклов.
В этом уроке вы узнаете, как управлять выполнением циклов копирования и как использовать циклы свойств ресурсов и вложенные циклы в Bicep.
Примечание.
Команды в этом уроке демонстрируют основные понятия. На этом этапе не выполняйте команды. Вскоре вы поупражняетесь с полученными знаниями.
Управление выполнением циклов
По умолчанию Azure Resource Manager создает ресурсы из циклов параллельно и в недетерминированном порядке. При создании циклов в предыдущих упражнениях оба логических сервера Azure SQL были созданы одновременно. Это помогает сократить общее время развертывания, поскольку все ресурсы в цикле развертываются одновременно.
Однако в некоторых случаях вместо параллельного развертывания может потребоваться последовательное развертывание ресурсов в циклах или параллельное одновременное развертывание небольших пакетов изменений. Например, при наличии большого числа приложений Службы приложений Azure в рабочей среде может потребоваться одновременное развертывание изменений только для некоторых из них. Это поможет предотвратить перезапуск всех обновлений одновременно.
С помощью декоратора @batchSize
можно управлять способом выполнения циклов копирования в Bicep. Поместите декоратор в объявление ресурса или модуля с ключевым словом for
.
Рассмотрим пример определения Bicep для набора приложений Службы приложений без использования декоратора @batchSize
:
resource appServiceApp 'Microsoft.Web/sites@2024-04-01' = [for i in range(1,3): {
name: 'app${i}'
// ...
}]
Все ресурсы в этом цикле будут развернуты одновременно в параллельном режиме:
Теперь применим декоратор @batchSize
со значением 2
:
@batchSize(2)
resource appServiceApp 'Microsoft.Web/sites@2024-04-01' = [for i in range(1,3): {
name: 'app${i}'
// ...
}]
При развертывании шаблона Bicep будет развертываться двумя пакетами:
Примечание.
Bicep ожидает завершения каждого пакета, прежде чем перейти к следующему. В предыдущем примере, если app2 завершит развертывание раньше app1, Bicep будет ожидать завершения app1, прежде чем начать развертывание app3.
Можно также указать Bicep выполнить цикл последовательно, задав для @batchSize
значение 1
:
@batchSize(1)
resource appServiceApp 'Microsoft.Web/sites@2024-04-01' = [for i in range(1,3): {
name: 'app${i}'
// ...
}]
При развертывании шаблона Bicep ожидает завершения каждого развертывания ресурсов, прежде чем начать следующее развертывание:
Использование циклов со свойствами ресурсов
Для настройки свойств ресурсов можно использовать циклы. Например, при развертывании виртуальной сети необходимо указать ее подсети. Подсеть должна иметь имя и префикс адреса. Можно использовать параметр с массивом объектов, таким образом можно будет указать разные подсети для каждой из сред:
param subnetNames array = [
'api'
'worker'
]
resource virtualNetwork 'Microsoft.Network/virtualNetworks@2024-05-01' = {
name: 'teddybear'
location: resourceGroup().location
properties: {
addressSpace: {
addressPrefixes: [
'10.0.0.0/16'
]
}
subnets: [for (subnetName, i) in subnetNames: {
name: subnetName
properties: {
addressPrefix: '10.0.${i}.0/24'
}
}]
}
}
В этом примере обратите внимание, что цикл for
появляется в определении ресурса вокруг значения свойства subnets
.
Вложенные циклы
В некоторых сценариях требуется использовать цикл внутри другого цикла или вложенный цикл. Вложенные циклы можно создавать с помощью Bicep.
Для вашей компании с тедди медведем необходимо развернуть виртуальные сети в каждой стране или регионе, где будет запущена машина. Каждой виртуальной сети требуется свое адресное пространство и две подсети. Начнем с развертывания виртуальных сетей в цикле:
param locations array = [
'westeurope'
'eastus2'
'eastasia'
]
var subnetCount = 2
resource virtualNetworks 'Microsoft.Network/virtualNetworks@2024-05-01' = [for (location, i) in locations : {
name: 'vnet-${location}'
location: location
properties: {
addressSpace:{
addressPrefixes:[
'10.${i}.0.0/16'
]
}
}
}]
Этот цикл развертывает виртуальные сети для каждого расположения и задает addressPrefix
для виртуальной сети, используя индекс цикла, чтобы гарантировать, что каждая виртуальная сеть получит другой префикс адреса.
Вложенный цикл можно использовать для развертывания подсетей в каждой виртуальной сети.
resource virtualNetworks 'Microsoft.Network/virtualNetworks@2024-05-01' = [for (location, i) in locations : {
name: 'vnet-${location}'
location: location
properties: {
addressSpace:{
addressPrefixes:[
'10.${i}.0.0/16'
]
}
subnets: [for j in range(1, subnetCount): {
name: 'subnet-${j}'
properties: {
addressPrefix: '10.${i}.${j}.0/24'
}
}]
}
}]
Вложенный цикл использует функцию range()
для создания двух подсетей.
При развертывании шаблона вы получите следующие виртуальные сети и подсети:
имя виртуальной сети; | Расположение | Префикс адреса | подсети; |
---|---|---|---|
vnet-westeurope |
westeurope |
10.0.0.0/16 |
10.0.1.0/24 , 10.0.2.0/24 |
vnet-eastus2 |
eastus2 |
10.1.0.0/16 |
10.1.1.0/24 , 10.1.2.0/24 |
vnet-eastasia |
eastasia |
10.2.0.0/16 |
10.2.1.0/24 , 10.2.2.0/24 |