Déployer des modèles ARM liés et imbriqués

Effectué

À mesure que la complexité de votre déploiement augmente, vous pouvez passer à une approche modulaire pour déployer des ressources à l’aide de modèles liés ou imbriqués Azure Resource Manager (ARM). Les modèles liés et imbriqués permettent de décomposer votre déploiement en plusieurs modèles connexes, puis de les déployer ensemble via un modèle principal.

Modèle lié

Le modèle lié fait référence à l’acte de connexion de fichiers modèles distincts, référencés par un lien à partir d’un modèle principal. Les modèles liés vous permettent de créer des déploiements réutilisables, composables et modulaires constitués de nombreux modèles ARM individuels.

Lorsque vous référencez un modèle lié, vous devez fournir une valeur d’URI accessible via HTTP ou HTTPS. Contrairement à notre dernière unité, où nous pourrions utiliser un fichier local comme modèle.

Pour utiliser des modèles liés, vous devez d’abord mettre en scène les modèles sur un point de terminaison accessible publiquement, tel que GitHub ou Stockage Blob Azure. Utilisez un compte de stockage Azure sécurisé par un jeton de signature d’accès partagé (SAP) pour protéger vos modèles de l’accès public.

Pour ajouter un modèle lié à votre modèle ARM, ajoutez une ressource Microsoft.Resources/deployments et la propriété templateLink configurée avec l’emplacement du modèle.

{
    "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
    "contentVersion": "1.0.0.0",
    "parameters": {
        "name": {
            "type": "string",
            "defaultValue": "linkeddemo001"
        }
    },
    "variables": {
        "linked-template": "https://raw.githubusercontent.com/Azure/azure-docs-json-samples/master/mslearn-arm-Module-sample/storage.json",
        "linked-template-two": "https://raw.githubusercontent.com/Azure/azure-docs-json-samples/master/mslearn-arm-Module-sample/identity.json"
    },
    "resources": [
        {
            "name": "storage",
            "type": "Microsoft.Resources/deployments",
            "apiVersion": "2019-10-01",
            "properties": {
                "mode": "Incremental",
                "templateLink": {
                    "uri": "[variables('linked-template')]",
                    "contentVersion": "1.0.0.0"
                },
                "parameters": {
                    "name": { "value": "[parameters('name')]" },
                    "location": { "value": "[resourceGroup().location]" }
                }
            }
        },
        {
            "name": "identity",
            "type": "Microsoft.Resources/deployments",
            "apiVersion": "2019-10-01",
            "dependsOn": [
                "[resourceId('Microsoft.Resources/deployments','storage')]"
            ],
            "properties": {
                "mode": "Incremental",
                "templateLink": {
                    "uri": "[variables('linked-template-two')]",
                    "contentVersion": "1.0.0.0"
                },
                "parameters": {
                    "name": { "value": "[parameters('name')]" },
                    "location": { "value": "[resourceGroup().location]" }
                }
            }
        }
    ],
    "outputs": {
        "storageURI": {
            "type": "string",
            "value": "[reference('storage').outputs.storageEndpoint.value]"
        }
    }
}

Si nécessaire, vous pouvez également transmettre des valeurs de paramètre dans le modèle lié et obtenir la sortie du modèle lié au moment du déploiement. Les paramètres peuvent être transmis via un fichier de paramètres ou via des paramètres inline.

{
  "name": "storage",
  "type": "Microsoft.Resources/deployments",
  "apiVersion": "2019-10-01",
  "properties": {
      "mode": "Incremental",
      "templateLink": {
          "uri": "[variables('linked-template')]",
          "contentVersion": "1.0.0.0"
      },
      "parameters": {
          "name": { "value": "[parameters('name')]" },
          "location": { "value": "[resourceGroup().location]" }
      }
  }
}

Pour les solutions petites et moyennes, un modèle unique est plus facile à comprendre et à gérer. Vous pouvez voir toutes les ressources et valeurs dans un même fichier. Pour des scénarios avancés, les modèles liés permettent de diviser la solution en composants ciblés. Vous pouvez facilement réutiliser ces modèles pour d’autres scénarios.

Modèle imbriqué

Le modèle imbriqué fait référence à l'action d'incorporer une syntaxe de modèle dans un modèle principal. Les modèles imbriqués permettent des scénarios de déploiement avancés tels que le déploiement sur plusieurs étendues Azure Resource Manager ou plusieurs groupes de ressources à partir d’un seul fichier de modèle. Contrairement aux modèles liés, où chaque modèle est stocké dans ses propres fichiers de modèles, les modèles imbriqués vous permettent de stocker de nombreux modèles individuels dans un seul fichier. Il existe plusieurs raisons pour lesquelles vous souhaiterez peut-être utiliser cette structure de modèle, par exemple lorsque vous déployez des ressources sur plusieurs groupes de ressources ou étendues de déploiement.

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "storageAccountName": {
      "type": "string"
    }
  },
  "resources": [
    {
      "type": "Microsoft.Resources/deployments",
      "apiVersion": "2019-10-01",
      "name": "nestedTemplate1",
      "properties": {
        "mode": "Incremental",
        "template": {
          "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
          "contentVersion": "1.0.0.0",
          "resources": [
            {
              "type": "Microsoft.Storage/storageAccounts",
              "apiVersion": "2019-04-01",
              "name": "[parameters('storageAccountName')]",
              "location": "West US",
              "sku": {
                "name": "Standard_LRS"
              },
              "kind": "StorageV2"
            }
          ]
        }
      }
    }
  ],
  "outputs": {
  }
}

Lorsque vous utilisez un modèle imbriqué, vous pouvez spécifier si les expressions de modèle sont évaluées dans l’étendue du modèle parent ou du modèle imbriqué. L’étendue détermine comment les paramètres, les variables et les fonctions comme resourceGroup et subscription sont résolus.