Использование циклов переменных и выходных циклов

Завершено

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

Для компании по производству игрушек необходимо развернуть виртуальные сети с одинаковой конфигурацией подсети в нескольких регионах Azure. Предполагается, что в будущем потребуется добавить дополнительные подсети, поэтому для изменения конфигурации подсети требуется гибкость в шаблонах Bicep.

Поскольку вы также будете развертывать несколько учетных записей хранения в среде Azure, вам требуется предоставить конечные точки для каждой учетной записи хранения в качестве выходных данных, чтобы ваши конвейеры развертывания могли использовать эти сведения.

В этом уроке вы узнаете, как использовать циклы с переменными и выходными данными.

Примечание.

Команды в этом уроке демонстрируют основные понятия. На этом этапе не выполняйте команды. Вскоре вы поупражняетесь с полученными знаниями.

Циклы переменных

С помощью циклов переменных можно создать массив, который затем можно использовать в файле Bicep. Как и в случае с другими циклами, для создания цикла переменных следует использовать ключевое слово for:

var items = [for i in range(1, 5): 'item${i}']

В предыдущем примере создается массив, содержащий значения item1, item2, item3, item4, а также item5.

Циклы переменных обычно используются для создания более сложных объектов, которые затем можно использовать в объявлении ресурса. Ниже показан пример использования циклов переменных для создания свойства subnets:

param addressPrefix string = '10.10.0.0/16'
param subnets array = [
  {
    name: 'frontend'
    ipAddressRange: '10.10.0.0/24'
  }
  {
    name: 'backend'
    ipAddressRange: '10.10.1.0/24'
  }
]

var subnetsProperty = [for subnet in subnets: {
  name: subnet.name
  properties: {
    addressPrefix: subnet.ipAddressRange
  }
}]

resource virtualNetwork 'Microsoft.Network/virtualNetworks@2024-01-01' = {
  name: 'teddybear'
  location: resourceGroup().location
  properties:{
    addressSpace:{
      addressPrefixes:[
        addressPrefix
      ]
    }
    subnets: subnetsProperty
  }
}

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

Выходные циклы

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

При использовании других циклов используйте for ключевое слово для указания цикла вывода:

var items = [
  'item1'
  'item2'
  'item3'
  'item4'
  'item5'
]

output outputItems array = [for i in range(0, length(items)): items[i]]

Обычно выходные циклы используются совместно с другими циклами в шаблоне. Например, рассмотрим файл Bicep, который развертывает набор учетных записей хранения в регионах Azure, указанных параметром locations:

param locations array = [
  'westeurope'
  'eastus2'
  'eastasia'
]

resource storageAccounts 'Microsoft.Storage/storageAccounts@2023-05-01' = [for location in locations: {
  name: 'toy${uniqueString(resourceGroup().id, location)}'
  location: location
  kind: 'StorageV2'
  sku: {
    name: 'Standard_LRS'
  }
}]

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

Примечание.

В настоящее время Bicep не поддерживает прямую ссылку на ресурсы, которые были созданы в цикле, из цикла вывода. Это означает, что для доступа к ресурсам необходимо использовать индексаторы массива, как показано в следующем примере.

output storageEndpoints array = [for i in range(0, length(locations)): {
  name: storageAccounts[i].name
  location: storageAccounts[i].location
  blobEndpoint: storageAccounts[i].properties.primaryEndpoints.blob
  fileEndpoint: storageAccounts[i].properties.primaryEndpoints.file
}]

Внимание

Не используйте выходные данные для возврата секретов, таких как ключи доступа или пароли. Выходные данные регистрируются и не предназначены для обработки защищенных данных.