Implementación de plantillas de Resource Manager vinculadas y anidadas

Completado

A medida que crezca la complejidad de la implementación, es posible que quiera pasar a un enfoque modular para implementar recursos mediante plantillas vinculadas o anidadas de Azure Resource Manager (ARM). Las plantillas vinculadas y anidadas son formas de desglosar la implementación en muchas plantillas relacionadas y, después, implementarlas juntas a través de una plantilla principal.

Plantilla vinculada

La plantilla vinculada alude a la acción de conectar archivos de plantillas independientes, a los que hace referencia un vínculo desde una plantilla principal. Las plantillas vinculadas permiten crear implementaciones reutilizables, modulares y que admiten composición formadas por muchas plantillas de Resource Manager individuales.

Al hacer referencia a una plantilla vinculada, debe proporcionar un valor de URI que sea accesible por HTTP o HTTPS. A diferencia de nuestra última unidad, donde podríamos usar un archivo local como plantilla.

Para usar plantillas vinculadas, primero se deben almacenar provisionalmente las plantillas en un punto de conexión accesible públicamente, como GitHub o Azure Blob Storage. Use una cuenta de almacenamiento de Azure que proteja un token de firma de acceso compartido (SAS) para mantener protegidas las plantillas del acceso público.

Para agregar una plantilla vinculada a la plantilla de Resource Manager, agregue un recurso Microsoft.Resources/deployments y la propiedad templateLink configurada con la ubicación de la plantilla.

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

En caso necesario, también puede pasar valores de parámetro a la plantilla vinculada y obtener la salida de esta plantilla en el momento de la implementación. Los parámetros se pueden pasar a través de un archivo de parámetros o de parámetros insertados.

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

En el caso de soluciones pequeñas o medianas, es más fácil entender y mantener una única plantilla. Puede ver todos los recursos y valores en un único archivo. Para los escenarios avanzados, las plantillas vinculadas le permiten desglosar la solución en componentes dirigidos. Estas plantillas se pueden reutilizar fácilmente para otros escenarios.

Plantilla anidada

La plantilla anidada hace referencia a la acción de insertar la sintaxis de plantilla dentro de una plantilla principal. Permiten escenarios de implementación avanzados, como la implementación en varios ámbitos de Azure Resource Manager o varios grupos de recursos desde un único archivo de plantilla. A diferencia de las plantillas vinculadas, donde cada una de estas se almacena en sus propios archivos de plantilla, las anidadas permiten almacenar muchas plantillas individuales en un archivo. Hay varias razones por las que es posible que quiera usar esta estructura de plantilla, como al implementar recursos en varios grupos de recursos o ámbitos de implementación.

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

Cuando se usa una plantilla anidada, se puede especificar si las expresiones de plantilla se evalúan dentro del ámbito de la plantilla primaria o de la plantilla anidada. El ámbito determina cómo se resuelven los parámetros, las variables y las funciones como resourceGroup y subscription.