Použití propojené a vnořené šablony při nasazování prostředků Azure
Pokud chcete nasadit složitá řešení, můžete šablonu Azure Resource Manager (šablonu ARM) rozdělit 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 šablon, které jsou vloženy do hlavní šablony. Tento článek používá termín propojená šablona k odkazování na samostatný soubor šablony, na který odkazuje odkaz z hlavní šablony. Používá termín vnořená šablona k odkazování na vloženou syntaxi šablony v hlavní šabloně.
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 pouze na přírůstkové. Hlavní šablonu ale můžete nasadit v úplném režimu. Pokud nasadíte hlavní šablonu v úplném režimu a propojená nebo vnořená šablona cílí na stejnou skupinu prostředků, prostředky nasazené v propojené nebo vnořené šabloně budou zahrnuty do vyhodnocení pro nasazení v úplném režimu. Kombinovaná kolekce prostředků nasazených v hlavní šabloně a propojených nebo vnořených šablon se porovná s existujícími prostředky ve skupině prostředků. Všechny prostředky, které nejsou zahrnuté v této kombinované kolekci, se odstraní.
Pokud propojená nebo vnořená šablona cílí na jinou skupinu prostředků, toto nasazení používá přírůstkový režim.
Vnořená šablona
Pokud chcete šablonu vnořit, přidejte do hlavní šablony prostředek nasazení. Ve template 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": {
}
}
Obor 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. Rozsah určuje způsob řešení parametrů, proměnných a funkcí, jako jsou resourceGroup a subscription.
Obor nastavíte prostřednictvím expressionEvaluationOptions vlastnosti . Ve výchozím nastavení expressionEvaluationOptions je vlastnost nastavená na outer , což znamená, že používá nadřazený obor šablony. Nastavte hodnotu na inner , aby se výrazy vyhodnotili v rámci oboru vnořené šablony.
{
"type": "Microsoft.Resources/deployments",
"apiVersion": "2021-04-01",
"name": "nestedTemplate1",
"properties": {
"expressionEvaluationOptions": {
"scope": "inner"
},
...
Poznámka
Pokud je obor nastavený na , nemůžete použít funkci v oddílu výstupů vnořené šablony pro prostředek, který jste nasadili outer reference ve vnořené šabloně. Pokud chcete vrátit hodnoty nasazeného prostředku ve vnořené šabloně, použijte obor nebo převeďte vnořenou šablonu inner na propojenou šablonu.
Následující šablona ukazuje, jak se výrazy šablony řeší podle oboru. Obsahuje proměnnou s názvem exampleVar , která je definována v nadřazené 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 změní v závislosti na hodnotě vlastnosti v scope expressionEvaluationOptions . V následující tabulce jsou uvedeny výsledky pro oba rozsahy.
| Obor vyhodnocení | Výstup |
|---|---|
| Vnitřní | z vnořené šablony |
| outer (nebo výchozí) | z nadřazené šablony |
Následující příklad nasadí SQL serveru a načte tajný klíč trezoru klíčů, který se použije pro heslo. Obor je nastavený na , protože dynamicky vytvoří ID trezoru klíčů (viz vnější šablony ) a předá ho jako parametr inner adminPassword.reference.keyVault parameters vnořené šabloně.
{
"$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žití zabezpečených hodnot parametrů ve vnořené šabloně buďte opatrní. Pokud nastavíte rozsah na vnější, zabezpečené hodnoty se uloží jako prostý text v historii nasazení. Uživatel, který si šablonu prohlíží v historii nasazení, může vidět hodnoty zabezpečení. Místo toho použijte vnitřní obor nebo do nadřazené šablony přidejte prostředky, které potřebují zabezpečené hodnoty.
Následující úryvek ukazuje, které hodnoty jsou zabezpečené a které nejsou bezpečné.
{
"$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 šablonu propojit, přidejte do hlavní šablony prostředek nasazení. Ve templateLink 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 místní soubor nebo soubor, který je k dispozici uri pouze v místní síti. Azure Resource Manager mít přístup k šabloně. Zadejte hodnotu identifikátoru URI, kterou si můžete 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í _artifactsLocation parametru . Propojenou šablonu můžete nastavit pomocí výrazu, jako je:
"uri": "[concat(parameters('_artifactsLocation'), '/shared/os-disk-parts-md.json', parameters('_artifactsLocationSasToken'))]"
Pokud na šablonu v nástroji GitHub, použijte nezpracovanou adresu URL. Odkaz má tento formát: https://raw.githubusercontent.com/Azure/azure-docs-json-samples/master/get-started-with-templates/quickstart-template/azuredeploy.json . Nezpracovaný odkaz získáte tak, že vyberete Raw.
Poznámka
Pokud chcete nasadit šablonu nebo odkazovat na propojenou šablonu, která je uložená v soukromém úložišti GitHubu, přečtěte si vlastní řešení dokumentované na blogu MVP. Službu Azure Functions můžete nastavit jako proxy a vytvořit tak adresu URL potřebnou pro přístup k souboru šablony v soukromém úložišti GitHub.
Parametry propojené šablony
Parametry propojené šablony můžete zadat buď v externím souboru, nebo v vloženém souboru. Při poskytování externího souboru parametrů použijte parametersLink 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 i odkaz na soubor parametrů. Nasazení selže s chybou, pokud jsou zadány obě parametersLink parameters možnosti a .
Použití relativní cesty pro propojené šablony
Vlastnost relativePath usnadňuje Microsoft.Resources/deployments vytváření propojených šablon. Tuto vlastnost lze použít k nasazení vzdálené propojené šablony v umístění relativním vzhledem k nadřazené šabloně. Tato funkce vyžaduje, aby všechny soubory šablon byly chyscené a dostupné na vzdáleném identifikátoru URI, jako je GitHub nebo účet úložiště Azure. Při volání hlavní šablony 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í templateSpec se všechny šablony odkazované vlastností zabalí do prostředku relativePath templateSpec Azure PowerShell nebo Azure CLI. Nevyžaduje, aby se soubory zfektoval. Další informace najdete v tématu Vytvoření specifikace šablony pomocí propojených šablon.
Předpokládejme strukturu složek, jako je tato:

Následující šablona ukazuje, jak soubor mainTemplate.json nasazovat soubor nestedChild.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 identifikátor URI propojené šablony v předchozí šabloně https://raw.githubusercontent.com/Azure/azure-docs-json-samples/master/linked-template-relpath/children/nestedChild.json .
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 zadejte token SAS, který se má použít QueryString / query-string s parametrem TemplateUri. Tento parametr podporuje pouze 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 řetězec dotazu nemá žádný úvodní řetězec "?" . Nasazení ho přidá při sestavování identifikátoru URI pro nasazení.
Specifikace šablon
Místo udržování propojených šablon v přístupném koncovém bodě můžete vytvořit specifikace šablony, která za balíček hlavní šablony a jejích propojených šablon do jedné entity, kterou můžete nasadit. Specifikace šablony je prostředek ve vašem předplatném Azure. Usnadňuje bezpečné sdílení šablony s uživateli ve vaší organizaci. K udělení přístupu ke specifikacím šablon 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:
- Kurz: Vytvoření specifikace šablony s propojenými šablonami
- Kurz: Nasazení specifikace šablony jako propojené šablony
Závislosti
Stejně jako u jiných typů prostředků můžete nastavit závislosti mezi propojenými šablonami. Pokud prostředky v jedné propojené šabloně musí být nasazeny před prostředky ve druhé propojené šabloně, nastavte druhou šablonu, která závisí 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"
}
}
}
]
}
contentVersion
Pro vlastnost nebo nemusíte contentVersion zazadat templateLink parametersLink vlastnost . 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.
Použití proměnných k propojení šablon
Předchozí příklady ukázaly hodnoty pevné adresy 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á ukládá základní adresu URL hlavní šablony, a pak dynamicky vytvářet adresy URL propojených šablon z této základní adresy URL. Výhodou tohoto přístupu je, že šablonu můžete snadno přesunout nebo vytvořit fork, protože potřebujete změnit pouze statickou proměnnou v hlavní šabloně. Hlavní šablona předává správné identifikátory URI v celé rozložené šabloně.
Následující příklad ukazuje, jak pomocí základní adresy URL vytvořit dvě adresy URL pro propojené šablony ( a sharedTemplateUrl 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 pro aktuální šablonu a použít ji k získání adresy URL pro ostatní šablony ve stejném umístění. Tento přístup je užitečný, pokud se umístění šablony změní nebo se chcete vyhnout pevnému kódování adres URL v souboru šablony. Vlastnost templateLink se vrátí pouze při odkazování na vzdálenou šablonu s adresou URL. Pokud používáte místní šablonu, není tato vlastnost dostupná.
"variables": {
"sharedTemplateUrl": "[uri(deployment().properties.templateLink.uri, 'shared-resources.json')]"
}
Nakonec použijete proměnnou ve uri vlastnosti templateLink vlastnosti .
"templateLink": {
"uri": "[variables('sharedTemplateUrl')]",
"contentVersion":"1.0.0.0"
}
Pomocí 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 obor inner , můžete přidat kopii v rámci vnořené šablony.
Následující příklad šablony ukazuje, jak použít s copy 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 se syntaxí, jako je . "[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 tyto veřejné IP adresy:
{
"$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, odkazujte na šablonu 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 zpracuje každou šablonu jako samostatné nasazení v historii nasazení. Hlavní šablona se třemi propojenými nebo vnořenými šablonami se v historii nasazení zobrazí takto:

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 jako výstup vytvoří 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": "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 obecně dostupná pro veřejnost. Šablonu můžete přidat do privátního účtu úložiště, který je přístupný pouze vlastníkovi účtu úložiště. Pak vytvoříte token sdíleného přístupového podpisu (SAS), který během nasazování povolí přístup. Tento token SAS přidáte do identifikátoru URI propojené šablony. I když se token předá jako zabezpečený řetězec, v operacích nasazení se zaprotokoluje identifikátor URI propojené šablony, včetně tokenu SAS. Pokud chcete omezit vystavení, nastavte vypršení platnosti tokenu.
Soubor parametrů lze také omezit na přístup prostřednictvím tokenu SAS.
V současné době nemůžete vytvořit odkaz na šablonu v účtu úložiště, který je za bránou Azure Storage firewall.
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ředat token SAS při propojování se šablonou:
{
"$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 nasadíte šablony pomocí následujících příkazů. Všimněte containerSasToken si, že parametr je definován v šabloně. Není to 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
Příklady šablon
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í hodnotu 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
- Pokud si chcete projít kurz, projděte si kurz: Nasazení propojené šablony.
- Další informace o definování pořadí nasazení pro vaše prostředky najdete v tématu Definování pořadí nasazování prostředků v šablonách ARM.
- Informace o tom, jak definovat jeden prostředek, ale vytvořit mnoho jeho instancí, najdete v tématu Iterace prostředků v šablonách ARM.
- Postup nastavení šablony v účtu úložiště a vygenerování tokenu SAS najdete v tématu Nasazení prostředků pomocí šablon ARM a Azure PowerShell nebo Nasazení prostředků pomocí šablon ARM a Azure CLI.