Implantar modelos do ARM vinculados e aninhados

Concluído

À medida que a complexidade da implantação aumenta, pode ser recomendável passar a adotar uma abordagem modular a fim de implantar recursos usando os modelos vinculados ou aninhados do ARM (Azure Resource Manager). Modelos vinculados e aninhados são maneiras de detalhar a implantação em vários modelos relacionados para, depois, implantá-los juntos por meio de um modelo principal.

Modelo vinculado

Modelo vinculado refere-se ao ato de conectar arquivos de modelo separados, referenciados por um link de um modelo principal. Modelos vinculados permitem que você crie implantações reutilizáveis, combináveis e modulares compostas por vários modelos do ARM individuais.

Ao fazer referência a um modelo vinculado, você precisa fornecer um valor de URI que pode ser acessado por HTTP ou HTTPS. Ao contrário da última unidade, em que podíamos usar um arquivo local como modelo.

Para usar modelos vinculados, primeiro você precisa preparar os modelos em um ponto de extremidade publicamente acessível, como o GitHub ou um Armazenamento de Blobs do Azure. Use uma conta de armazenamento do Azure protegida por um token SAS (Assinatura de Acesso Compartilhado) para manter seus modelos protegidos do acesso público.

Para adicionar um modelo vinculado ao modelo do ARM, adicione um recurso Microsoft.Resources/deployments e a propriedade templateLink configurada com a localização 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, você também pode passar valores de parâmetro para o modelo vinculado e obter a saída do modelo vinculado no momento da implantação. Os parâmetros podem ser passados por meio de um arquivo de parâmetros ou usando parâmetros embutidos.

{
  "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 pequenas e médias soluções, um único modelo é mais fácil de entender e manter. Você pode ver todos os recursos e valores em um único arquivo. Para cenários avançados, os modelos vinculados permitem que você detalhe a solução em componentes de destino. Você pode reutilizar esses modelos para outros cenários com facilidade.

Modelo aninhado

Modelo aninhado se refere ao ato de inserir a sintaxe de um modelo em outro modelo principal. Modelos aninhados permitem cenários avançados de implantação, por exemplo, implantar em vários escopos do Azure Resource Manager ou em vários grupos de recursos de um só arquivo de modelo. Ao contrário dos modelos vinculados, em que cada modelo é armazenado em seu respectivo arquivo de modelo, os modelos aninhados permitem que você armazene vários modelos individuais em um só arquivo. Pode haver vários motivos para usar essa estrutura de modelo, por exemplo, ao implantar recursos em vários grupos de recursos ou em vários 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 usar um modelo aninhado, você pode especificar se as expressões de modelo serão avaliadas dentro do escopo do modelo pai ou do próprio modelo aninhado. O escopo determina como os parâmetros, as variáveis e as funções, como resourceGroup e subscription, são resolvidos.