Implantar vários recursos usando loops
Muitas vezes, você precisa implantar vários recursos que são muito semelhantes. Ao adicionar loops aos seus arquivos Bicep, você pode evitar ter que repetir definições de recursos. 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 para cada instância.
Para sua empresa de brinquedos, você precisa implantar a infraestrutura de back-end, incluindo alguns servidores lógicos SQL do Azure, para dar suporte ao lançamento do novo ursinho de pelúcia inteligente. Você precisa implantar um servidor lógico dedicado para cada país/região onde o brinquedo estará disponível, para que você esteja em conformidade com as leis de proteção de dados de cada país/região.
Além de suas localizações, 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.
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.
Usar loops de cópia
Ao definir um recurso ou um módulo em um modelo Bicep, você pode usar a for
palavra-chave para criar um loop. Coloque a for
palavra-chave na declaração de recurso e especifique como você deseja que o Bicep identifique cada item no loop. Normalmente, você faz um loop sobre uma matriz de objetos para criar várias instâncias de um recurso. O exemplo a seguir implanta várias contas de armazenamento e seus 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 através de cada item na storageAccountNames
matriz. 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 name
propriedade. Observe que o Bicep requer que você coloque um caractere de colchete de abertura ([
) antes da for
palavra-chave e um caractere de colchete de fechamento (]
) após a definição do recurso.
Se você implantasse esse arquivo Bicep, veria que três contas de armazenamento foram criadas, com seus nomes especificados pelos itens correspondentes na storageAccountNames
matriz.
Loop baseado em uma contagem
Às vezes, talvez seja necessário fazer um loop para criar um número específico de recursos e não usar uma matriz como origem. Bicep fornece a range()
função, que cria uma matriz de números. Por exemplo, se você precisar criar quatro contas de armazenamento chamadas sa1
através do sa4
, poderá usar uma definição de recurso como esta:
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 range()
função, você especifica seu valor inicial e o número de valores que deseja criar. Por exemplo, se você quiser criar contas de armazenamento com os nomes sa0
, sa1
e sa2
, use a função range(0,3)
.
Nota
Ao usar a range()
função, você fornece dois argumentos. O primeiro especifica o valor inicial e o segundo informa ao Bicep o número de valores desejado. Por exemplo, se você usar range(3,4)
, o Bicep retornará os valores 3
, 4
, 5
, e 6
. Certifique-se de solicitar o número correto de valores, especialmente quando você usa um valor inicial de 0.
Acessar o índice de iteração
Com o Bicep, você pode iterar através de 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 queira 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 name
propriedade inclui a expressão i+1
. O primeiro valor da variável de índice é zero, portanto, você precisa adicioná-lo +1
se quiser que os nomes dos i
servidores comecem com 1
.
Gorjeta
Neste exemplo, nomeamos a variável i
de índice . Esta é a convenção padrão no Bicep. No entanto, você pode usar qualquer nome que desejar.
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 if
palavras-chave e for
.
No exemplo a seguir, o código usa um parâmetro array 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 environmentName
propriedade do objeto de loop é Production
igual a:
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 você implantou o exemplo anterior, sqlserver-we
verá dois servidores lógicos e , mas sqlserver-eas
não sqlserver-eus2
, porque a environmentName
propriedade desse objeto não corresponde .Production