Distribuire modelli di Azure Resource Manager collegati e annidati

Completato

Con l'aumentare della complessità della distribuzione, può essere utile passare a un approccio modulare alla distribuzione delle risorse usando modelli collegati o annidati di Azure Resource Manager. I modelli collegati e annidati consentono di scomporre la distribuzione in molti modelli correlati e quindi di distribuirli insieme tramite un modello principale.

Modello collegato

Per modello collegato si intende l'azione di collegare file modello separati, cui viene fatto riferimento tramite un collegamento da un modello principale. I modelli collegati consentono di creare distribuzioni riutilizzabili, componibili e modulari costituite da molti singoli modelli di Azure Resource Manager.

Quando si fa riferimento a un modello collegato, è necessario specificare un valore URI accessibile tramite HTTP o HTTPS. A differenza dell'ultima unità, in cui è possibile usare un file locale come modello.

Per usare modelli collegati, è necessario prima di tutto eseguire lo staging dei modelli in un endpoint accessibile pubblicamente come GitHub o Archiviazione BLOB di Azure. Usare un account di archiviazione di Azure protetto da un token di firma di accesso condiviso (SAS) per tenere i modelli al sicuro dall'accesso pubblico.

Per aggiungere un modello collegato al modello ARM, aggiungere una risorsa Microsoft.Resources/deployments e la proprietà templateLink configurata con il percorso del modello.

{
    "$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]"
        }
    }
}

Se necessario, è anche possibile passare i valori dei parametri nel modello collegato e ottenere l'output dal modello collegato in fase di distribuzione. È possibile passare i parametri tramite un file di parametri o parametri 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]" }
      }
  }
}

Per le piccole e medie soluzioni, un modello singolo è più facile da comprendere e gestire. È possibile vedere tutti i valori e le risorse in un unico file. Per gli scenari avanzati, i modelli collegati consentono di suddividere la soluzione in componenti di destinazione. È possibile riutilizzare facilmente questi modelli per altri scenari.

Modello annidato

Per modello annidato si intende l'azione di incorporare la sintassi del modello all'interno di un modello principale. I modelli annidati consentono scenari di distribuzione avanzati, come la distribuzione in più ambiti di Azure Resource Manager o più gruppi di risorse da un singolo file modello. A differenza dei modelli collegati, in cui ogni modello viene archiviato nei propri file modello, i modelli annidati consentono di archiviare numerosi modelli singoli in un unico file. Sono diversi i motivi per cui può essere utile usare questa struttura del modello, ad esempio quando si distribuiscono risorse in più gruppi di risorse o ambiti di distribuzione.

{
  "$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": {
  }
}

Quando si usa un modello annidato, è possibile specificare se le espressioni del modello vengono valutate nell'ambito del modello padre o del modello annidato. L'ambito determina il modo in cui vengono risolti parametri, variabili e funzioni come resourceGroup e subscription.