Använda länkade och nästlade mallar vid distribution av Azure-resurser
Om du vill distribuera komplexa lösningar kan du dela Azure Resource Manager mall (ARM-mall) i många relaterade mallar och sedan distribuera dem tillsammans via en huvudmall. De relaterade mallarna kan vara separata filer eller mallsyntax som är inbäddade i huvudmallen. Den här artikeln använder termen länkad mall för att referera till en separat mallfil som refereras via en länk från huvudmallen. Den använder termen kapslad mall för att referera till syntax för inbäddade mallar i huvudmallen.
För små till medelstora lösningar är en enskild mall enklare att förstå och underhålla. Du kan se alla resurser och värden i en enda fil. I avancerade scenarier kan du använda länkade mallar till att dela upp lösningen i riktade komponenter. Du kan enkelt återanvända dessa mallar för andra scenarier.
En självstudie finns i Självstudie: Distribuera en länkad mall.
Anteckning
För länkade eller kapslade mallar kan du bara ställa in distributionsläget på Inkrementell . Huvudmallen kan dock distribueras i fullständigt läge. Om du distribuerar huvudmallen i fullständigt läge och den länkade eller kapslade mallen är inriktad på samma resursgrupp, inkluderas resurserna som distribueras i den länkade eller kapslade mallen i utvärderingen för distribution i fullständigt läge. Den kombinerade samlingen resurser som distribueras i huvudmallen och länkade eller kapslade mallar jämförs med de befintliga resurserna i resursgruppen. Alla resurser som inte ingår i den här kombinerade samlingen tas bort.
Om den länkade eller kapslade mallen är inriktad på en annan resursgrupp använder den distributionen inkrementellt läge.
Kapslad mall
Om du vill kapsla en mall lägger du till en distributionsresurs i huvudmallen. I egenskapen template anger du mallsyntaxen.
{
"$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": {
}
}
I följande exempel distribueras ett lagringskonto via en kapslad mall.
{
"$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": {
}
}
Utvärderingsomfång för uttryck i kapslade mallar
Om du använder en kapslad mall kan du ange om malluttryck ska utvärderas inom omfånget för den överordnade mallen eller den kapslade mallen. Omfånget avgör hur parametrar, variabler och funktioner som resourceGroup och prenumeration matchas.
Du anger omfånget via expressionEvaluationOptions egenskapen . Som standard är egenskapen expressionEvaluationOptions inställd på , vilket innebär att den använder det överordnade outer mallomfånget. Ange värdet till inner för att göra så att uttryck utvärderas inom omfånget för den kapslade mallen.
{
"type": "Microsoft.Resources/deployments",
"apiVersion": "2021-04-01",
"name": "nestedTemplate1",
"properties": {
"expressionEvaluationOptions": {
"scope": "inner"
},
...
Anteckning
När omfånget är inställt på kan du inte använda funktionen i avsnittet utdata i en kapslad mall för en resurs som du har distribuerat i den outer reference kapslade mallen. Om du vill returnera värdena för en distribuerad resurs i en kapslad mall använder du antingen omfång eller konverterar den inner kapslade mallen till en länkad mall.
Följande mall visar hur malluttryck matchas enligt omfånget. Den innehåller en variabel med exampleVar namnet som definieras i både den överordnade mallen och den kapslade mallen. Den returnerar värdet för variabeln .
{
"$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]"
}
}
}
Värdet för exampleVar ändras beroende på värdet för egenskapen i scope expressionEvaluationOptions . I följande tabell visas resultatet för båda omfången.
| Utvärderingsomfång | Utdata |
|---|---|
| Inre | från kapslad mall |
| yttre (eller standard) | från överordnad mall |
I följande exempel distribueras en SQL-server och hämtar en nyckelvalvshemlighet som ska användas för lösenordet. Omfånget är inställt på eftersom det dynamiskt skapar nyckelvalvs-ID:t (se i de yttre mallarna ) och skickar det som en parameter till inner adminPassword.reference.keyVault den parameters kapslade mallen.
{
"$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": {
}
}
Var försiktig när du använder säkra parametervärden i en kapslad mall. Om du anger omfånget till yttre lagras de säkra värdena som oformaterad text i distributionshistoriken. En användare som visar mallen i distributionshistoriken kan se de säkra värdena. Använd i stället det inre omfånget eller lägg till de resurser som behöver säkra värden i den överordnade mallen.
Följande utdrag visar vilka värden som är säkra och vilka som inte är säkra.
{
"$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
}
}
}
]
}
}
}
]
}
Länkad mall
Om du vill länka en mall lägger du till en distributionsresurs i huvudmallen. I egenskapen templateLink anger du mallens URI som ska inkluderas. Följande exempel länkar till en mall som finns i ett lagringskonto.
{
"$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": {
}
}
När du refererar till en länkad mall får värdet för inte vara en lokal fil eller en fil som endast uri är tillgänglig i ditt lokala nätverk. Azure Resource Manager måste kunna komma åt mallen. Ange ett URI-värde som kan laddas ned som HTTP eller HTTPS.
Du kan referera till mallar med hjälp av parametrar som inkluderar HTTP eller HTTPS. Ett vanligt mönster är till exempel att använda _artifactsLocation parametern . Du kan ange den länkade mallen med ett uttryck som:
"uri": "[concat(parameters('_artifactsLocation'), '/shared/os-disk-parts-md.json', parameters('_artifactsLocationSasToken'))]"
Om du länkar till en mall i en GitHub du den råa URL:en. Länken har formatet: https://raw.githubusercontent.com/Azure/azure-docs-json-samples/master/get-started-with-templates/quickstart-template/azuredeploy.json . Hämta raw-länken genom att välja Raw.
Anteckning
Om du vill distribuera en mall eller referera till en länkad mall som är lagrad i en privat GitHub lagrings platsen, se en anpassad lösning som dokumenterats i en MVP-blogg. Du kan konfigurera en Azure-funktion som proxy för att skapa den URL som behövs för att få åtkomst till en mallfil i en privat GitHub-lagrings platsen.
Parametrar för länkad mall
Du kan ange parametrarna för den länkade mallen antingen i en extern fil eller infogade. När du anger en extern parameterfil använder du parametersLink egenskapen :
"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"
}
}
}
]
Om du vill skicka infogade parametervärden använder du parameters egenskapen .
"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')]"
}
}
}
}
]
Du kan inte använda både infogade parametrar och en länk till en parameterfil. Distributionen misslyckas med ett fel när både parametersLink och parameters anges.
Använda relativ sökväg för länkade mallar
Egenskapen relativePath för gör det enklare att skapa länkade Microsoft.Resources/deployments mallar. Den här egenskapen kan användas för att distribuera en fjärransluten länkad mall på en plats i förhållande till den överordnade. Den här funktionen kräver att alla mallfiler mellan lagras och är tillgängliga på en fjärr-URI, till exempel GitHub eller Azure Storage-konto. När huvudmallen anropas med hjälp av en URI från Azure PowerShell eller Azure CLI är den underordnade distributions-URI:en en kombination av överordnad och relativePath.
Anteckning
När du skapar en templateSpec paketeras alla mallar som egenskapen refererar till i relativePath templateSpec-resursen av Azure PowerShell eller Azure CLI. Det kräver inte att filerna mellanfasas. Mer information finns i Skapa en mallspecifikt med länkade mallar.
Anta att mappstrukturen ser ut så här:

Följande mall visar hur mainTemplate.json distribuerar nestedChild.json som illustreras i föregående bild.
{
"$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": {}
}
I följande distribution är URI:en för den länkade mallen i föregående mall 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"
Om du vill distribuera länkade mallar med relativ sökväg som lagras i ett Azure Storage-konto använder du parametern för att ange vilken SAS-token som ska användas med QueryString / query-string parametern TemplateUri. Den här parametern stöds endast av Azure CLI version 2.18 eller senare och Azure PowerShell version 5.4 eller senare.
New-AzResourceGroupDeployment `
-Name linkedTemplateWithRelativePath `
-ResourceGroupName "myResourceGroup" `
-TemplateUri "https://stage20210126.blob.core.windows.net/template-staging/mainTemplate.json" `
-QueryString $sasToken
Kontrollera att det inte finns någon inledande "?" i QueryString. Distributionen lägger till en när du monterar URI:en för distributionerna.
Mallspecifikationer
I stället för att underhålla dina länkade mallar på en tillgänglig slutpunkt kan du skapa en mallspecifikt som paketerar huvudmallen och dess länkade mallar i en enda entitet som du kan distribuera. Mallspecifikationen är en resurs i din Azure-prenumeration. Det gör det enkelt att på ett säkert sätt dela mallen med användare i din organisation. Du använder rollbaserad åtkomstkontroll i Azure (Azure RBAC) för att bevilja åtkomst till mallspecifikationen. Den här funktionen är för närvarande i förhandsversion.
Mer information finns i:
- Självstudie: Skapa en mallspecifikt med länkade mallar.
- Självstudie: Distribuera en mallspecifikt som en länkad mall.
Beroenden
Precis som med andra resurstyper kan du ange beroenden mellan de länkade mallarna. Om resurserna i en länkad mall måste distribueras före resurserna i en andra länkad mall anger du den andra mallen som är beroende av den första.
{
"$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
Du behöver inte ange egenskapen contentVersion för templateLink parametersLink egenskapen eller . Om du inte anger en contentVersion distribueras den aktuella versionen av mallen. Om du anger ett värde för innehållsversion måste det matcha versionen i den länkade mallen. Annars misslyckas distributionen med ett fel.
Använda variabler för att länka mallar
I föregående exempel visades hårdkodade URL-värden för malllänkarna. Den här metoden kan fungera för en enkel mall, men den fungerar inte bra för en stor uppsättning modulära mallar. I stället kan du skapa en statisk variabel som lagrar en bas-URL för huvudmallen och sedan dynamiskt skapa URL:er för de länkade mallarna från den grundläggande URL:en. Fördelen med den här metoden är att du enkelt kan flytta eller föra mallen eftersom du bara behöver ändra den statiska variabeln i huvudmallen. Huvudmallen skickar rätt URI:er i hela den indelade mallen.
I följande exempel visas hur du använder en bas-URL för att skapa två URL:er för länkade mallar ( sharedTemplateUrl och 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')]"
}
Du kan också använda deployment() för att hämta bas-URL:en för den aktuella mallen och använda den för att hämta URL:en för andra mallar på samma plats. Den här metoden är användbar om mallens plats ändras eller om du vill undvika hårdkodning av URL:er i mallfilen. Egenskapen templateLink returneras bara när du länkar till en fjärrmall med en URL. Om du använder en lokal mall är den egenskapen inte tillgänglig.
"variables": {
"sharedTemplateUrl": "[uri(deployment().properties.templateLink.uri, 'shared-resources.json')]"
}
I slutändan skulle du använda variabeln i uri egenskapen för en templateLink egenskap.
"templateLink": {
"uri": "[variables('sharedTemplateUrl')]",
"contentVersion":"1.0.0.0"
}
Använda kopiera
Om du vill skapa flera instanser av en resurs med en kapslad mall lägger copy du till elementet på Microsoft.Resources/deployments resursnivån. Om omfånget är inner kan du lägga till kopian i den kapslade mallen.
Följande exempelmall visar hur du använder med copy en kapslad mall.
"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
// }
}
]
}
}
}
]
Hämta värden från den länkade mallen
Om du vill hämta ett utdatavärde från en länkad mall hämtar du egenskapsvärdet med syntax som: "[reference('deploymentName').outputs.propertyName.value]" .
När du hämtar en utdataegenskap från en länkad mall får egenskapsnamnet inte innehålla ett bindestreck.
Följande exempel visar hur du refererar till en länkad mall och hämtar ett utdatavärde. Den länkade mallen returnerar ett enkelt meddelande. Först den länkade mallen:
{
"$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"
}
}
}
Huvudmallen distribuerar den länkade mallen och hämtar det returnerade värdet. Observera att den refererar till distributionsresursen efter namn och använder namnet på egenskapen som returneras av den länkade mallen.
{
"$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]"
}
}
}
I följande exempel visas en mall som distribuerar en offentlig IP-adress och returnerar resurs-ID:t för Azure-resursen för den offentliga IP-adressen:
{
"$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'))]"
}
}
}
Om du vill använda den offentliga IP-adressen från föregående mall när du distribuerar en lastbalanserare länkar du till mallen och deklarerar ett beroende på Microsoft.Resources/deployments resursen. Den offentliga IP-adressen på lastbalanseraren anges till utdatavärdet från den länkade mallen.
{
"$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')]" }
}
}
}
]
}
Distributionshistorik
Resource Manager bearbetar varje mall som en separat distribution i distributionshistoriken. En huvudmall med tre länkade eller kapslade mallar visas i distributionshistoriken som:

Du kan använda dessa separata poster i historiken för att hämta utdatavärden efter distributionen. Följande mall skapar en offentlig IP-adress och matar ut IP-adressen:
{
"$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]"
}
}
}
Följande mall länkar till föregående mall. Den skapar tre offentliga IP-adresser.
{
"$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())]"}
}
}
}
]
}
Efter distributionen kan du hämta utdatavärdena med följande PowerShell-skript:
$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)"
}
Eller så kan du använda Azure CLI-skript i ett Bash-gränssnitt:
#!/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
Skydda en extern mall
Även om den länkade mallen måste vara externt tillgänglig behöver den inte vara allmänt tillgänglig för allmänheten. Du kan lägga till mallen i ett privat lagringskonto som endast är tillgängligt för lagringskontots ägare. Sedan skapar du en SAS-token (signatur för delad åtkomst) för att aktivera åtkomst under distributionen. Du lägger till denna SAS-token i URI:en för den länkade mallen. Även om token skickas som en säker sträng loggas URI:en för den länkade mallen, inklusive SAS-token, i distributionsåtgärder. Om du vill begränsa exponeringen anger du en förfallotid för token.
Parameterfilen kan också begränsas till åtkomst via en SAS-token.
För närvarande kan du inte länka till en mall i ett lagringskonto som finns bakom en Azure Storage brandvägg.
Viktigt
I stället för att skydda din länkade mall med en SAS-token bör du överväga att skapa en mallspecifikt. Mallspecifikationen lagrar huvudmallen och dess länkade mallar på ett säkert sätt som en resurs i din Azure-prenumeration. Du använder Azure RBAC för att bevilja åtkomst till användare som behöver distribuera mallen.
I följande exempel visas hur du skickar en SAS-token när du länkar till en mall:
{
"$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": {
}
}
I PowerShell får du en token för containern och distribuerar mallarna med följande kommandon. Observera att containerSasToken parametern definieras i mallen. Det är inte en parameter i New-AzResourceGroupDeployment kommandot .
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
För Azure CLI i ett Bash-gränssnitt får du en token för containern och distribuerar mallarna med följande kod:
#!/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
Exempelmallar
I följande exempel visas vanliga användningsområden för länkade mallar.
| Huvudmall | Länkad mall | Description |
|---|---|---|
| Hello World | länkad mall | Returnerar sträng från länkad mall. |
| Load Balancer med offentlig IP-adress | länkad mall | Returnerar offentlig IP-adress från länkad mall och anger det värdet i lastbalanserare. |
| Flera IP-adresser | länkad mall | Skapar flera offentliga IP-adresser i en länkad mall. |
Nästa steg
- Om du vill gå igenom en självstudie kan du gå igenom Självstudie: Distribuera en länkad mall.
- Mer information om hur du definierar distributionsordningen för dina resurser finns i Definiera ordningen för distribution av resurser i ARM-mallar.
- Information om hur du definierar en resurs men skapar många instanser av den finns i Resurs-iteration i ARM-mallar.
- Anvisningar om hur du ställer in en mall i ett lagringskonto och genererar en SAS-token finns i Distribuera resurser med ARM-mallar och Azure PowerShell eller Distribuera resurser med ARM-mallar och Azure CLI.