Kapcsolt és beágyazott sablonok használata Azure-erőforrások üzembe helyezésekor

Összetett megoldások üzembe helyezéséhez az Azure Resource Manager-sablont (ARM-sablont) számos kapcsolódó sablonra bonthatja, majd egy fő sablonon keresztül együtt helyezheti üzembe őket. A kapcsolódó sablonok lehetnek különálló fájlok vagy sablonszintaxisok, amelyek a fő sablonba ágyazódnak. Ez a cikk a csatolt sablon kifejezéssel hivatkozik egy külön sablonfájlra, amelyre a fő sablon hivatkozása hivatkozik. A beágyazott sablon kifejezés használatával hivatkozik a beágyazott sablon szintaxisára a fő sablonban.

Kis és közepes mérető megoldások esetében könnyebb egyetlen sablont megérteni és karbantartani. Így az összes erőforrás és értéke egyetlen fájlban látható. Speciális felhasználási helyzetekben a megoldás csatolt sablonokkal bontható fel a kívánt összetevőkre. Az ilyen sablonok egyszerűen felhasználhatók újra más helyzetekben.

Oktatóanyagért lásd : Oktatóanyag: Csatolt sablon üzembe helyezése.

Feljegyzés

Csatolt vagy beágyazott sablonok esetén az üzembe helyezési módot csak növekményesre állíthatja. A fő sablon azonban teljes módban üzembe helyezhető. Ha a fő sablont teljes módban helyezi üzembe, és a csatolt vagy beágyazott sablon ugyanazt az erőforráscsoportot célozza meg, a csatolt vagy beágyazott sablonban üzembe helyezett erőforrások a teljes módú üzembe helyezés kiértékelése részét képezik. A fő sablonban üzembe helyezett erőforrások és a csatolt vagy beágyazott sablonok együttes gyűjteményét összehasonlítjuk az erőforráscsoport meglévő erőforrásaival. A kombinált gyűjteményben nem szereplő erőforrások törlődnek.

Ha a csatolt vagy beágyazott sablon egy másik erőforráscsoportot céloz meg, az üzembe helyezés növekményes módot használ. További információ: Üzembehelyezési hatókör.

Tipp.

A Bicep használatát javasoljuk, mert ugyanazokkal a képességekkel rendelkezik, mint az ARM-sablonok, és a szintaxis használata egyszerűbb. További információkért tekintse meg a modulokat.

Beágyazott sablon

Sablon beágyazásához adjon hozzá egy üzembehelyezési erőforrást a fő sablonhoz. A tulajdonságban template adja meg a sablon szintaxisá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": "nestedTemplate1",
      "properties": {
        "mode": "Incremental",
        "template": {
          <nested-template-syntax>
        }
      }
    }
  ]
}

Az alábbi példa egy tárfiókot helyez üzembe beágyazott sablonon keresztül.

{
  "$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"
            }
          ]
        }
      }
    }
  ]
}

A beágyazott erőforrások nem használhatók szimbolikus névsablonokban. A következő sablonban a beágyazott tárfiók-erőforrás nem használhat szimbolikus nevet:

{
  "$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"
            }
          ]
        }
      }
    }
  }
}

Kifejezés-kiértékelési hatókör beágyazott sablonokban

Beágyazott sablon használatakor megadhatja, hogy a sablonkifejezések a szülősablon vagy a beágyazott sablon hatókörében legyenek kiértékelve. A hatókör határozza meg a paraméterek, változók és függvények, például a resourceGroup és az előfizetés feloldásának módját.

A hatókört a expressionEvaluationOptions tulajdonságon keresztül állíthatja be. Alapértelmezés szerint a expressionEvaluationOptions tulajdonság értéke outera szülősablon hatókörét használja. Állítsa be az értéket úgy, inner hogy a kifejezések kiértékelése a beágyazott sablon hatókörén belül legyen.

Fontos

A languageVersion 2.0tulajdonság alapértelmezett értéke expressionEvaluationOptions a következő inner: . Az érték outer le van tiltva.

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

Feljegyzés

Ha a hatókör be van állítva outer, nem használhatja a reference függvényt a beágyazott sablonban üzembe helyezett erőforrás beágyazott sablon kimeneti szakaszában. Ha egy beágyazott sablonban üzembe helyezett erőforrás értékeit szeretné visszaadni, használja inner a hatókört, vagy konvertálja a beágyazott sablont csatolt sablonná.

Az alábbi sablon bemutatja, hogyan oldhatók fel a sablonkifejezések a hatókörnek megfelelően. A szülősablonban és a beágyazott sablonban is definiált változót exampleVar tartalmaz. A változó értékét adja vissza.

{
  "$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]"
    }
  }
}

A változások értéke exampleVar a tulajdonság értékétől függően a scope következőben expressionEvaluationOptions: . Az alábbi táblázat mindkét hatókör eredményeit mutatja.

Kiértékelés hatóköre Hozam
Belső beágyazott sablonból
külső (vagy alapértelmezett) szülősablonból

Az alábbi példa üzembe helyez egy SQL Servert, és lekéri a jelszóhoz használandó kulcstartó titkos kulcsát. A hatókör azért van beállítva inner , mert dinamikusan hozza létre a kulcstartó azonosítóját (lásd adminPassword.reference.keyVault a külső sablonokban parameters), és paraméterként továbbítja a beágyazott sablonnak.

{
  "$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": {
  }
}

Ügyeljen arra, hogy biztonságos paraméterértékeket használjon beágyazott sablonban. Ha külsőre állítja a hatókört, a biztonságos értékek egyszerű szövegként lesznek tárolva az üzembe helyezési előzményekben. A sablont az üzembe helyezési előzményekben megtekintő felhasználók láthatják a biztonságos értékeket. Ehelyett használja a belső hatókört, vagy adja hozzá a szülősablonhoz a biztonságos értékeket igénylő erőforrásokat.

Az alábbi részlet azt mutatja be, hogy mely értékek biztonságosak, és melyek nem biztonságosak.

{
  "$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
                }
              }
            }
          ]
        }
      }
    }
  ]
}

Csatolt sablon

Sablon csatolásához adjon hozzá egy üzembehelyezési erőforrást a fő sablonhoz. A tulajdonságban templateLink adja meg a belefoglalandó sablon URI-ját. Az alábbi példa egy tárfiókban lévő sablonra mutat.

{
  "$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": {
  }
}

Csatolt sablonra való hivatkozáskor az érték uri nem lehet helyi fájl vagy olyan fájl, amely csak a helyi hálózaton érhető el. Az Azure Resource Managernek hozzá kell tudnia férni a sablonhoz. Adjon meg egy HTTP-ként vagy HTTPS-ként letölthető URI-értéket.

Http- vagy HTTPS-paraméterekkel hivatkozhat sablonokra. Gyakori példa például a _artifactsLocation paraméter használata. A csatolt sablont a következőhöz hasonló kifejezéssel állíthatja be:

"uri": "[format('{0}/shared/os-disk-parts-md.json{1}', parameters('_artifactsLocation'), parameters('_artifactsLocationSasToken'))]"

Ha sablonra hivatkozik a GitHubon, használja a nyers URL-címet. A hivatkozás formátuma: https://raw.githubusercontent.com/Azure/azure-docs-json-samples/master/get-started-with-templates/quickstart-template/azuredeploy.json. A nyers hivatkozás lekéréséhez válassza a Nyers lehetőséget.

Screenshot of selecting raw URL in GitHub.

Feljegyzés

Ha sablont szeretne üzembe helyezni, vagy egy privát GitHub-adattárban tárolt csatolt sablonra szeretne hivatkozni, tekintse meg az Egyéni és biztonságos Azure Portal-ajánlat létrehozása című témakörben dokumentált egyéni megoldást. Létrehozhat egy Azure-függvényt , amely lekéri a GitHub-jogkivonatot az Azure Key Vaultból.

Csatolt sablonok esetén beágyazhat egy nem szimbolikus névvel rendelkező üzembe helyezést egy szimbolikus névsablonba, vagy egy szimbolikus névvel rendelkező üzembe helyezést egy nem szimbolikus sablonba, vagy egy szimbolikus névvel rendelkező sablonba ágyazhat be egy szimbolikus névalapú üzembe helyezést, vagy fordítva.

Csatolt sablon paraméterei

A csatolt sablon paramétereit külső fájlban vagy beágyazott fájlban is megadhatja. Külső paraméterfájl megadásakor használja a tulajdonságot parametersLink :

"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"
      }
    }
  }
]

A paraméterértékek beágyazott átadásához használja a tulajdonságot parameters .

"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 használhat beágyazott paramétereket és paraméterfájlra mutató hivatkozást. Az üzembe helyezés sikertelen, ha mindkettő parametersLinkparameters meg van adva.

Relatív elérési út használata csatolt sablonokhoz

A relativePath tulajdonság Microsoft.Resources/deployments megkönnyíti a csatolt sablonok készítését. Ez a tulajdonság a szülőhöz képest egy távoli csatolt sablon üzembe helyezésére használható. Ez a funkció megköveteli, hogy az összes sablonfájlt egy távoli URI-n, például a GitHubon vagy az Azure Storage-fiókban lehessen létrehozni és elérhetővé tenni. Amikor a fő sablont az Azure PowerShell vagy az Azure CLI URI-jának használatával hívjuk meg, a gyermektelepítési URI a szülő és a relatívPath kombinációja.

Feljegyzés

A templateSpec létrehozásakor a tulajdonság által hivatkozott sablonokat az relativePath Azure PowerShell vagy az Azure CLI csomagolja a templateSpec erőforrásba. Nincs szükség a fájlok előkészítésére. További információ: Sablon-specifikáció létrehozása csatolt sablonokkal.

Tegyük fel, hogy a mappastruktúra a következőhöz hasonló:

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

Az alábbi sablon bemutatja, hogyan helyezi üzembe mainTemplate.json az előző képen látható nestedChild.json.

{
  "$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": {}
}

Az alábbi üzembe helyezés során a hivatkozott sablon URI-ja az előző sablonban található 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"

Az Azure Storage-fiókban tárolt relatív elérési úttal rendelkező csatolt sablonok üzembe helyezéséhez a QueryString/query-string paraméterrel adja meg a TemplateUri paraméterrel használni kívánt SAS-jogkivonatot. Ezt a paramétert csak az Azure CLI 2.18-as vagy újabb verziója és az Azure PowerShell 5.4-es vagy újabb verziója támogatja.

New-AzResourceGroupDeployment `
  -Name linkedTemplateWithRelativePath `
  -ResourceGroupName "myResourceGroup" `
  -TemplateUri "https://stage20210126.blob.core.windows.net/template-staging/mainTemplate.json" `
  -QueryString $sasToken

Győződjön meg arról, hogy nincs bevezető "?" a QueryStringben. Az üzembe helyezés hozzáad egyet az üzembe helyezések URI-jának összeállításakor.

Sablonspecifikációk

Ahelyett, hogy akadálymentes végponton tartná fenn a csatolt sablonokat, létrehozhat egy sablon-specifikációt, amely a fő sablont és annak csatolt sablonjait egyetlen üzembe helyezhető entitásba csomagolja. A sablon specifikációja az Azure-előfizetés egyik erőforrása. Ez megkönnyíti a sablon biztonságos megosztását a szervezet felhasználóival. Az Azure szerepköralapú hozzáférés-vezérlés (Azure RBAC) használatával biztosít hozzáférést a sablon specifikációihoz.

További információkért lásd:

Függőségek

Más erőforrástípusokhoz hasonlóan a beágyazott/csatolt sablonok közötti függőségeket is beállíthatja. Ha egy beágyazott/csatolt sablon erőforrásait a második beágyazott/csatolt sablon erőforrásai előtt kell üzembe helyezni, állítsa be a második sablont az elsőtől függően.

{
  "$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

Nem kell megadnia a tulajdonságot vagy a contentVersiontemplateLinkparametersLink tulajdonságot. Ha nem ad meg, contentVersiona sablon aktuális verziója lesz üzembe helyezve. Ha értéket ad meg a tartalomverzióhoz, annak meg kell egyeznie a csatolt sablonban szereplő verzióval; ellenkező esetben az üzembe helyezés hiba miatt meghiúsul.

Az előző példák a sablonhivatkozások nehezen kódolt URL-értékeit mutatták. Ez a megközelítés egy egyszerű sablonhoz használható, de nem működik jól a moduláris sablonok nagy csoportjához. Ehelyett létrehozhat egy statikus változót, amely a fő sablonhoz tartozó alap URL-címet tárolja, majd dinamikusan létrehozza a csatolt sablonok URL-címeit az adott alap URL-címből. Ennek a megközelítésnek az az előnye, hogy egyszerűen áthelyezheti vagy elágazhatja a sablont, mert csak a fő sablon statikus változóját kell módosítania. A fő sablon a megfelelő URI-kat továbbítja a felbontott sablonban.

Az alábbi példa bemutatja, hogyan hozhat létre két URL-címet csatolt sablonokhoz (sharedTemplateUrl és 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')]"
}

Az üzembe helyezés(ek) használatával lekérheti az aktuális sablon alap URL-címét, és ezzel lekérheti az ugyanazon a helyen található más sablonok URL-címét. Ez a módszer akkor hasznos, ha a sablon helye megváltozik, vagy el szeretné kerülni a sablonfájlban lévő, kemény kódolású URL-címek használatát. A templateLink tulajdonság csak akkor lesz visszaadva, ha egy távoli sablonra hivatkozik URL-címmel. Ha helyi sablont használ, az a tulajdonság nem érhető el.

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

Végső soron egy tulajdonság tulajdonságában használná a uri változót templateLink .

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

Másolás használata

Ha több erőforráspéldányt szeretne létrehozni beágyazott sablonnal, adja hozzá az copy elemet az Microsoft.Resources/deployments erőforrás szintjén. Vagy ha a hatókör az inner, felveheti a másolatot a beágyazott sablonba.

Az alábbi példasablon bemutatja, hogyan használható copy beágyazott sablonokkal.

"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
            // }
          }
        ]
      }
    }
  }
]

Értékek lekérése összekapcsolt sablonból

Ha kimeneti értéket szeretne lekérni egy csatolt sablonból, kérje le a tulajdonság értékét a következő szintaxissal: "[reference('deploymentName').outputs.propertyName.value]".

Csatolt sablon kimeneti tulajdonságának lekérésekor a tulajdonságnév nem tartalmazhat kötőjelet.

Az alábbi példák bemutatják, hogyan hivatkozhat csatolt sablonra, és hogyan kérdezhet le kimeneti értéket. A csatolt sablon egy egyszerű üzenetet ad vissza. Először a csatolt sablon:

{
  "$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"
    }
  }
}

A fő sablon üzembe helyezi a csatolt sablont, és lekéri a visszaadott értéket. Figyelje meg, hogy az üzembehelyezési erőforrásra név szerint hivatkozik, és a csatolt sablon által visszaadott tulajdonság nevét használja.

{
  "$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]"
    }
  }
}

Az alábbi példa egy olyan sablont mutat be, amely nyilvános IP-címet helyez üzembe, és visszaadja az Azure-erőforrás erőforrás-azonosítóját az adott nyilvános IP-címhez:

{
  "$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'))]"
    }
  }
}

Ha az előző sablon nyilvános IP-címét szeretné használni terheléselosztó üzembe helyezésekor, csatolja a sablont, és deklarálja az Microsoft.Resources/deployments erőforrástól való függőséget. A terheléselosztó nyilvános IP-címe a csatolt sablon kimeneti értékére van állítva.

{
  "$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')]" }
        }
      }
    }
  ]
}

Üzembe helyezési előzmények

A Resource Manager minden sablont külön üzembe helyezésként dolgoz fel az üzembe helyezési előzményekben. Egy három csatolt vagy beágyazott sablont tartalmazó fő sablon jelenik meg az üzembe helyezési előzményekben a következő módon:

Screenshot of deployment history in Azure portal.

Ezeket a különálló bejegyzéseket az előzményekben használhatja a kimeneti értékek lekérésére az üzembe helyezés után. A következő sablon létrehoz egy nyilvános IP-címet, és az IP-címet adja ki:

{
  "$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]"
    }
  }
}

Az alábbi sablon az előző sablonra mutat. Három nyilvános IP-címet hoz létre.

{
  "$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())]"}
        }
      }
    }
  ]
}

Az üzembe helyezés után a kimeneti értékeket a következő PowerShell-szkripttel lehet lekérni:

$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)"
}

Vagy Azure CLI-szkript Bash-rendszerhéjban:

#!/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

Külső sablon biztonságossá tétele

Bár a csatolt sablonnak külsőleg is elérhetőnek kell lennie, nem kell általánosan elérhetőnek lennie a nyilvánosság számára. A sablont hozzáadhatja egy privát tárfiókhoz, amely csak a tárfiók tulajdonosa számára érhető el. Ezután létrehoz egy közös hozzáférésű jogosultságkód (SAS) jogkivonatot a hozzáférés engedélyezéséhez az üzembe helyezés során. Ezt az SAS-jogkivonatot hozzáadja a csatolt sablon URI-hoz. Annak ellenére, hogy a jogkivonat biztonságos sztringként van átadva, a csatolt sablon URI-ja, beleértve az SAS-jogkivonatot is, a rendszer naplózza az üzembehelyezési műveletekben. Az expozíció korlátozásához állítsa be a jogkivonat lejáratát.

A paraméterfájl sas-jogkivonaton keresztül is korlátozható.

Egy Azure Storage-tűzfal mögötti tárfiókban jelenleg nem hivatkozhat sablonra.

Fontos

Ahelyett, hogy SAS-jogkivonattal biztosítanák a csatolt sablont, érdemes lehet sablon specifikációt létrehozni. A sablon specifikációja biztonságosan tárolja a fő sablont és annak csatolt sablonjait erőforrásként az Azure-előfizetésben. Az Azure RBAC használatával hozzáférést biztosíthat a sablon üzembe helyezéséhez szükséges felhasználóknak.

Az alábbi példa bemutatja, hogyan adhat át SAS-jogkivonatot egy sablonhoz való csatoláskor:

{
  "$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": {
  }
}

A PowerShellben jogkivonatot kap a tárolóhoz, és üzembe helyezi a sablonokat az alábbi parancsokkal. Figyelje meg, hogy a containerSasToken paraméter a sablonban van definiálva. Ez nem paraméter a New-AzResourceGroupDeployment parancsban.

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

A Bash-rendszerhéjban lévő Azure CLI-hez jogkivonatot kap a tárolóhoz, és üzembe helyezi a sablonokat a következő kóddal:

#!/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éldasablonok

Az alábbi példák a csatolt sablonok gyakori használatát mutatják be.

Fő sablon Csatolt sablon Leírás
Hello World csatolt sablon Sztringet ad vissza a csatolt sablonból.
Load Balancer nyilvános IP-címmel csatolt sablon Nyilvános IP-címet ad vissza a csatolt sablonból, és beállítja ezt az értéket a terheléselosztóban.
Több IP-cím csatolt sablon Több nyilvános IP-címet hoz létre csatolt sablonban.

Következő lépések