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 du déploiement des ressources en utilisant des modèles liés ou imbriqués d’Azure Resource Manager (ARM). Les modèles liés et imbriqués permettent de décomposer votre déploiement en de nombreux modèles associés, puis de les déployer ensemble au moyen d’un modèle principal.

Modèle lié

Un modèle lié fait référence à l’acte de connexion de fichiers de modèles séparés, 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.

Quand vous référencez un modèle lié, vous devez fournir une valeur d’URI qui est accessible sur HTTP ou HTTPS. Contrairement à la dernière unité, nous ne pouvons pas utiliser un fichier local comme modèle.

Pour utiliser des modèles liés, vous devez d’abord préparer les modèles sur un point de terminaison accessible publiquement, comme GitHub ou Stockage Blob Azure. Utilisez un compte de stockage Azure sécurisé par un jeton de signature d’accès partagé (SAS) pour protéger vos modèles d’un 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 introduire des valeurs de paramètres dans le modèle lié et récupérer la sortie du modèle lié au moment du déploiement. Les paramètres peuvent être passés à l’aide d’un fichier de paramètres ou à l’aide de 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é

Un modèle imbriqué fait référence à l’intégration d’une syntaxe de modèle dans un modèle principal. Les modèles imbriqués permettent de mettre en œuvre des scénarios de déploiement avancés, tels qu’un 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 son propre fichier de modèle, les modèles imbriqués vous permettent de stocker de nombreux modèles individuels dans un même fichier. Vous pouvez procéder ainsi pour plusieurs raisons, comme quand 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": {
  }
}

Quand 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.