Déployer plusieurs ressources à l’aide de boucles
Souvent, vous devez déployer plusieurs ressources qui sont très similaires. En ajoutant des boucles à vos fichiers Bicep, vous pouvez éviter d’avoir à répéter les définitions de ressource. Au lieu de cela, vous pouvez définir dynamiquement le nombre d’instances d’une ressource que vous souhaitez déployer. Vous pouvez même personnaliser les propriétés de chaque instance.
Pour votre société de jouets, vous devez déployer l’infrastructure principale, y compris certains serveurs logiques Azure SQL, pour prendre en charge le lancement du nouveau nounours intelligent. Vous devez déployer un serveur logique dédié dans chaque pays/région où le jouet sera disponible, afin d’être en conformité avec la législation sur la protection des données de chaque pays/région.
Mis à part leur emplacement, tous les serveurs logiques sont configurés de la même façon. Vous souhaitez utiliser le code Bicep pour déployer vos serveurs logiques, et un paramètre doit vous permettre de spécifier les régions dans lesquelles les serveurs logiques doivent être déployés.
Dans cette unité, vous allez apprendre à déployer plusieurs instances de ressources à l’aide de boucles de copie.
Notes
Les commandes de cette unité sont présentées pour illustrer les concepts. N’exécutez pas encore les commandes. Vous allez bientôt mettre en pratique ce que vous apprenez ici.
Utiliser des boucles de copie
Lorsque vous définissez une ressource ou un module dans un modèle Bicep, vous pouvez utiliser le mot clé for
pour créer une boucle. Placez le mot clé for
dans la déclaration de ressource, puis spécifiez comment vous souhaitez que Bicep identifie chaque élément de la boucle. En règle générale, vous faites une boucle sur un tableau d’objets pour créer plusieurs instances d’une ressource. L’exemple suivant déploie plusieurs comptes de stockage et leurs noms sont spécifiés en tant que valeurs de paramètre :
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'
}
}]
Dans cet exemple, la boucle itère au sein de chaque élément du tableau storageAccountNames
. Chaque fois que Bicep passe par la boucle, il place la valeur actuelle dans une variable spéciale appelée storageAccountName
, et elle est utilisée comme valeur de la propriété name
. Notez que Bicep nécessite que vous placiez un caractère crochet ouvrant ([
) avant le mot clé for
et un crochet fermant (]
) après la définition de ressource.
Si vous avez déployé ce fichier Bicep, vous devez voir que trois comptes de stockage ont été créés, leurs noms étant spécifiés par les éléments correspondants dans le tableau storageAccountNames
.
Boucle basée sur un nombre
Vous devrez peut-être parfois effectuer une boucle pour créer un nombre spécifique de ressources, et ne pas utiliser un tableau comme source. Bicep fournit la fonction range()
, qui crée un tableau de nombres. Par exemple, pour créer quatre comptes de stockage dont les noms vont de sa1
à sa4
, vous pouvez utiliser une définition de ressource comme suit :
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'
}
}]
Lorsque vous utilisez la fonction range()
, vous spécifiez sa valeur de départ et le nombre de valeurs que vous souhaitez créer. Par exemple, si vous souhaitez créer des comptes de stockage nommés sa0
, sa1
et sa2
, utilisez la fonction range(0,3)
.
Remarque
Lorsque vous utilisez la fonction range()
, vous fournissez deux arguments. Le premier spécifie la valeur de départ, tandis que le second indique à Bicep le nombre de valeurs souhaitées. Par exemple, si vous utilisez range(3,4)
, Bicep retourne alors les valeurs 3
, 4
, 5
et 6
. Veillez à demander le bon nombre de valeurs, en particulier lorsque vous utilisez une valeur de départ de 0.
Accéder à l’index d’itération
Avec Bicep, vous pouvez itérer au sein des tableaux et récupérer l’index de l’élément actuel dans le tableau. Par exemple, supposons que vous souhaitiez créer un serveur logique dans chaque emplacement spécifié par un tableau et que vous souhaitez que les noms des serveurs soient sqlserver-1
, sqlserver-2
et ainsi de suite. Pour ce faire, vous pouvez utiliser le code Bicep suivant :
param locations array = [
'westeurope'
'eastus2'
'eastasia'
]
resource sqlServers 'Microsoft.Sql/servers@2024-05-01-preview' = [for (location, i) in locations: {
name: 'sqlserver-${i+1}'
location: location
properties: {
administratorLogin: administratorLogin
administratorLoginPassword: administratorLoginPassword
}
}]
Notez que la propriété name
contient l’expression i+1
. La première valeur de la variable d’index i
est zéro. Vous devez donc ajouter +1
si vous souhaitez que les noms de vos serveurs commencent par 1
.
Conseil
Dans cet exemple, nous avons nommé la variable d’index i
. Il s’agit de la convention standard dans Bicep. Cependant, vous pouvez utiliser le nom que vous voulez.
Filtrer les éléments avec des boucles
Dans certains cas, vous souhaiterez peut-être déployer des ressources à l’aide de boucles de copie associées à des conditions. Pour ce faire, vous pouvez combiner les mots clés if
et for
.
Dans l’exemple suivant, le code utilise un paramètre de tableau pour définir un ensemble de serveurs logiques. Une condition est utilisée avec la boucle de copie pour déployer les serveurs uniquement lorsque la propriété environmentName
de l’objet de boucle est égale à 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@2024-05-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
}
}]
Si vous avez déployé l’exemple précédent, vous devez voir deux serveurs logiques, sqlserver-we
et sqlserver-eas
, mais pas sqlserver-eus2
, car la propriété environmentName
de cet objet ne correspond pas à Production
.