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ý.

Screenshot of selecting raw URL in GitHub.

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:

Diagram showing folder structure for Resource Manager linked template relative path.

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:

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.

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 innerobor , 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:

Screenshot of deployment history in Azure portal.

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