Erőforrások üzembe helyezési sorrendjének definiálása ARM-sablonokban

Az erőforrások üzembe helyezésekor előfordulhat, hogy meg kell győződnie arról, hogy bizonyos erőforrások léteznek a többi erőforrás előtt. Például szüksége van egy logikai SQL kiszolgálóra az adatbázis üzembe helyezése előtt. Ezt a kapcsolatot úgy hozza létre, hogy az egyik erőforrást a másik erőforrástól függőként jelöl meg. A dependsOn elemmel definiálhat explicit függőséget. A hivatkozási vagy listaf függvények használatával implicit függőségeket definiálhat.

Azure Resource Manager kiértékeli az erőforrások közötti függőségeket, és függő sorrendben telepíti őket. Ha az erőforrások között nincs függőségi viszony, akkor a Resource Manager párhuzamosan helyezi üzembe azokat. Csak az ugyanabban a sablonban üzembe helyezett erőforrások függőségeit kell meghatároznia.

dependsOn

A Azure Resource Manager (ARM-sablon) belül az elem lehetővé teszi, hogy egy erőforrást egy vagy több erőforrástól függőként dependsOn határozzon meg. Értéke sztringek JavaScript Object Notation (JSON) tömbje, amelyek mind erőforrásnév vagy azonosító. A tömb tartalmazhat feltételesen üzembe helyezett erőforrásokat. Ha egy feltételes erőforrás nincs telepítve, a Azure Resource Manager automatikusan eltávolítja azt a szükséges függőségekből.

Az alábbi példa egy hálózati adaptert mutat be, amely egy virtuális hálózattól, egy hálózati biztonsági csoporttól és egy nyilvános IP-címtől függ. A teljes sablont a Linux rendszerű virtuális gép gyorsindítási sablonja tartalmazza.

{
    "type": "Microsoft.Network/networkInterfaces",
    "apiVersion": "2020-06-01",
    "name": "[variables('networkInterfaceName')]",
    "location": "[parameters('location')]",
    "dependsOn": [
      "[resourceId('Microsoft.Network/networkSecurityGroups/', parameters('networkSecurityGroupName'))]",
      "[resourceId('Microsoft.Network/virtualNetworks/', parameters('virtualNetworkName'))]",
      "[resourceId('Microsoft.Network/publicIpAddresses/', variables('publicIpAddressName'))]"
    ],
    ...
}

Bár előfordulhat, hogy az erőforrások közötti kapcsolatok leképezésére érdemes használnia, fontos tisztában lennie vele, dependsOn hogy miért teszi. Az erőforrások összekapcsolásának dokumentálása például nem dependsOn a megfelelő módszer. Nem lehet lekérdezni, hogy az üzembe helyezés után mely erőforrások voltak dependsOn definiálva az elemben. A szükségtelen függőségek beállítása lelassítja az üzembe helyezési időt, Resource Manager nem helyezheti üzembe ezeket az erőforrásokat párhuzamosan.

Gyermekerőforrások

A gyermekerőforrás és a szülőerőforrás között nem jön létre automatikusan implicit üzembe helyezési függőség. Ha a gyermekerőforrást a szülőerőforrás után kell üzembe helyeznie, állítsa be a dependsOn tulajdonságot.

Az alábbi példa egy logikai SQL kiszolgálót és adatbázist mutat be. Figyelje meg, hogy explicit függőség van definiálva az adatbázis és a kiszolgáló között, annak ellenére, hogy az adatbázis a kiszolgáló gyermeke.

"resources": [
  {
    "type": "Microsoft.Sql/servers",
    "apiVersion": "2020-02-02-preview",
    "name": "[parameters('serverName')]",
    "location": "[parameters('location')]",
    "properties": {
      "administratorLogin": "[parameters('administratorLogin')]",
      "administratorLoginPassword": "[parameters('administratorLoginPassword')]"
    },
    "resources": [
      {
        "type": "databases",
        "apiVersion": "2020-08-01-preview",
        "name": "[parameters('sqlDBName')]",
        "location": "[parameters('location')]",
        "sku": {
          "name": "Standard",
          "tier": "Standard"
          },
        "dependsOn": [
          "[resourceId('Microsoft.Sql/servers', concat(parameters('serverName')))]"
        ]
      }
    ]
  }
]

A teljes sablont lásd: gyorssablonAzure SQL Database.

referencia- és listafunkciók

A referencia függvény lehetővé teszi, hogy egy kifejezés más JSON-név- és értékpárokból vagy futásidejű erőforrásokból származtassa az értékét. A list* függvények egy listaműveletből adnak vissza értékeket egy erőforráshoz.

A hivatkozási és listakifejezések implicit módon deklarálják, hogy az egyik erőforrás egy másiktól függ. Amikor csak lehetséges, használjon implicit hivatkozást, hogy elkerülje a szükségtelen függőségek hozzáadását.

Az implicit függőség kényszerítésében az erőforrásra név alapján, nem erőforrás-azonosító alapján hivatkozhat. Ha az erőforrás-azonosítót a hivatkozási vagy listafunkciókba adja át, nem jön létre implicit hivatkozás.

A függvény általános reference formátuma a következő:

reference('resourceName').propertyPath

A függvény általános listKeys formátuma a következő:

listKeys('resourceName', 'yyyy-mm-dd')

A következő példában a CDN végpont kifejezetten a CDN- és implicit módon egy webalkalmazástól függ.

{
    "name": "[variables('endpointName')]",
    "apiVersion": "2016-04-02",
    "type": "endpoints",
    "location": "[resourceGroup().location]",
    "dependsOn": [
      "[variables('profileName')]"
    ],
    "properties": {
      "originHostHeader": "[reference(variables('webAppName')).hostNames[0]]",
      ...
    }

További tudnivalókért lásd a referencia-függvényt.

Erőforrásoktól függ egy hurokban

A másolási ciklusban az erőforrásoktól függő erőforrások üzembe helyezéséhez két lehetőség áll rendelkezésre. A ciklusban vagy a teljes ciklusban állíthat be függőséget az egyes erőforrásokhoz.

Megjegyzés

A legtöbb esetben a másolási hurokban az egyes erőforrásoktól való függőséget kell beállítania. Csak akkor függ a teljes ciklustól, ha a hurokban található összes erőforrásnak léteznie kell a következő erőforrás létrehozása előtt. A teljes hurok függőségének beállítása jelentősen bővíti a függőségi gráfot, különösen akkor, ha ezek a hurkolt erőforrások más erőforrásoktól függenek. A bővített függőségek megnehezítik az üzembe helyezés hatékony befejezését.

Az alábbi példa több virtuális gép üzembe helyezését mutatja be. A sablon ugyanakkora számú hálózati adaptert hoz létre. Minden virtuális gép egy hálózati adaptertől függ, nem a teljes huroktól.

{
  "type": "Microsoft.Network/networkInterfaces",
  "apiVersion": "2020-05-01",
  "name": "[concat(variables('nicPrefix'),'-',copyIndex())]",
  "location": "[parameters('location')]",
  "copy": {
    "name": "nicCopy",
    "count": "[parameters('vmCount')]"
  },
  ...
},
{
  "type": "Microsoft.Compute/virtualMachines",
  "apiVersion": "2020-06-01",
  "name": "[concat(variables('vmPrefix'),copyIndex())]",
  "location": "[parameters('location')]",
  "dependsOn": [
    "[resourceId('Microsoft.Network/networkInterfaces',concat(variables('nicPrefix'),'-',copyIndex()))]"
  ],
  "copy": {
    "name": "vmCopy",
    "count": "[parameters('vmCount')]"
  },
  "properties": {
    "networkProfile": {
      "networkInterfaces": [
        {
          "id": "[resourceId('Microsoft.Network/networkInterfaces',concat(variables('nicPrefix'),'-',copyIndex()))]",
          "properties": {
            "primary": "true"
          }
        }
      ]
    },
    ...
  }
}

Az alábbi példa bemutatja, hogyan helyezhet üzembe három tárfiókot a virtuális gép üzembe helyezése előtt. Figyelje copy meg, hogy a elem beállítása name , storagecopy dependsOn a virtuális gép storagecopy eleme pedig .

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {},
  "resources": [
    {
      "type": "Microsoft.Storage/storageAccounts",
      "apiVersion": "2019-04-01",
      "name": "[concat(copyIndex(),'storage', uniqueString(resourceGroup().id))]",
      "location": "[resourceGroup().location]",
      "sku": {
        "name": "Standard_LRS"
      },
      "kind": "Storage",
      "copy": {
        "name": "storagecopy",
        "count": 3
      },
      "properties": {}
    },
    {
      "type": "Microsoft.Compute/virtualMachines",
      "apiVersion": "2015-06-15",
      "name": "[concat('VM', uniqueString(resourceGroup().id))]",
      "dependsOn": ["storagecopy"],
      ...
    }
  ],
  "outputs": {}
}

Körkörös függőségek

Resource Manager a sablonérvényesítés során azonosítja a körkörös függőségeket. Ha körkörös függőségről kap hibaüzenetet, értékelje ki a sablont, és nézze meg, hogy eltávolíthatók-e függőségek. Ha a függőségek eltávolítása nem működik, elkerülheti a körkörös függőségeket, ha néhány üzembe helyezési műveletet gyermekerőforrásokba költöztet. A körkörös függőséggel tartozó erőforrások után telepítse a gyermekerőforrásokat. Tegyük fel például, hogy két virtuális gépet helyez üzembe, de mindegyikhez olyan tulajdonságokat kell beállítania, amelyek a másikra hivatkoznak. Ezeket a következő sorrendben helyezheti üzembe:

  1. vm1
  2. vm2
  3. A vm1 virtuális gépen a bővítmény a vm1 és a vm2 virtuális géptől függ. A bővítmény a vm1 virtuális gépről lekért értékeket állítja be.
  4. A vm2 virtuális gépen a bővítmény a vm1 és a vm2 virtuális géptől függ. A bővítmény a vm2 virtuális gépről lekért értékeket állítja be.

Az üzembe helyezési sorrend felmérésével és a függőségi hibák megoldásával kapcsolatos információkért lásd: Az Azure-beli üzembehelyezés gyakori hibáinak elhárítása a következő Azure Resource Manager.

Következő lépések