Implementar modelos do Resource Manager associados e aninhados

Concluído

À medida que a complexidade da sua implementação aumentar, poderá querer mudar para uma abordagem modular para implementar recursos com os modelos associados ou aninhados do Azure Resource Manager (ARM). Os modelos associados ou aninhados são formas de dividir a sua implementação em vários modelos relacionados e, em seguida, implementá-los em conjunto através de um modelo principal.

Modelo associado

Os modelos associados referem-se ao ato de associar ficheiros de modelos separados, referenciados por uma ligação a partir de um modelo principal. Os modelos ligados permitem a criação de implementações reutilizáveis, compostas e modulares que incluem muitos modelos do Resource Manager individuais.

Ao referenciar um modelo associado, tem de fornecer um valor URI que pode ser acessível através de HTTP ou HTTPS, Ao contrário da nossa última unidade, onde poderíamos usar um arquivo local como modelo.

Para utilizar modelos associados, os modelos têm de ser primeiro testados num ponto final acessível publicamente, como o GitHub ou um Armazenamento de Blobs do Azure. Utilize uma conta do armazenamento do Azure protegida por um token de SAS (Assinatura de Acesso Partilhado) para manter os seus modelos protegidos contra o acesso público.

Para adicionar um modelo vinculado ao seu modelo ARM, adicione um Microsoft.Resources/deployments recurso e a templateLink propriedade configurada com o local do modelo.

{
    "$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 necessário, também pode transmitir valores de parâmetros ao modelo associado e obter resultados do modelo associado durante a implementação. Os parâmetros podem ser transmitidos através de um ficheiro de parâmetros ou através de parâmetros 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]" }
      }
  }
}

Para obter soluções pequenas a médias, um único modelo é mais fácil de compreender e manter. Pode ver todos os recursos e valores num único ficheiro. Para cenários avançados, os modelos associados permitem-lhe dividir a solução em componentes direcionados. Pode facilmente utilizar estes modelos para outros cenários.

Modelo aninhado

O modelo aninhado refere-se ao ato de incorporar a sintaxe do modelo num modelo principal. Os modelos aninhados permitem cenários de implementação avançados, como a implementação de vários âmbitos de Azure Resource Manager ou vários grupos de recursos a partir de um ficheiro de modelo único. Ao contrário dos modelos associados, em que cada modelo é armazenado no seu próprio ficheiro de modelo, os modelos aninhados permitem-lhe armazenar vários modelos individuais num só ficheiro. Há vários motivos pelos quais você pode querer usar essa estrutura de modelo, como quando você está implantando recursos em vários grupos de recursos ou escopos de implantação.

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

Ao utilizar um modelo aninhado, pode especificar se as expressões do modelo são avaliadas no âmbito do modelo principal ou do modelo aninhado. O âmbito determina a forma como os parâmetros, variáveis e funções como resourceGroup e subscription são resolvidos.