Implantar vários recursos usando loops

Concluído

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@2021-09-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@2021-09-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, e sa2, sa1use 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ê usarrange(3,4), o Bicep retornará os valores 3, , 45, 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-2e assim por diante. Você pode conseguir isso usando o seguinte código Bicep:

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

resource sqlServers 'Microsoft.Sql/servers@2021-11-01-preview' = [for (location, i) in locations: {
  name: 'sqlserver-${i+1}'
  location: location
  properties: {
    administratorLogin: administratorLogin
    administratorLoginPassword: administratorLoginPassword
  }
}]

Observe que a propriedade inclui a name 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 ide í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 propriedade do objeto de loop é Productionigual aenvironmentName:

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@2021-11-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-easnão , porque a environmentName propriedade desse objeto não sqlserver-eus2corresponde .Production