Usar loops variáveis e de saída

Concluído

Você aprendeu como usar loops de cópia para implantar várias instâncias de recursos e como definir as propriedades de um recurso usando loops. No Bicep, você também pode usar loops com variáveis e saídas.

Para sua empresa de brinquedos, você precisa implantar redes virtuais com a mesma configuração de sub-rede em várias regiões do Azure. Você espera que precisará adicionar sub-redes adicionais às suas redes virtuais no futuro, portanto, deseja ter a flexibilidade em seus modelos do Bicep para modificar a configuração da sub-rede.

Como você também implantará várias contas de armazenamento em seu ambiente do Azure, precisará fornecer os pontos de extremidade para cada conta de armazenamento como saída para que seus pipelines de implantação possam usar essas informações.

Nesta unidade, você aprenderá a usar loops com variáveis e saídas.

Nota

Os comandos nesta unidade são mostrados para ilustrar conceitos. Não execute os comandos ainda. Você vai praticar o que você aprende aqui em breve.

Loops variáveis

Usando loops variáveis, você pode criar uma matriz, que você pode usar através do seu arquivo Bicep. Como faz com outros loops, você usa a for palavra-chave para criar um loop variável:

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

O exemplo anterior cria uma matriz que contém os valores item1, , , item4item2item3e .item5

Normalmente, você usaria loops variáveis para criar objetos mais complexos que poderiam ser usados em uma declaração de recurso. Veja como usar loops variáveis para criar uma subnets propriedade:

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@2021-08-01' = {
  name: 'teddybear'
  location: resourceGroup().location
  properties:{
    addressSpace:{
      addressPrefixes:[
        addressPrefix
      ]
    }
    subnets: subnetsProperty
  }
}

Este exemplo ilustra um uso eficaz para loops variáveis: transformar um parâmetro que tem valores simples e fáceis de entender em um objeto mais complexo que corresponde à definição necessária do recurso do Azure. Você pode usar loops variáveis para habilitar parâmetros para especificar apenas as informações de chave que serão alteradas para cada item na lista. Em seguida, você pode usar expressões Bicep ou valores padrão para definir outras propriedades necessárias para o recurso.

Loops de saída

Você pode usar as saídas do Bicep para fornecer informações de suas implantações de volta ao usuário ou ferramenta que iniciou a implantação. Os loops de saída oferecem a flexibilidade e o poder dos loops dentro de suas saídas.

Como você faz com outros loops, use a for palavra-chave para especificar um loop de saída:

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

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

Normalmente, você usará loops de saída em conjunto com outros loops dentro do seu modelo. Por exemplo, vamos examinar um arquivo Bicep que implanta um conjunto de contas de armazenamento em regiões do Azure especificadas pelo locations parâmetro:

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

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

Você provavelmente precisará retornar informações sobre cada conta de armazenamento que criou, como seu nome e os pontos de extremidade que podem ser usados para acessá-la. Usando um loop de saída, você pode recuperar essas informações dentro do seu arquivo Bicep.

Nota

Atualmente, o Bicep não suporta a referência direta de recursos que foram criados dentro de um loop de dentro de um loop de saída. Isso significa que você precisa usar indexadores de matriz para acessar os recursos, conforme mostrado no exemplo a seguir.

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
}]

Atenção

Não use saídas para retornar segredos, como chaves de acesso ou senhas. As saídas são registradas e não são projetadas para lidar com dados seguros.