Implantar vários recursos usando loops
Geralmente, você precisa implantar vários recursos muito semelhantes. Ao adicionar loops aos arquivos Bicep, você pode evitar a repetição de definições de recurso. Em vez disso, você pode definir dinamicamente o número de instâncias de um recurso que deseja implantar. Você pode até mesmo personalizar as propriedades de cada instância.
Para sua empresa de brinquedos, você precisa implantar a infraestrutura de back-end, incluindo alguns servidores lógicos do SQL do Azure, para dar suporte ao lançamento do novo urso inteligente. Você precisa implantar um servidor lógico dedicado em cada país/região nas quais o brinquedo estará disponível, para estar em conformidade com as leis de proteção de dados de cada país/região.
Com a exceção dos respectivos locais, todos os servidores lógicos serão configurados da mesma maneira. Você deseja usar o código Bicep para implantar seus servidores lógicos, e um parâmetro deve permitir que você especifique as regiões nas quais os servidores lógicos devem ser implantados.
Nesta unidade, você aprenderá a implantar várias instâncias de recursos usando loops de cópia.
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.
Usar loops de cópia
Ao definir um recurso ou um módulo em um modelo Bicep, você pode usar a palavra-chave for
para criar um loop. Coloque a palavra-chave for
na declaração do recurso e especifique como você quer que o Bicep identifique cada item no loop. Normalmente, você faz um loop em uma matriz de objetos para criar várias instâncias de um recurso. O seguinte exemplo implanta várias contas de armazenamento e os respectivos nomes são especificados como valores de parâmetro:
param storageAccountNames array = [
'saauditus'
'saauditeurope'
'saauditapac'
]
resource storageAccountResources 'Microsoft.Storage/storageAccounts@2023-05-01' = [for storageAccountName in storageAccountNames: {
name: storageAccountName
location: resourceGroup().location
kind: 'StorageV2'
sku: {
name: 'Standard_LRS'
}
}]
Neste exemplo, o loop itera em cada item na matriz storageAccountNames
. Cada vez que o Bicep passa pelo loop, ele coloca o valor atual em uma variável especial chamada storageAccountName
e é usado como o valor da propriedade name
. Observe que o Bicep exige que você coloque um caractere de colchete de abertura ([
) antes da palavra-chave for
e um caractere de colchete de fechamento (]
) após a definição do recurso.
Se implantar esse arquivo Bicep, você verá que três contas de armazenamento foram criadas, com os respectivos nomes especificados pelos itens correspondentes na matriz storageAccountNames
.
Loop com base em uma contagem
Às vezes, talvez seja necessário criar um loop para criar um número específico de recursos sem usar uma matriz como a origem. O Bicep fornece a função range()
, que cria uma matriz de números. Por exemplo, se precisar criar quatro contas de armazenamento com nomes desa1
a sa4
, você poderá usar uma definição de recurso como a do exemplo a seguir:
resource storageAccountResources 'Microsoft.Storage/storageAccounts@2023-05-01' = [for i in range(1,4): {
name: 'sa${i}'
location: resourceGroup().location
kind: 'StorageV2'
sku: {
name: 'Standard_LRS'
}
}]
Ao usar a função range()
, especifique seu valor inicial e o número de valores que você deseja criar. Por exemplo, se quisesse criar contas de armazenamento com os nomes sa0
, sa1
e sa2
, você usaria a função range(0,3)
.
Observação
Ao usar a função range()
, você fornece dois argumentos. O primeiro especifica o valor inicial e o segundo informa ao Bicep o número de valores que você deseja. Por exemplo, se você usar range(3,4)
, o Bicep retornará os valores 3
, 4
, 5
e 6
. Verifique se você solicitou o número correto de valores, especialmente quando usar um valor inicial de 0.
Acessar o índice de iteração
Com o Bicep, você pode iterar por matrizes e recuperar o índice do elemento atual na matriz. Por exemplo, digamos que você queira criar um servidor lógico em cada local especificado por uma matriz e deseje que os nomes dos servidores sejam sqlserver-1
, sqlserver-2
e assim por diante. Você pode conseguir isso usando o seguinte código Bicep:
param locations array = [
'westeurope'
'eastus2'
'eastasia'
]
resource sqlServers 'Microsoft.Sql/servers@2023-08-01-preview' = [for (location, i) in locations: {
name: 'sqlserver-${i+1}'
location: location
properties: {
administratorLogin: administratorLogin
administratorLoginPassword: administratorLoginPassword
}
}]
Observe que a propriedade name
inclui a expressão i+1
. O primeiro valor da variável de índice i
é zero, portanto, você precisará adicionar +1
se quiser que seus nomes de servidor comecem com 1
.
Dica
Neste exemplo, nomeamos a variável de índice i
. Essa é a convenção padrão no Bicep. No entanto, você pode usar qualquer nome para esses grupos.
Filtrar itens com loops
Em algumas situações, talvez você queira implantar recursos usando loops de cópia combinados com condições. Você pode fazer isso combinando as palavras-chave if
e for
.
No exemplo a seguir, o código usa um parâmetro de matriz para definir um conjunto de servidores lógicos. Uma condição é usada com o loop de cópia para implantar os servidores somente quando a propriedade environmentName
do objeto de loop é igual a Production
:
param sqlServerDetails array = [
{
name: 'sqlserver-we'
location: 'westeurope'
environmentName: 'Production'
}
{
name: 'sqlserver-eus2'
location: 'eastus2'
environmentName: 'Development'
}
{
name: 'sqlserver-eas'
location: 'eastasia'
environmentName: 'Production'
}
]
resource sqlServers 'Microsoft.Sql/servers@2023-08-01-preview' = [for sqlServer in sqlServerDetails: if (sqlServer.environmentName == 'Production') {
name: sqlServer.name
location: sqlServer.location
properties: {
administratorLogin: administratorLogin
administratorLoginPassword: administratorLoginPassword
}
tags: {
environment: sqlServer.environmentName
}
}]
Se tiver implantado o exemplo anterior, você verá dois servidores lógicos, sqlserver-we
e sqlserver-eas
, mas não sqlserver-eus2
, porque a propriedade environmentName
do objeto não corresponderá a Production
.