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 Manageru (šablonu ARM) rozdělit do mnoha souvisejících šablon a pak je nasadit společně prostřednictvím hlavní šablony. Související šablony můžou být samostatné soubory nebo syntaxe šablony vložené do hlavní šablony. Tento článek používá propojenou šablonu termínu odkazující 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 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 pouze na přírůstkové. Hlavní šablonu ale můžete 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 režimu dokončení. Kombinovaná kolekce prostředků nasazených v hlavní šabloně a propojených nebo vnořených šablon se porovnává s existujícími prostředky ve skupině prostředků. Odstraní se všechny prostředky, které nejsou součástí této kombinované kolekce.
Pokud propojená nebo vnořená šablona cílí na jinou skupinu prostředků, použije toto nasazení přírůstkový režim. Další informace najdete v tématu Rozsah nasazení.
Tip
Doporučujeme Bicep, protože nabízí stejné možnosti 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": "2022-09-01",
"name": "nestedTemplate1",
"properties": {
"mode": "Incremental",
"template": {
<nested-template-syntax>
}
}
}
]
}
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",
"defaultValue": "[format('{0}{1}', 'store', uniqueString(resourceGroup().id))]"
},
"location": {
"type": "string",
"defaultValue": "[resourceGroup().location]"
}
},
"resources": [
{
"type": "Microsoft.Resources/deployments",
"apiVersion": "2022-09-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": "2022-09-01",
"name": "[parameters('storageAccountName')]",
"location": "[parameters('location')]",
"sku": {
"name": "Standard_LRS"
},
"kind": "StorageV2"
}
]
}
}
}
]
}
Vnořené prostředky nelze použít v šabloně symbolického názvu . V následující šabloně nemůže prostředek vnořeného účtu úložiště použít symbolický název:
{
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
"languageVersion": "2.0",
"contentVersion": "1.0.0.0",
"parameters": {
"storageAccountName": {
"type": "string",
"defaultValue": "[format('{0}{1}', 'storage', uniqueString(resourceGroup().id))]"
},
"location": {
"type": "string",
"defaultValue": "[resourceGroup().location]"
}
},
"resources": {
"mainStorage": {
"type": "Microsoft.Storage/storageAccounts",
"apiVersion": "2022-09-01",
"name": "[parameters('storageAccountName')]",
"location": "[parameters('location')]",
"sku": {
"name": "Standard_LRS"
},
"kind": "StorageV2"
},
"nestedResource": {
"type": "Microsoft.Resources/deployments",
"apiVersion": "2022-09-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": "2022-09-01",
"name": "[format('{0}nested', parameters('storageAccountName'))]",
"location": "[parameters('location')]",
"sku": {
"name": "Standard_LRS"
},
"kind": "StorageV2"
}
]
}
}
}
}
}
Rozsah vyhodnocení výrazu 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 způsob řešení parametrů, proměnných a funkcí, jako jsou resourceGroup a předplatné .
Obor nastavíte prostřednictvím expressionEvaluationOptions
vlastnosti. Ve výchozím nastavení expressionEvaluationOptions
je vlastnost nastavena na outer
, což znamená, že používá nadřazený obor šablony. Nastavte hodnotu tak, aby inner
se výrazy vyhodnocovaly v rámci oboru vnořené šablony.
Důležité
Pro languageVersion 2.0
, výchozí hodnota vlastnosti expressionEvaluationOptions
je inner
. Hodnota outer
je blokovaná.
{
"type": "Microsoft.Resources/deployments",
"apiVersion": "2022-09-01",
"name": "nestedTemplate1",
"properties": {
"expressionEvaluationOptions": {
"scope": "inner"
},
...
Poznámka:
Pokud je obor nastavený na outer
, nemůžete funkci použít reference
ve výstupní části vnořené šablony pro prostředek, který jste nasadili do vnořené šablony. Pokud chcete vrátit hodnoty nasazeného prostředku v 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 podle oboru. Obsahuje proměnnou s názvem exampleVar
definovanou 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": "2022-09-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 exampleVar
změ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ý tak inner
, ž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": "2022-09-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": "[format('sql-{0}sql', uniqueString(resourceGroup().id, 'sql'))]"
},
"resources": [
{
"type": "Microsoft.Sql/servers",
"apiVersion": "2022-05-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í hodnot zabezpečených parametrů v vnořené šabloně buďte opatrní. Pokud nastavíte obor na vnější, budou hodnoty zabezpečení uloženy jako prostý text v historii nasazení. Uživatel, který si šablonu prohlíží v historii nasazení, může zobrazit hodnoty zabezpečení. 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": "2023-03-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": "2022-09-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": "2023-03-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": "2022-09-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": "2023-03-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 vytvořit propojení šablony, 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": "2022-09-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 hodnota uri
místního souboru ani souboru, který je dostupný jenom v 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í PROTOKOL HTTP nebo HTTPS. Běžným vzorem je například použití parametru _artifactsLocation
. Propojenou šablonu můžete nastavit pomocí výrazu, například:
"uri": "[format('{0}/shared/os-disk-parts-md.json{1}', parameters('_artifactsLocation'), parameters('_artifactsLocationSasToken'))]"
Pokud odkazujete na šablonu na 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ý.
Poznámka:
Pokud chcete nasadit šablonu nebo odkazovat na propojenou šablonu uloženou v privátním úložišti GitHubu, podívejte se na 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á stáhne token GitHubu ze služby Azure Key Vault.
U propojených šablon můžete vnořit nasazení bez symbolického názvu do šablony symbolického názvu nebo vnořit nasazení symbolického názvu do jiné šablony symbolického názvu nebo vnořit nasazení symbolického názvu do jiné šablony symbolického názvu nebo naopak.
Parametry pro propojenou šablonu
Parametry propojené šablony můžete zadat buď v externím souboru, nebo vložené. Při zadávání souboru externích parametrů použijte parametersLink
vlastnost:
"resources": [
{
"type": "Microsoft.Resources/deployments",
"apiVersion": "2022-09-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"
}
}
}
]
Chcete-li předat hodnoty parametrů vložené, použijte parameters
vlastnost.
"resources": [
{
"type": "Microsoft.Resources/deployments",
"apiVersion": "2022-09-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 je zadáno obojí parametersLink
a parameters
je zadáno.
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é pomůcek. Tato funkce vyžaduje, aby byly všechny soubory šablon 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 PowerShellu nebo Azure CLI, je podřízený identifikátor URI nasazení kombinací nadřazeného objektu a relativní cesty.
Poznámka:
Při vytváření šablonYSpec se všechny šablony odkazované vlastností relativePath
zabalí do prostředku templateSpec pomocí Azure PowerShellu nebo Azure CLI. Nevyžadují, aby se soubory fázovaly. Další informace najdete v tématu Vytvoření specifikace šablony s propojenými šablonami.
Předpokládejme strukturu složek, jako je tato:
Následující šablona ukazuje, jak mainTemplate.json nasadí 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": "2022-09-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, použijte QueryString
/query-string
parametr k zadání tokenu 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 řetězci QueryString není žádná úvodní "?" . Nasazení přidá jeden při sestavení identifikátoru URI pro nasazení.
Specifikace šablon
Místo údržby propojených šablon v přístupném koncovém bodu můžete vytvořit specifikaci šablony, která zabalí hlavní šablonu a její propojené šablony 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. Pomocí řízení přístupu na základě role v Azure (Azure RBAC) udělíte přístup ke specifikaci šablony.
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 vnořenými nebo propojenými šablonami. Pokud se prostředky v jedné vnořené nebo propojené šabloně musí nasadit před prostředky v druhé vnořené nebo propojené šabloně, nastavte druhou šablonu, která je závislá na první.
{
"$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
Vlastnost ani parametersLink
vlastnost templateLink
nemusíte zadávatcontentVersion
. Pokud nezadáte contentVersion
šablonu, nasadí se aktuální verze šablony. Pokud zadáte hodnotu pro verzi 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 pevně zakódované hodnoty url pro odkazy š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 pro propojené šablony z této základní adresy URL. Výhodou tohoto přístupu je, že šablonu můžete snadno přesunout nebo rozvětvovat, 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 (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')]"
}
Pomocí metody deployment() můžete získat základní adresu URL aktuální šablony a použít ji k získání adresy URL pro jiné š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ě kódovacím adresám URL v souboru šablony. Vlastnost templateLink
se vrátí pouze při propojení se vzdálenou šablonou s adresou 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 proměnnou použili 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
prvek na úrovni Microsoft.Resources/deployments
prostředku. Nebo pokud je inner
obor , můžete přidat kopii v rámci vnořené šablony.
Následující příklad šablony ukazuje, jak se používá copy
s vnořenou šablonou.
"resources": [
{
"type": "Microsoft.Resources/deployments",
"apiVersion": "2022-09-01",
"name": "[format('nestedTemplate{0}', 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": "2022-09-01",
"name": "[format('{0}{1}', 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 s syntaxí, 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, propojte ji se šablonou a deklarujte závislost na Microsoft.Resources/deployments
prostředku. Veřejná IP adresa v nástroji 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:
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 vypíše IP adresu:
{
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"parameters": {
"publicIPAddresses_name": {
"type": "string"
},
"location": {
"type": "string",
"defaultValue": "[resourceGroup().location]"
}
},
"variables": {},
"resources": [
{
"type": "Microsoft.Network/publicIPAddresses",
"apiVersion": "2023-04-01",
"name": "[parameters('publicIPAddresses_name')]",
"location": "[parameters('location')]",
"properties": {
"publicIPAddressVersion": "IPv4",
"publicIPAllocationMethod": "Static",
"idleTimeoutInMinutes": 4,
"dnsSettings": {
"domainNameLabel": "[format('{0}{1}', 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": "2022-09-01",
"name": "[format('linkedTemplate{0}', 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": "[format('myip-{0}', 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ý jenom vlastníkovi účtu úložiště. Potom 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, zaprotokoluje se v operacích nasazení identifikátor URI propojené šablony, včetně tokenu SAS. Pokud chcete omezit vystavení, nastavte pro token vypršení platnosti.
Soubor parametrů může být také omezen na přístup prostřednictvím tokenu SAS.
V současné době nemůžete vytvořit propojení se šablonou 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. Azure RBAC použijete k udělení přístupu uživatelům, kteří potřebují nasadit šablonu.
Následující příklad ukazuje, jak předat token SAS při propojení 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": "2022-09-01",
"name": "linkedTemplate",
"properties": {
"mode": "Incremental",
"templateLink": {
"uri": "[format('{0}{1}', 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 si, že containerSasToken
parametr je definován 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 | Popis |
---|---|---|
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í danou 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 chcete projít kurzem, přečtě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í nasazení prostředků v šablonách ARM.
- Informace o tom, jak definovat jeden prostředek, ale vytvořit mnoho instancí, najdete v tématu Iterace prostředků v šablonách ARM.
- Postup nastavení šablony v účtu úložiště a generování tokenu SAS najdete v tématu Nasazení prostředků pomocí šablon ARM a Azure PowerShellu nebo nasazení prostředků pomocí šablon ARM a Azure CLI.