Bereitstellen von verknüpften und geschachtelten ARM-Vorlagen

Abgeschlossen

Wenn Ihre Bereitstellung komplexer wird, sollten Sie womöglich zu einem modularen Ansatz zum Bereitstellen von Ressourcen mithilfe verknüpfter oder geschachtelter Vorlagen von Azure Resource Manager (ARM) wechseln. Verknüpfte und geschachtelte Vorlagen sind Möglichkeiten, Ihre Bereitstellung in viele verwandte Vorlagen aufzuschlüsseln und sie dann gemeinsam über eine Hauptvorlage bereitzustellen.

Verknüpfte Vorlage

Das Verknüpfen von Vorlagen bezieht sich auf das Herstellen einer Verbindung von separaten Vorlagendateien, auf die durch eine Verknüpfung aus einer Hauptvorlage verwiesen wird. Mit verknüpften Vorlagen können Sie wiederverwendbare, zusammensetzbare und modulare Bereitstellungen erstellen, die aus vielen einzelnen ARM-Vorlagen bestehen.

Wenn Sie auf eine verknüpfte Vorlage verweisen, müssen Sie einen URI-Wert angeben, der über HTTP oder HTTPS zugänglich ist. Dies ist anders als bei der letzten Lerneinheit, bei der Sie eine lokale Datei als Vorlage verwenden konnten.

Damit Sie verknüpfte Vorlagen verwenden können, müssen Sie die Vorlagen zuerst auf einem öffentlich zugänglichen Endpunkt wie GitHub oder Azure Blob Storage bereitstellen. Verwenden Sie ein Azure Storage-Konto, das durch ein SAS-Token geschützt wird, um Ihre Vorlagen vor öffentlichem Zugriff zu schützen.

Um Ihrer ARM-Vorlage eine verknüpfte Vorlage hinzuzufügen, fügen Sie eine Ressource Microsoft.Resources/deployments und die Eigenschaft templateLink hinzu, die mit dem Speicherort der Vorlage konfiguriert ist.

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

Bei Bedarf können Sie auch Parameterwerte an die verknüpfte Vorlage übergeben und die Ausgabe aus der verknüpften Vorlage zum Zeitpunkt der Bereitstellung abrufen. Parameter können entweder über eine Parameterdatei oder über Inlineparameter übergeben werden.

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

Bei kleinen bis mittelgroßen Lösungen lässt sich eine Einzelvorlage einfacher verstehen und verwalten. Sie können alle Ressourcen und Werte in einer einzelnen Datei anzeigen. In erweiterten Szenarien können Sie mithilfe verknüpfter Vorlagen die Lösung in Zielkomponenten unterteilen. Sie können diese Vorlagen mühelos erneut für andere Szenarien verwenden.

Geschachtelte Vorlage

Geschachtelte Vorlagen beziehen sich auf die Einbettung der Vorlagensyntax in eine Hauptvorlage. Diese geschachtelten Vorlagen ermöglichen erweiterte Bereitstellungsszenarios wie die Bereitstellung in mehreren ARM-Bereichen oder mehreren Ressourcengruppen aus einer einzelnen Vorlagendatei. Im Gegensatz zu verknüpften Vorlagen, bei denen jede Vorlage in eigenen Vorlagendateien gespeichert wird, können Sie bei geschachtelten Vorlagen viele einzelne Vorlagen in einer Datei speichern. Es gibt mehrere Gründe, warum Sie diese Vorlagenstruktur verwenden sollten, z. B. wenn Sie Ressourcen für mehrere Ressourcengruppen oder Einsatzbereiche bereitstellen.

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

Wenn Sie eine geschachtelte Vorlage verwenden, können Sie festlegen, ob Vorlagenausdrücke innerhalb des Bereichs der übergeordneten oder der geschachtelten Vorlage ausgewertet werden sollen. Der Bereich bestimmt, wie Parameter, Variablen und Funktionen wie resourceGroup und subscription aufgelöst werden.