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

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

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

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

Poznámka

U propojených nebo vnořených šablon můžete režim nasazení nastavit pouze na přírůstkové. Hlavní šablonu ale můžete nasadit v úplném režimu. Pokud nasadíte hlavní šablonu v úplném režimu a propojená nebo vnořená šablona cílí na stejnou skupinu prostředků, prostředky nasazené v propojené nebo vnořené šabloně budou zahrnuty do vyhodnocení pro nasazení v úplném režimu. Kombinovaná kolekce prostředků nasazených v hlavní šabloně a propojených nebo vnořených šablon se porovná s existujícími prostředky ve skupině prostředků. Všechny prostředky, které nejsou zahrnuté v této kombinované kolekci, se odstraní.

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

Vnořená šablona

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

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

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

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "storageAccountName": {
      "type": "string"
    }
  },
  "resources": [
    {
      "type": "Microsoft.Resources/deployments",
      "apiVersion": "2020-10-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": "2019-04-01",
              "name": "[parameters('storageAccountName')]",
              "location": "West US",
              "sku": {
                "name": "Standard_LRS"
              },
              "kind": "StorageV2"
            }
          ]
        }
      }
    }
  ],
  "outputs": {
  }
}

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

Při použití vnořené šablony můžete zadat, jestli se výrazy šablony vyhodnotí v rozsahu nadřazené nebo vnořené šablony. Rozsah určuje způsob řešení parametrů, proměnných a funkcí, jako jsou resourceGroup a subscription.

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

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

Poznámka

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

Následující šablona ukazuje, jak jsou řešeny výrazy šablony podle oboru. Obsahuje proměnnou s názvem exampleVar , která je definována v nadřazené šabloně i ve 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": "2020-10-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ěny závisí na hodnotě scope vlastnosti v expressionEvaluationOptions . V následující tabulce jsou uvedeny výsledky pro oba obory.

Rozsah vyhodnocení Výstup
vnořen 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. Rozsah je nastaven na, inner protože dynamicky vytváří ID trezoru klíčů (viz adminPassword.reference.keyVault v vnějších šablonách parameters ) a předává je do vnořené šablony jako parametr.

{
  "$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": "2020-10-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": "2018-06-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": {
  }
}

Buďte opatrní při použití hodnot zabezpečeného parametru ve vnořené šabloně. Pokud nastavíte rozsah na hodnotu vnější, budou zabezpečené hodnoty uloženy jako prostý text v historii nasazení. Uživatel, který si prohlížejí šablonu v historii nasazení, může zobrazit zabezpečené hodnoty. Místo toho použijte vnitřní obor nebo přidejte do nadřazené šablony prostředky, které vyžadují zabezpečené hodnoty.

Následující úryvek ukazuje, které hodnoty jsou zabezpečené a které nejsou bezpečné.

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "adminUsername": {
      "type": "string",
      "metadata": {
        "description": "Username for the Virtual Machine."
      }
    },
    "adminPasswordOrKey": {
      "type": "securestring",
      "metadata": {
        "description": "SSH Key or password for the Virtual Machine. SSH key is recommended."
      }
    }
  },
  ...
  "resources": [
    {
      "type": "Microsoft.Compute/virtualMachines",
      "apiVersion": "2020-06-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": "2020-10-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": "2020-06-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": "2020-10-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": "2020-06-01",
              "name": "inner",
              "properties": {
                ...
                "osProfile": {
                  "computerName": "inner",
                  "adminUsername": "[parameters('adminUsername')]",
                  "adminPassword": "[parameters('adminPasswordOrKey')]" // Yes, secure because resource is in nested template and scope is inner
                }
              }
            }
          ]
        }
      }
    }
  ]
}

Propojená šablona

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

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

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

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

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

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

Výběr nezpracované adresy URL

Poznámka

Pokud chcete nasadit šablonu nebo odkazovat na propojenou šablonu, která je uložená v soukromém úložišti GitHubu, přečtěte si vlastní řešení dokumentované na blogu MVP. Službu Azure Functions můžete nastavit jako proxy a vytvořit tak adresu URL potřebnou pro přístup k souboru šablony v soukromém úložišti GitHub.

Parametry propojené šablony

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

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

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

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

Nemůžete použít vložené parametry i odkaz na soubor parametrů. Nasazení selže s chybou, pokud jsou zadány obě parametersLink parameters možnosti a .

Použít relativní cestu pro propojené šablony

relativePathVlastnost nástroje Microsoft.Resources/deployments usnadňuje tvorbu propojených šablon. Pomocí této vlastnosti lze nasadit vzdálenou propojenou šablonu v umístění relativně k nadřazenému objektu. Tato funkce vyžaduje, aby všechny soubory šablon byly připravené a dostupné na vzdáleném identifikátoru URI, jako je GitHub nebo účet úložiště Azure. Když je hlavní šablona volána pomocí identifikátoru URI z Azure PowerShell nebo rozhraní příkazového řádku Azure CLI, je identifikátor URI podřízeného nasazení kombinací nadřazených a relativePath.

Poznámka

Při vytváření templateSpec jsou všechny šablony, na které vlastnost odkazuje, relativePath zabaleny v prostředku templateSpec pomocí Azure PowerShell nebo Azure CLI. Nevyžadují, aby soubory byly připravené. Další informace najdete v tématu Vytvoření specifikace šablony s propojenými šablonami.

Předpokládejme strukturu složek takto:

relativní cesta k propojené šabloně Resource Manageru

Následující šablona ukazuje, jak mainTemplate.js nasazení nestedChild.jsna obrázku na předchozí imagi.

{
  "$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": "2020-10-01",
      "name": "childLinked",
      "properties": {
        "mode": "Incremental",
        "templateLink": {
          "relativePath": "children/nestedChild.json"
        }
      }
    }
  ],
  "outputs": {}
}

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

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

K nasazení propojených šablon s relativní cestou uloženou v účtu úložiště Azure použijte QueryString / query-string parametr k určení 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í znak "?". Nasazení přidá jednu při sestavování identifikátoru URI pro nasazení.

Specifikace šablon

Místo udržování vašich 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. K udělení přístupu ke specifikaci šablony použijte řízení přístupu na základě role Azure (Azure RBAC). Tato funkce je aktuálně ve verzi Preview.

Další informace naleznete v tématu:

Závislosti

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

{
  "$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": "2020-06-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": "2020-06-01",
      "name": "linkedTemplate2",
      "dependsOn": [
          "[resourceId('Microsoft.Resources/deployments', 'linkedTemplate1')]"
      ],
      "properties": {
        "mode": "Incremental",
        "templateLink": {
          "uri": "[uri(deployment().properties.templateLink.uri, 'secondresources.json')]",
          "contentVersion": "1.0.0.0"
        }
      }
    }
  ]
}

contentVersion

Pro vlastnost nebo nemusíte contentVersion zazadat templateLink parametersLink vlastnost . Pokud nezadáte contentVersion , nasadí se aktuální verze šablony. Pokud zadáte hodnotu verze obsahu, musí odpovídat verzi v propojené šabloně. Jinak nasazení selže s chybou.

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

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

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

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

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

Nakonec použijete proměnnou ve uri vlastnosti templateLink vlastnosti .

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

Pomocí kopírování

Chcete-li vytvořit více instancí prostředku s vnořenou šablonou, přidejte copy element na úrovni Microsoft.Resources/deployments prostředku. Nebo, pokud je rozsah inner , můžete přidat kopii v rámci vnořené šablony.

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

"resources": [
  {
    "type": "Microsoft.Resources/deployments",
    "apiVersion": "2020-10-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": "2019-04-01",
            "name": "[concat(variables('storageName'), copyIndex())]",
            "location": "West US",
            "sku": {
              "name": "Standard_LRS"
            },
            "kind": "StorageV2"
            // Copy works here when scope is inner
            // But, when scope is default or outer, you get an error
            // "copy": {
            //   "name": "storagecopy",
            //   "count": 2
            // }
          }
        ]
      }
    }
  }
]

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

Chcete-li získat výstupní hodnotu z propojené šablony, načtěte hodnotu vlastnosti s syntaxí, jako je: "[reference('deploymentName').outputs.propertyName.value]" .

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

Následující příklady ukazují, jak odkazovat na propojenou šablonu a načíst výstupní hodnotu. Odkazovaná šablona vrátí jednoduchou zprávu. Nejprve odkazovaná Š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ácenou 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": "2020-06-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 prostředku Azure pro tuto 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": "2018-11-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'))]"
        }
    }
}

Chcete-li při nasazování nástroje pro vyrovnávání zatížení použít veřejnou IP adresu z předchozí šablony, připojte se k šabloně a deklarujte závislost na Microsoft.Resources/deployments prostředku. Veřejná IP adresa 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": "2018-11-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": "2020-06-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í

Správce prostředků zpracuje každou šablonu jako samostatné nasazení v historii nasazení. V historii nasazení se zobrazí hlavní šablona se třemi propojenými nebo vnořenými šablonami jako:

Historie nasazení

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

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

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

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

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

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

Nebo skript Azure CLI v prostředí Bash:

#!/bin/bash

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

Zabezpečení externí šablony

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

Soubor parametrů lze také omezit na přístup prostřednictvím tokenu SAS.

V současné době nemůžete vytvořit odkaz na šablonu v účtu úložiště, který je za bránou Azure Storage firewall.

Důležité

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

Následující příklad ukazuje, jak předat token SAS při propojování se šablonou:

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

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

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

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

#!/bin/bash

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

Příklady šablon

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

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

Další kroky