Použití propojené a vnořené šablony při nasazování prostředků Azure

Pokud chcete nasadit složitá řešení, můžete rozdělit šablonu Azure Resource Manager (šablonu ARM) do mnoha souvisejících šablon a pak je společně nasadit prostřednictvím hlavní šablony. Související šablony mohou být samostatné soubory nebo syntaxe šablony, která je vložena do hlavní šablony. Tento článek používá termín propojená šablona k označení samostatného souboru šablony, na který odkazuje odkaz z hlavní šablony. Používá termín vnořená šablona k odkazování na syntaxi vložené šablony v rámci hlavní šablony.

U malých až středních řešení je jednodušší pochopit a spravovat jedinou šablonu. Všechny prostředky a hodnoty vidíte v jednom souboru. Ve složitějších scénářích umožňují propojené šablony rozdělit řešení do specializovaných komponent. Tyto šablony můžete jednoduše opakovaně použít v jiných scénářích.

Kurz najdete v tématu Kurz: Nasazení propojené šablony.

Poznámka

U propojených nebo vnořených šablon můžete režim nasazení nastavit jenom na přírůstkové. Hlavní šablonu je však možné nasadit v úplném režimu. Pokud nasadíte hlavní šablonu v režimu dokončení a propojená nebo vnořená šablona cílí na stejnou skupinu prostředků, prostředky nasazené v propojené nebo vnořené šabloně se zahrnou do vyhodnocení nasazení v úplném režimu. Kombinovaná kolekce prostředků nasazených v hlavní šabloně a propojených nebo vnořených šablonách se porovná s existujícími prostředky ve skupině prostředků. Všechny prostředky, které nejsou součástí této kombinované kolekce, se odstraní.

Pokud propojená nebo vnořená šablona cílí na jinou skupinu prostředků, toto nasazení používá přírůstkový režim.

Tip

Doporučujeme Bicep , protože nabízí stejné funkce jako šablony ARM a syntaxe se snadněji používá. Další informace najdete v modulech.

Vnořená šablona

Pokud chcete vnořit šablonu, přidejte do hlavní šablony prostředek nasazení . template Ve vlastnosti zadejte syntaxi šablony.

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {},
  "variables": {},
  "resources": [
    {
      "type": "Microsoft.Resources/deployments",
      "apiVersion": "2021-04-01",
      "name": "nestedTemplate1",
      "properties": {
        "mode": "Incremental",
        "template": {
          <nested-template-syntax>
        }
      }
    }
  ],
  "outputs": {
  }
}

Následující příklad nasadí účet úložiště prostřednictvím vnořené šablony.

{
  "$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": "2021-04-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": "2021-04-01",
              "name": "[parameters('storageAccountName')]",
              "location": "West US",
              "sku": {
                "name": "Standard_LRS"
              },
              "kind": "StorageV2"
            }
          ]
        }
      }
    }
  ],
  "outputs": {
  }
}

Rozsah vyhodnocení výrazů ve vnořených šablonách

Při použití vnořené šablony můžete zadat, jestli se výrazy šablony vyhodnotí v rozsahu nadřazené nebo vnořené šablony. Obor určuje, jak se přeloží parametry, proměnné a funkce, jako jsou resourceGroup a předplatné .

Obor nastavíte prostřednictvím expressionEvaluationOptions vlastnosti . Ve výchozím nastavení je vlastnost nastavená na outerhodnotu , což znamená, expressionEvaluationOptions že používá obor nadřazené šablony. Nastavte hodnotu na, inner aby se výrazy vyhodnocovaly v rámci rozsahu vnořené šablony.

{
  "type": "Microsoft.Resources/deployments",
  "apiVersion": "2021-04-01",
  "name": "nestedTemplate1",
  "properties": {
    "expressionEvaluationOptions": {
      "scope": "inner"
    },
  ...

Poznámka

Pokud je obor nastavený na outer, nemůžete použít reference funkci v části outputs vnořené šablony pro prostředek, který jste nasadili ve vnořené šabloně. Pokud chcete vrátit hodnoty pro nasazený prostředek ve vnořené šabloně, použijte inner obor nebo převeďte vnořenou šablonu na propojenou šablonu.

Následující šablona ukazuje, jak jsou výrazy šablony vyřešeny v závislosti na rozsahu. Obsahuje proměnnou s názvem exampleVar , která je definována v nadřazené šabloně i vnořené šabloně. Vrátí hodnotu proměnné.

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
  },
  "variables": {
    "exampleVar": "from parent template"
  },
  "resources": [
    {
      "type": "Microsoft.Resources/deployments",
      "apiVersion": "2021-04-01",
      "name": "nestedTemplate1",
      "properties": {
        "expressionEvaluationOptions": {
          "scope": "inner"
        },
        "mode": "Incremental",
        "template": {
          "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
          "contentVersion": "1.0.0.0",
          "variables": {
            "exampleVar": "from nested template"
          },
          "resources": [
          ],
          "outputs": {
            "testVar": {
              "type": "string",
              "value": "[variables('exampleVar')]"
            }
          }
        }
      }
    }
  ],
  "outputs": {
    "messageFromLinkedTemplate": {
      "type": "string",
      "value": "[reference('nestedTemplate1').outputs.testVar.value]"
    }
  }
}

Hodnota se exampleVar mění v závislosti na hodnotě scope vlastnosti v expressionEvaluationOptions. Následující tabulka ukazuje výsledky pro oba obory.

Rozsah vyhodnocení Výstup
Vnitřní z vnořené šablony
vnější (nebo výchozí) z nadřazené šablony

Následující příklad nasadí SQL Server a načte tajný klíč trezoru klíčů, který se použije pro heslo. Obor je nastavený na inner , protože dynamicky vytvoří ID trezoru klíčů (viz adminPassword.reference.keyVault vnější šablony parameters) a předá ho jako parametr do vnořené šablony.

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "location": {
      "type": "string",
      "defaultValue": "[resourceGroup().location]",
      "metadata": {
        "description": "The location where the resources will be deployed."
      }
    },
    "vaultName": {
      "type": "string",
      "metadata": {
        "description": "The name of the keyvault that contains the secret."
      }
    },
    "secretName": {
      "type": "string",
      "metadata": {
        "description": "The name of the secret."
      }
    },
    "vaultResourceGroupName": {
      "type": "string",
      "metadata": {
        "description": "The name of the resource group that contains the keyvault."
      }
    },
    "vaultSubscription": {
      "type": "string",
      "defaultValue": "[subscription().subscriptionId]",
      "metadata": {
        "description": "The name of the subscription that contains the keyvault."
      }
    }
  },
  "resources": [
    {
      "type": "Microsoft.Resources/deployments",
      "apiVersion": "2021-04-01",
      "name": "dynamicSecret",
      "properties": {
        "mode": "Incremental",
        "expressionEvaluationOptions": {
          "scope": "inner"
        },
        "parameters": {
          "location": {
            "value": "[parameters('location')]"
          },
          "adminLogin": {
            "value": "ghuser"
          },
          "adminPassword": {
            "reference": {
              "keyVault": {
                "id": "[resourceId(parameters('vaultSubscription'), parameters('vaultResourceGroupName'), 'Microsoft.KeyVault/vaults', parameters('vaultName'))]"
              },
              "secretName": "[parameters('secretName')]"
            }
          }
        },
        "template": {
          "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
          "contentVersion": "1.0.0.0",
          "parameters": {
            "adminLogin": {
              "type": "string"
            },
            "adminPassword": {
              "type": "securestring"
            },
            "location": {
              "type": "string"
            }
          },
          "variables": {
            "sqlServerName": "[concat('sql-', uniqueString(resourceGroup().id, 'sql'))]"
          },
          "resources": [
            {
              "type": "Microsoft.Sql/servers",
              "apiVersion": "2021-02-01-preview",
              "name": "[variables('sqlServerName')]",
              "location": "[parameters('location')]",
              "properties": {
                "administratorLogin": "[parameters('adminLogin')]",
                "administratorLoginPassword": "[parameters('adminPassword')]"
              }
            }
          ],
          "outputs": {
            "sqlFQDN": {
              "type": "string",
              "value": "[reference(variables('sqlServerName')).fullyQualifiedDomainName]"
            }
          }
        }
      }
    }
  ],
  "outputs": {
  }
}

Při používání hodnot zabezpečených parametrů ve vnořené šabloně buďte opatrní. Pokud nastavíte obor na vnější, budou zabezpečené hodnoty uloženy jako prostý text v historii nasazení. Uživatel, který si šablonu prohlíží v historii nasazení, může zobrazit zabezpečené hodnoty. Místo toho použijte vnitřní obor nebo přidejte do nadřazené šablony prostředky, které potřebují zabezpečené hodnoty.

Následující výňatek ukazuje, které hodnoty jsou zabezpečené a které nejsou zabezpečené.

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "adminUsername": {
      "type": "string",
      "metadata": {
        "description": "Username for the Virtual Machine."
      }
    },
    "adminPasswordOrKey": {
      "type": "securestring",
      "metadata": {
        "description": "SSH Key or password for the Virtual Machine. SSH key is recommended."
      }
    }
  },
  ...
  "resources": [
    {
      "type": "Microsoft.Compute/virtualMachines",
      "apiVersion": "2021-04-01",
      "name": "mainTemplate",
      "properties": {
        ...
        "osProfile": {
          "computerName": "mainTemplate",
          "adminUsername": "[parameters('adminUsername')]",
          "adminPassword": "[parameters('adminPasswordOrKey')]" // Yes, secure because resource is in parent template
        }
      }
    },
    {
      "name": "outer",
      "type": "Microsoft.Resources/deployments",
      "apiVersion": "2021-04-01",
      "properties": {
        "expressionEvaluationOptions": {
          "scope": "outer"
        },
        "mode": "Incremental",
        "template": {
          "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
          "contentVersion": "1.0.0.0",
          "resources": [
            {
              "type": "Microsoft.Compute/virtualMachines",
              "apiVersion": "2021-04-01",
              "name": "outer",
              "properties": {
                ...
                "osProfile": {
                  "computerName": "outer",
                  "adminUsername": "[parameters('adminUsername')]",
                  "adminPassword": "[parameters('adminPasswordOrKey')]" // No, not secure because resource is in nested template with outer scope
                }
              }
            }
          ]
        }
      }
    },
    {
      "name": "inner",
      "type": "Microsoft.Resources/deployments",
      "apiVersion": "2021-04-01",
      "properties": {
        "expressionEvaluationOptions": {
          "scope": "inner"
        },
        "mode": "Incremental",
        "parameters": {
          "adminPasswordOrKey": {
              "value": "[parameters('adminPasswordOrKey')]"
          },
          "adminUsername": {
              "value": "[parameters('adminUsername')]"
          }
        },
        "template": {
          "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
          "contentVersion": "1.0.0.0",
          "parameters": {
            "adminUsername": {
              "type": "string",
              "metadata": {
                "description": "Username for the Virtual Machine."
              }
            },
            "adminPasswordOrKey": {
              "type": "securestring",
              "metadata": {
                "description": "SSH Key or password for the Virtual Machine. SSH key is recommended."
              }
            }
          },
          "resources": [
            {
              "type": "Microsoft.Compute/virtualMachines",
              "apiVersion": "2021-04-01",
              "name": "inner",
              "properties": {
                ...
                "osProfile": {
                  "computerName": "inner",
                  "adminUsername": "[parameters('adminUsername')]",
                  "adminPassword": "[parameters('adminPasswordOrKey')]" // Yes, secure because resource is in nested template and scope is inner
                }
              }
            }
          ]
        }
      }
    }
  ]
}

Propojená šablona

Pokud chcete propojit šablonu, přidejte do hlavní šablony prostředek nasazení . templateLink Ve vlastnosti zadejte identifikátor URI šablony, která se má zahrnout. Následující příklad odkazuje na šablonu, která je v účtu úložiště.

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {},
  "variables": {},
  "resources": [
    {
      "type": "Microsoft.Resources/deployments",
      "apiVersion": "2021-04-01",
      "name": "linkedTemplate",
      "properties": {
        "mode": "Incremental",
        "templateLink": {
          "uri":"https://mystorageaccount.blob.core.windows.net/AzureTemplates/newStorageAccount.json",
          "contentVersion":"1.0.0.0"
        }
      }
    }
  ],
  "outputs": {
  }
}

Při odkazování na propojenou šablonu nemůže být hodnotou uri místní soubor nebo soubor, který je k dispozici pouze ve vaší místní síti. Azure Resource Manager musí mít přístup k šabloně. Zadejte hodnotu identifikátoru URI, která se dá stáhnout jako HTTP nebo HTTPS.

Na šablony můžete odkazovat pomocí parametrů, které zahrnují HTTP nebo HTTPS. Běžným vzorem je například použití parametru _artifactsLocation . Propojenou šablonu můžete nastavit pomocí výrazu, jako je:

"uri": "[concat(parameters('_artifactsLocation'), '/shared/os-disk-parts-md.json', parameters('_artifactsLocationSasToken'))]"

Pokud odkazujete na šablonu v GitHubu, použijte nezpracovanou adresu URL. Odkaz má formát: https://raw.githubusercontent.com/Azure/azure-docs-json-samples/master/get-started-with-templates/quickstart-template/azuredeploy.json. Pokud chcete získat nezpracovaný odkaz, vyberte Nezpracovaný.

Výběr nezpracované adresy URL

Poznámka

Pokud chcete nasadit šablonu nebo odkazovat na propojenou šablonu, která je uložená v privátním úložišti GitHub, projděte si vlastní řešení popsané v tématu Vytvoření vlastní a zabezpečené nabídky webu Azure Portal. Můžete vytvořit funkci Azure, která vytáhne token GitHubu z Azure Key Vault.

Parametry propojené šablony

Parametry propojené šablony můžete zadat buď v externím souboru, nebo v textu. Při poskytování souboru externího parametru parametersLink použijte vlastnost:

"resources": [
  {
    "type": "Microsoft.Resources/deployments",
    "apiVersion": "2021-04-01",
    "name": "linkedTemplate",
    "properties": {
      "mode": "Incremental",
      "templateLink": {
        "uri": "https://mystorageaccount.blob.core.windows.net/AzureTemplates/newStorageAccount.json",
        "contentVersion": "1.0.0.0"
      },
      "parametersLink": {
        "uri": "https://mystorageaccount.blob.core.windows.net/AzureTemplates/newStorageAccount.parameters.json",
        "contentVersion": "1.0.0.0"
      }
    }
  }
]

Pokud chcete předat vložené hodnoty parametrů, použijte parameters vlastnost .

"resources": [
  {
    "type": "Microsoft.Resources/deployments",
    "apiVersion": "2021-04-01",
    "name": "linkedTemplate",
    "properties": {
      "mode": "Incremental",
      "templateLink": {
        "uri": "https://mystorageaccount.blob.core.windows.net/AzureTemplates/newStorageAccount.json",
        "contentVersion": "1.0.0.0"
      },
      "parameters": {
        "storageAccountName": {
          "value": "[parameters('storageAccountName')]"
        }
      }
    }
  }
]

Nemůžete použít vložené parametry ani odkaz na soubor parametrů. Nasazení selže s chybou při zadání obou parametersLinkparameters a.

Použití relativní cesty pro propojené šablony

Vlastnost relativePath usnadňuje vytváření propojených Microsoft.Resources/deployments šablon. Tuto vlastnost lze použít k nasazení vzdálené propojené šablony v umístění relativním k nadřazené. Tato funkce vyžaduje, aby všechny soubory šablon byly připravené a dostupné na vzdáleném identifikátoru URI, jako je GitHub nebo účet úložiště Azure. Pokud je hlavní šablona volána pomocí identifikátoru URI z Azure PowerShell nebo Azure CLI, je podřízený identifikátor URI nasazení kombinací nadřazené a relativní cesty.

Poznámka

Při vytváření šablonySpec se všechny šablony, na které relativePath vlastnost odkazuje, zabalí do prostředku templateSpec pomocí Azure PowerShell nebo Azure CLI. Nevyžaduje, aby byly soubory připravené. Další informace najdete v tématu Vytvoření specifikace šablony pomocí propojených šablon.

Předpokládejme strukturu složek, jako je tato:

Relativní cesta propojené šablony Resource Manageru

Následující šablona ukazuje, jak mainTemplate.json nasazuje vnořenýChild.json znázorněný na předchozím obrázku.

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {},
  "functions": [],
  "variables": {},
  "resources": [
    {
      "type": "Microsoft.Resources/deployments",
      "apiVersion": "2021-04-01",
      "name": "childLinked",
      "properties": {
        "mode": "Incremental",
        "templateLink": {
          "relativePath": "children/nestedChild.json"
        }
      }
    }
  ],
  "outputs": {}
}

V následujícím nasazení je https://raw.githubusercontent.com/Azure/azure-docs-json-samples/master/linked-template-relpath/children/nestedChild.jsonidentifikátor URI propojené šablony v předchozí šabloně .

New-AzResourceGroupDeployment `
  -Name linkedTemplateWithRelativePath `
  -ResourceGroupName "myResourceGroup" `
  -TemplateUri "https://raw.githubusercontent.com/Azure/azure-docs-json-samples/master/linked-template-relpath/mainTemplate.json"

Pokud chcete nasadit propojené šablony s relativní cestou uloženou v účtu úložiště Azure, pomocí parametru QueryString/query-string určete token SAS, který se má použít s parametrem TemplateUri. Tento parametr podporuje jenom Azure CLI verze 2.18 nebo novější a Azure PowerShell verze 5.4 nebo novější.

New-AzResourceGroupDeployment `
  -Name linkedTemplateWithRelativePath `
  -ResourceGroupName "myResourceGroup" `
  -TemplateUri "https://stage20210126.blob.core.windows.net/template-staging/mainTemplate.json" `
  -QueryString $sasToken

Ujistěte se, že v queryString není žádné počáteční "?". Nasazení přidá jeden při sestavení identifikátoru URI pro nasazení.

Specifikace šablon

Místo udržování propojených šablon na přístupném koncovém bodu můžete vytvořit specifikaci šablony , která hlavní šablonu a její propojené šablony zabalí do jediné entity, kterou můžete nasadit. Specifikace šablony je prostředek ve vašem předplatném Azure. Umožňuje snadno bezpečně sdílet šablonu s uživateli ve vaší organizaci. K udělení přístupu ke specifikaci šablony použijete řízení přístupu na základě role v Azure (Azure RBAC). Tato funkce je aktuálně ve verzi Preview.

Další informace naleznete v tématu:

Závislosti

Stejně jako u jiných typů prostředků můžete nastavit závislosti mezi vnořenými nebo propojenými šablonami. Pokud musí být prostředky v jedné vnořené nebo propojené šabloně nasazené před prostředky v druhé vnořené nebo propojené šablony, nastavte druhou šablonu v závislosti na první šabloně.

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {},
  "variables": {},
  "resources": [
    {
      "type": "Microsoft.Resources/deployments",
      "apiVersion": "2021-04-01",
      "name": "linkedTemplate1",
      "properties": {
        "mode": "Incremental",
        "templateLink": {
          "uri": "[uri(deployment().properties.templateLink.uri, 'firstresources.json')]",
          "contentVersion": "1.0.0.0"
        }
      }
    },
    {
      "type": "Microsoft.Resources/deployments",
      "apiVersion": "2021-04-01",
      "name": "linkedTemplate2",
      "dependsOn": [
        "[resourceId('Microsoft.Resources/deployments', 'linkedTemplate1')]"
      ],
      "properties": {
        "mode": "Incremental",
        "templateLink": {
          "uri": "[uri(deployment().properties.templateLink.uri, 'secondresources.json')]",
          "contentVersion": "1.0.0.0"
        }
      }
    }
  ]
}

Verze obsahu

Nemusíte zadávat contentVersion vlastnost pro templateLink vlastnost nebo parametersLink . Pokud nezadáte contentVersion, nasadí se aktuální verze šablony. Pokud zadáte hodnotu verze obsahu, musí se shodovat s verzí v propojené šabloně; jinak nasazení selže s chybou.

Předchozí příklady ukázaly pevně zakódované hodnoty url pro odkazy na šablony. Tento přístup může fungovat pro jednoduchou šablonu, ale nefunguje dobře pro velkou sadu modulárních šablon. Místo toho můžete vytvořit statickou proměnnou, která uloží základní adresu URL hlavní šablony, a pak dynamicky vytvářet adresy URL pro propojené šablony z této základní adresy URL. Výhodou tohoto přístupu je, že šablonu můžete snadno přesunout nebo roz fork, protože potřebujete změnit pouze statickou proměnnou v hlavní šabloně. Hlavní šablona předává v celé rozložené šabloně správné identifikátory URI.

Následující příklad ukazuje, jak použít základní adresu URL k vytvoření dvou adres URL pro propojené šablony (sharedTemplateUrl a vmTemplateUrl).

"variables": {
  "templateBaseUrl": "https://raw.githubusercontent.com/Azure/azure-quickstart-templates/master/application-workloads/postgre/postgresql-on-ubuntu/",
  "sharedTemplateUrl": "[uri(variables('templateBaseUrl'), 'shared-resources.json')]",
  "vmTemplateUrl": "[uri(variables('templateBaseUrl'), 'database-2disk-resources.json')]"
}

Můžete také použít deployment() k získání základní adresy URL aktuální šablony a použít ji k získání adresy URL jiných šablon ve stejném umístění. Tento přístup je užitečný, pokud se umístění šablony změní nebo pokud se chcete vyhnout pevnému kódování adres URL v souboru šablony. Vlastnost templateLink se vrátí pouze při propojení se vzdálenou šablonou pomocí adresy URL. Pokud používáte místní šablonu, tato vlastnost není k dispozici.

"variables": {
  "sharedTemplateUrl": "[uri(deployment().properties.templateLink.uri, 'shared-resources.json')]"
}

Nakonec byste použili proměnnou ve uri vlastnosti templateLink vlastnosti.

"templateLink": {
 "uri": "[variables('sharedTemplateUrl')]",
 "contentVersion":"1.0.0.0"
}

Použití kopírování

Pokud chcete vytvořit více instancí prostředku s vnořenou šablonou, přidejte copy element na úrovni Microsoft.Resources/deployments prostředku. Nebo pokud je innerobor , můžete kopii přidat do vnořené šablony.

Následující příklad šablony ukazuje použití copy s vnořenou šablonou.

"resources": [
  {
    "type": "Microsoft.Resources/deployments",
    "apiVersion": "2021-04-01",
    "name": "[concat('nestedTemplate', copyIndex())]",
    // yes, copy works here
    "copy": {
      "name": "storagecopy",
      "count": 2
    },
    "properties": {
      "mode": "Incremental",
      "expressionEvaluationOptions": {
        "scope": "inner"
      },
      "template": {
        "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
        "contentVersion": "1.0.0.0",
        "resources": [
          {
            "type": "Microsoft.Storage/storageAccounts",
            "apiVersion": "2021-04-01",
            "name": "[concat(variables('storageName'), copyIndex())]",
            "location": "West US",
            "sku": {
              "name": "Standard_LRS"
            },
            "kind": "StorageV2"
            // Copy works here when scope is inner
            // But, when scope is default or outer, you get an error
            // "copy": {
            //   "name": "storagecopy",
            //   "count": 2
            // }
          }
        ]
      }
    }
  }
]

Získání hodnot z propojené šablony

Pokud chcete získat výstupní hodnotu z propojené šablony, načtěte hodnotu vlastnosti pomocí syntaxe, například: "[reference('deploymentName').outputs.propertyName.value]".

Při získávání výstupní vlastnosti z propojené šablony nesmí název vlastnosti obsahovat pomlčku.

Následující příklady ukazují, jak odkazovat na propojenou šablonu a načíst výstupní hodnotu. Propojená šablona vrátí jednoduchou zprávu. Nejprve propojená šablona:

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {},
  "variables": {},
  "resources": [],
  "outputs": {
    "greetingMessage": {
      "value": "Hello World",
      "type": "string"
    }
  }
}

Hlavní šablona nasadí propojenou šablonu a získá vrácenou hodnotu. Všimněte si, že odkazuje na prostředek nasazení podle názvu a používá název vlastnosti vrácené propojenou šablonou.

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {},
  "variables": {},
  "resources": [
    {
      "type": "Microsoft.Resources/deployments",
      "apiVersion": "2021-04-01",
      "name": "linkedTemplate",
      "properties": {
        "mode": "incremental",
        "templateLink": {
          "uri": "[uri(deployment().properties.templateLink.uri, 'helloworld.json')]",
          "contentVersion": "1.0.0.0"
        }
      }
    }
  ],
  "outputs": {
    "messageFromLinkedTemplate": {
      "type": "string",
      "value": "[reference('linkedTemplate').outputs.greetingMessage.value]"
    }
  }
}

Následující příklad ukazuje šablonu, která nasadí veřejnou IP adresu a vrátí ID prostředku Azure pro danou veřejnou IP adresu:

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "publicIPAddresses_name": {
      "type": "string"
    }
  },
  "variables": {},
  "resources": [
    {
      "type": "Microsoft.Network/publicIPAddresses",
      "apiVersion": "2021-02-01",
      "name": "[parameters('publicIPAddresses_name')]",
      "location": "eastus",
      "properties": {
        "publicIPAddressVersion": "IPv4",
        "publicIPAllocationMethod": "Dynamic",
        "idleTimeoutInMinutes": 4
      },
      "dependsOn": []
    }
  ],
  "outputs": {
    "resourceID": {
      "type": "string",
      "value": "[resourceId('Microsoft.Network/publicIPAddresses', parameters('publicIPAddresses_name'))]"
    }
  }
}

Pokud chcete při nasazování nástroje pro vyrovnávání zatížení použít veřejnou IP adresu z předchozí šablony, připojte se k šabloně a deklarujte závislost na Microsoft.Resources/deployments prostředku. Veřejná IP adresa nástroje pro vyrovnávání zatížení je nastavená na výstupní hodnotu z propojené šablony.

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "loadBalancers_name": {
      "defaultValue": "mylb",
      "type": "string"
    },
    "publicIPAddresses_name": {
      "defaultValue": "myip",
      "type": "string"
    }
  },
  "variables": {},
  "resources": [
    {
      "type": "Microsoft.Network/loadBalancers",
      "apiVersion": "2021-02-01",
      "name": "[parameters('loadBalancers_name')]",
      "location": "eastus",
      "properties": {
        "frontendIPConfigurations": [
          {
            "name": "LoadBalancerFrontEnd",
            "properties": {
              "privateIPAllocationMethod": "Dynamic",
              "publicIPAddress": {
                "id": "[reference('linkedTemplate').outputs.resourceID.value]"
              }
            }
          }
        ],
        "backendAddressPools": [],
        "loadBalancingRules": [],
        "probes": [],
        "inboundNatRules": [],
        "outboundNatRules": [],
        "inboundNatPools": []
      },
      "dependsOn": [
        "[resourceId('Microsoft.Resources/deployments', 'linkedTemplate')]"
      ]
    },
    {
      "type": "Microsoft.Resources/deployments",
      "apiVersion": "2021-04-01",
      "name": "linkedTemplate",
      "properties": {
        "mode": "Incremental",
        "templateLink": {
          "uri": "[uri(deployment().properties.templateLink.uri, 'public-ip.json')]",
          "contentVersion": "1.0.0.0"
        },
        "parameters": {
          "publicIPAddresses_name": { "value": "[parameters('publicIPAddresses_name')]" }
        }
      }
    }
  ]
}

Historie nasazení

Resource Manager zpracovává každou šablonu jako samostatné nasazení v historii nasazení. Hlavní šablona se třemi propojenými nebo vnořenými šablonami se zobrazí v historii nasazení jako:

Historie nasazení

Tyto samostatné položky v historii můžete použít k načtení výstupních hodnot po nasazení. Následující šablona vytvoří veřejnou IP adresu a její výstup:

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "publicIPAddresses_name": {
      "type": "string"
    }
  },
  "variables": {},
  "resources": [
    {
      "type": "Microsoft.Network/publicIPAddresses",
      "apiVersion": "2021-02-01",
      "name": "[parameters('publicIPAddresses_name')]",
      "location": "southcentralus",
      "properties": {
        "publicIPAddressVersion": "IPv4",
        "publicIPAllocationMethod": "Static",
        "idleTimeoutInMinutes": 4,
        "dnsSettings": {
          "domainNameLabel": "[concat(parameters('publicIPAddresses_name'), uniqueString(resourceGroup().id))]"
        }
      },
      "dependsOn": []
    }
  ],
  "outputs": {
    "returnedIPAddress": {
      "type": "string",
      "value": "[reference(parameters('publicIPAddresses_name')).ipAddress]"
    }
  }
}

Následující šablona odkazuje na předchozí šablonu. Vytvoří tři veřejné IP adresy.

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
  },
  "variables": {},
  "resources": [
    {
      "type": "Microsoft.Resources/deployments",
      "apiVersion": "2021-04-01",
      "name": "[concat('linkedTemplate', copyIndex())]",
      "copy": {
        "count": 3,
        "name": "ip-loop"
      },
      "properties": {
        "mode": "Incremental",
        "templateLink": {
        "uri": "[uri(deployment().properties.templateLink.uri, 'static-public-ip.json')]",
        "contentVersion": "1.0.0.0"
        },
        "parameters":{
          "publicIPAddresses_name":{"value": "[concat('myip-', copyIndex())]"}
        }
      }
    }
  ]
}

Po nasazení můžete načíst výstupní hodnoty pomocí následujícího skriptu PowerShellu:

$loopCount = 3
for ($i = 0; $i -lt $loopCount; $i++)
{
  $name = 'linkedTemplate' + $i;
  $deployment = Get-AzResourceGroupDeployment -ResourceGroupName examplegroup -Name $name
  Write-Output "deployment $($deployment.DeploymentName) returned $($deployment.Outputs.returnedIPAddress.value)"
}

Nebo skript Azure CLI v prostředí Bash:

#!/bin/bash

for i in 0 1 2;
do
  name="linkedTemplate$i";
  deployment=$(az deployment group show -g examplegroup -n $name);
  ip=$(echo $deployment | jq .properties.outputs.returnedIPAddress.value);
  echo "deployment $name returned $ip";
done

Zabezpečení externí šablony

I když propojená šablona musí být externě dostupná, nemusí být veřejně dostupná. Šablonu můžete přidat do privátního účtu úložiště, ke kterému má přístup jenom vlastník účtu úložiště. Pak vytvoříte token sdíleného přístupového podpisu (SAS), který povolí přístup během nasazení. Tento token SAS přidáte do identifikátoru URI propojené šablony. I když se token předá jako zabezpečený řetězec, protokol URI propojené šablony, včetně tokenu SAS, se zaprotokoluje v operacích nasazení. Pokud chcete omezit riziko ohrožení, nastavte pro token vypršení platnosti.

Soubor parametrů je také možné omezit na přístup prostřednictvím tokenu SAS.

V současné době není možné připojit se k šabloně v účtu úložiště, který je za bránou firewall služby Azure Storage.

Důležité

Místo zabezpečení propojené šablony pomocí tokenu SAS zvažte vytvoření specifikace šablony. Specifikace šablony bezpečně ukládá hlavní šablonu a její propojené šablony jako prostředek ve vašem předplatném Azure. Pomocí Azure RBAC udělíte přístup uživatelům, kteří potřebují šablonu nasadit.

Následující příklad ukazuje, jak při propojování k šabloně předat token SAS:

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "containerSasToken": { "type": "securestring" }
  },
  "resources": [
    {
      "type": "Microsoft.Resources/deployments",
      "apiVersion": "2021-04-01",
      "name": "linkedTemplate",
      "properties": {
        "mode": "Incremental",
        "templateLink": {
          "uri": "[concat(uri(deployment().properties.templateLink.uri, 'helloworld.json'), parameters('containerSasToken'))]",
          "contentVersion": "1.0.0.0"
        }
      }
    }
  ],
  "outputs": {
  }
}

V PowerShellu získáte token pro kontejner a pomocí následujících příkazů nasadíte šablony. Všimněte si, že containerSasToken parametr je definovaný v šabloně. Nejedná se o parametr v New-AzResourceGroupDeployment příkazu .

Set-AzCurrentStorageAccount -ResourceGroupName ManageGroup -Name storagecontosotemplates
$token = New-AzStorageContainerSASToken -Name templates -Permission r -ExpiryTime (Get-Date).AddMinutes(30.0)
$url = (Get-AzStorageBlob -Container templates -Blob parent.json).ICloudBlob.uri.AbsoluteUri
New-AzResourceGroupDeployment -ResourceGroupName ExampleGroup -TemplateUri ($url + $token) -containerSasToken $token

Pro Azure CLI v prostředí Bash získáte token pro kontejner a nasadíte šablony s následujícím kódem:

#!/bin/bash

expiretime=$(date -u -d '30 minutes' +%Y-%m-%dT%H:%MZ)
connection=$(az storage account show-connection-string \
  --resource-group ManageGroup \
  --name storagecontosotemplates \
  --query connectionString)
token=$(az storage container generate-sas \
  --name templates \
  --expiry $expiretime \
  --permissions r \
  --output tsv \
  --connection-string $connection)
url=$(az storage blob url \
  --container-name templates \
  --name parent.json \
  --output tsv \
  --connection-string $connection)
parameter='{"containerSasToken":{"value":"?'$token'"}}'
az deployment group create --resource-group ExampleGroup --template-uri $url?$token --parameters $parameter

Ukázkové šablony

Následující příklady ukazují běžné použití propojených šablon.

Hlavní šablona Propojená šablona Description
Hello World propojená šablona Vrátí řetězec z propojené šablony.
Load Balancer s veřejnou IP adresou propojená šablona Vrátí veřejnou IP adresu z propojené šablony a nastaví ji v nástroji pro vyrovnávání zatížení.
Několik IP adres propojená šablona Vytvoří několik veřejných IP adres v propojené šabloně.

Další kroky