Управление выполнением циклов и вложенные циклы

Завершено

С помощью эффективной функции циклов копирования можно создавать динамические и гибкие шаблоны. Важно понять, как управлять тем, как циклы выполняются при создании ресурсов и как использовать циклы для задания свойств ресурсов и вложенных циклов.

В этом уроке вы узнаете, как управлять выполнением циклов копирования и как использовать циклы свойств ресурсов и вложенные циклы в 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}'
  // ...
}]

Все ресурсы в этом цикле будут развернуты одновременно в параллельном режиме:

Схема, показывающая время на горизонтальной оси, с приложениями app1, app2 и app3, распределенными вертикально для одновременного развертывания.

Теперь применим декоратор @batchSize со значением 2:

@batchSize(2)
resource appServiceApp 'Microsoft.Web/sites@2024-04-01' = [for i in range(1,3): {
  name: 'app${i}'
  // ...
}]

При развертывании шаблона Bicep будет развертываться двумя пакетами:

Схема, показывающая время на горизонтальной оси, с приложениями app1 и app2, которые выполняются в одном пакете, и app3, которое выполняется во втором.

Примечание.

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 ожидает завершения каждого развертывания ресурсов, прежде чем начать следующее развертывание:

Схема, показывающая время на горизонтальной оси, с последовательным развертыванием приложений app1, app2 и app3.

Использование циклов со свойствами ресурсов

Для настройки свойств ресурсов можно использовать циклы. Например, при развертывании виртуальной сети необходимо указать ее подсети. Подсеть должна иметь имя и префикс адреса. Можно использовать параметр с массивом объектов, таким образом можно будет указать разные подсети для каждой из сред:

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