Modèle de fichier de variables partagées

Réduisez la répétition des valeurs partagées dans vos fichiers Bicep. Au lieu de cela, chargez ces valeurs à partir d’un fichier JSON partagé dans votre fichier Bicep. Lorsque vous utilisez des tableaux, concaténez les valeurs partagées avec des valeurs spécifiques au déploiement dans votre code Bicep.

Contexte et problème

Lorsque vous écrivez votre code Bicep, vous pouvez avoir des variables communes que vous réutilisez dans un ensemble de fichiers Bicep. Vous pouvez dupliquer les valeurs chaque fois que vous déclarez la ressource, par exemple en copiant et en collant les valeurs entre vos fichiers Bicep. Toutefois, cette approche est sujette aux erreurs et, lorsque vous devez apporter des modifications, vous devez mettre à jour chaque définition de ressource pour qu’elle soit synchronisée avec les autres.

En outre, lorsque vous utilisez des variables définies en tant que tableaux, vous pouvez avoir un ensemble de valeurs communes dans plusieurs fichiers Bicep et également avoir besoin d’ajouter des valeurs spécifiques pour la ressource que vous déployez. Lorsque vous combinez les variables partagées avec les variables spécifiques aux ressources, il est plus difficile pour une personne de percevoir la différence entre les deux catégories de variables.

Solution

Créez un fichier JSON qui contient les variables que vous devez partager. Utilisez la fonction loadJsonContent() pour charger le fichier et accéder aux variables. Pour les variables de tableau, utilisez la fonction concat() pour combiner les valeurs partagées avec toute valeur personnalisée pour la ressource spécifique.

Exemple 1 : préfixes d’attribution de noms

Supposons que vous ayez plusieurs fichiers Bicep qui définissent des ressources. Vous devez utiliser un préfixe d’attribution de noms cohérent pour toutes vos ressources.

Définissez un fichier JSON qui comprend les préfixes d’attribution de noms communs qui s’appliquent à l’ensemble de votre entreprise :

{
  "storageAccountPrefix": "stg",
  "appServicePrefix": "app"
}

Dans votre fichier Bicep, déclarez une variable qui importe les préfixes d’attribution de noms partagés :

var sharedNamePrefixes = loadJsonContent('./shared-prefixes.json')

Lorsque vous définissez vos noms de ressources, utilisez l’interpolation de chaîne pour concaténer les préfixes de noms partagés avec des suffixes de noms uniques :

var appServiceAppName = '${sharedNamePrefixes.appServicePrefix}-myapp-${uniqueString(resourceGroup().id)}'
var storageAccountName = '${sharedNamePrefixes.storageAccountPrefix}myapp${uniqueString(resourceGroup().id)}'

Exemple 2 : Règles de groupe de sécurité réseau

Supposons que vous ayez plusieurs fichiers Bicep qui définissent chacun son groupe de sécurité réseau (NSG). Vous avez un ensemble commun de règles de sécurité qui doivent être appliquées à chaque NSG, puis des règles spécifiques à l’application qui doivent être ajoutées.

Définissez un fichier JSON qui comprend les règles spécifiques à l’application qui s’appliquent à l’ensemble de votre entreprise :

{
  "securityRules": [
    {
      "name": "Allow_RDP_from_company_IP_address",
      "properties": {
        "description": "Allow inbound RDP from the company's IP address range.",
        "protocol": "Tcp",
        "sourceAddressPrefix": "203.0.113.0/24",
        "sourcePortRange": "*",
        "destinationAddressPrefix": "VirtualNetwork",
        "destinationPortRange": "3389",
        "access": "Allow",
        "priority": 100,
        "direction": "Inbound"
      }
    },
    {
      "name": "Allow_VirtualNetwork_to_Storage",
      "properties": {
        "description": "Allow outbound connections to the Azure Storage service tag.",
        "protocol": "Tcp",
        "sourceAddressPrefix": "VirtualNetwork",
        "sourcePortRange": "*",
        "destinationAddressPrefix": "Storage",
        "destinationPortRange": "*",
        "access": "Allow",
        "priority": 100,
        "direction": "Outbound"
      }
    }
    // other rules here
  ]
}

Dans votre fichier Bicep, déclarez une variable qui importe les règles spécifiques à l’application :

var sharedRules = loadJsonContent('./shared-rules.json', 'securityRules')

Créez un tableau de variables qui représente les règles personnalisées pour ce groupe de sécurité réseau spécifique :

var customRules = [
  {
    name: 'Allow_Internet_HTTPS_Inbound'
    properties: {
      description: 'Allow inbound internet connectivity for HTTPS only.'
      protocol: 'Tcp'
      sourcePortRange: '*'
      destinationPortRange: '443'
      sourceAddressPrefix: 'Internet'
      destinationAddressPrefix: 'VirtualNetwork'
      access: 'Allow'
      priority: 400
      direction: 'Inbound'
    }
  }
]

Définissez la ressource NSG. Utilisez la fonction concat() pour combiner les deux tableaux et définir la securityRules propriété :

resource nsg 'Microsoft.Network/networkSecurityGroups@2021-08-01' = {
  name: nsgName
  location: location
  properties: {
    securityRules: concat(sharedRules, customRules)
  }
}

Considérations

  • Lorsque vous utilisez cette approche, le fichier JSON est inclus dans le modèle ARM généré par Bicep. Les modèles ARM JSON générés par Bicep ont une limite de fichiers de 4 Mo. Il est donc important d’éviter d’utiliser des fichiers de variables partagées volumineux.
  • Vérifiez que vos tableaux de variables partagées ne sont pas en conflit avec les valeurs de tableau spécifiées dans chaque fichier Bicep. Par exemple, lorsque vous utilisez le modèle de jeu de configuration pour définir des groupes de sécurité réseau, assurez-vous que vous n’avez pas plusieurs règles qui définissent les mêmes priorités et direction.

Étapes suivantes

En savoir plus sur le modèle de jeu de configuration.