Usar loops de saída e de variável
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 podem 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 precise adicionar sub-redes adicionais às redes virtuais no futuro, portanto, você deseja ter flexibilidade em seus modelos Bicep para modificar a configuração da sub-rede.
Como também implantará várias contas de armazenamento em seu ambiente do Azure, você 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á como usar loops com variáveis e saídas.
Observação
Os comandos nesta unidade são mostrados para ilustrar conceitos. Não execute os comandos ainda. Você praticará o que aprendeu aqui em breve.
Loops de variável
Usando loops de variável, você pode criar uma matriz, que pode então ser usada por meio do arquivo Bicep. Do mesmo modo que você faz com outros loops, use a palavra-chave for
para criar um loop de variável:
var items = [for i in range(1, 5): 'item${i}']
O exemplo anterior cria uma matriz que contém os valores item1
, item2
, item3
, item4
e item5
.
Normalmente, você usaria loops de variáveis para criar objetos mais complexos que você poderia usar em uma declaração de recurso. Veja como usar loops de variável para criar uma propriedade 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
}
}
Este exemplo ilustra um uso efetivo para loops de variável: transformar um parâmetro que tem valores simples e fáceis de entender em um objeto mais complexo para a definição exigida do recurso do Azure. Você pode usar loops de variável para habilitar parâmetros a fim de especificar apenas as informações-chave que serão alteradas para cada item na lista. Você pode usar expressões Bicep ou valores padrão para definir outras propriedades exigidas para o recurso.
Loops de saída
Você pode usar saídas do Bicep para fornecer informações de suas implantações de volta para o usuário ou ferramenta que iniciou a implantação. Os loops de saída oferecem a flexibilidade e a potência dos loops em suas saídas.
Como você faz com outros loops, use a palavra-chave for
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 em seu modelo. Por exemplo, vamos ver um arquivo Bicep que implanta um conjunto de contas de armazenamento em regiões do Azure que são especificadas pelo parâmetro 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'
}
}]
Provavelmente, você precisará retornar informações sobre cada conta de armazenamento criada, como o nome dela e os pontos de extremidade que podem ser usados para acessá-la. Usando um loop de saída, você pode recuperar essas informações em seu arquivo Bicep.
Observação
Atualmente, o Bicep não dá suporte à referência direta de recursos que foram criados em 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 próximo exemplo.
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
}]
Cuidado
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 tratar de dados seguros.