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

Az erőforrások üzembe helyezésekor előfordulhat, hogy bizonyos erőforrásoknak a többi erőforrás előtt kell létezniük. Egy adatbázis üzembe helyezése előtt például logikai SQL-kiszolgálóra van szükség. Ezt a kapcsolatot úgy hozhatja létre, hogy az egyik erőforrást a másik erőforrástól függőként jelöli meg. dependsOn Az elem használatával definiáljon egy explicit függőséget. A referencia - vagy listafüggvények használatával definiálhat implicit függőséget.

Az Azure Resource Manager kiértékeli az erőforrások közötti függőségeket, és a függő sorrendben helyezi üzembe ő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 ugyanazon sablonban üzembe helyezett erőforrások függőségeit kell meghatároznia.

Tipp

A Bicep használatát javasoljuk, mert ugyanazokat a képességeket kínálja, mint az ARM-sablonok, és a szintaxis használata is egyszerűbb. További információ: Erőforrás-függőségek.

dependsOn

Az Azure Resource Manager-sablonon (ARM-sablonon) belül az dependsOn elem lehetővé teszi, hogy egy erőforrást egy vagy több erőforrástól függőként definiáljon. Az értéke egy Sztringek JavaScript Object Notation (JSON) tömbje, amelyek mindegyike egy 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 üzembe helyezve, az Azure Resource Manager automatikusan eltávolítja azt a szükséges függőségekből.

Az alábbi példa egy virtuális hálózattól, hálózati biztonsági csoporttól és nyilvános IP-címtől függő hálózati adaptert mutat be. A teljes sablont a Linux rendszerű virtuális gépek rövid útmutatósablonjában tekintheti meg.

{
  "type": "Microsoft.Network/networkInterfaces",
  "apiVersion": "2022-07-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'))]"
  ],
  ...
}

A languageVersion 2.0-val használja az erőforrás szimbolikus nevét tömbökben dependsOn . Például:

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "languageVersion": "2.0",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "location": {
      "type": "string",
      "defaultValue": "[resourceGroup().location]"
    }
  },
  "resources": {
    "myStorage": {
      "type": "Microsoft.Storage/storageAccounts",
      "apiVersion": "2023-01-01",
      "name": "[format('storage{0}', uniqueString(resourceGroup().id))]",
      "location": "[parameters('location')]",
      "sku": {
        "name": "Standard_LRS"
      },
      "kind": "StorageV2"
    },
    "myVm": {
      "type": "Microsoft.Compute/virtualMachines",
      "apiVersion": "2023-03-01",
      "name": "[format('vm{0}', uniqueString(resourceGroup().id))]",
      "location": "[parameters('location')]",
      "dependsOn": [
        "myStorage"
      ],
      ...
    }
  }
}

Bár érdemes lehet az erőforrások közötti kapcsolatok leképezésére használni dependsOn , fontos tisztában lenni azzal, hogy miért teszi ezt. Az erőforrások összekapcsolási dependsOn módjának dokumentálásához például nem a megfelelő módszer. Az üzembe helyezés után az erőforrás nem őrzi meg az üzembehelyezési függőségeket a tulajdonságaiban, így nincsenek olyan parancsok vagy műveletek, amelyek lehetővé teszik a függőségek megtekintését. A szükségtelen függőségek beállítása lelassítja az üzembe helyezési időt, mert Resource Manager nem tudja párhuzamosan üzembe helyezni ezeket az erőforrásokat.

Gyermekerőforrások

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

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": "2022-05-01-preview",
    "name": "[parameters('serverName')]",
    "location": "[parameters('location')]",
    "properties": {
      "administratorLogin": "[parameters('administratorLogin')]",
      "administratorLoginPassword": "[parameters('administratorLoginPassword')]"
    },
    "resources": [
      {
        "type": "databases",
        "apiVersion": "2022-05-01-preview",
        "name": "[parameters('sqlDBName')]",
        "location": "[parameters('location')]",
        "sku": {
          "name": "Standard",
          "tier": "Standard"
          },
        "dependsOn": [
          "[resourceId('Microsoft.Sql/servers', parameters('serverName'))]"
        ]
      }
    ]
  }
]

A teljes sablonért tekintse meg a Azure SQL Database rövid útmutatósablonját.

referencia- és listafüggvények

A referenciafüggvény lehetővé teszi, hogy egy kifejezés más JSON-névből és értékpárokból vagy futtatókörnyezeti erőforrásokból származtassa az értékét. A list* függvények egy listaműveletből származó erőforrás értékeit adja vissza.

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 a szükségtelen függőségek hozzáadásának elkerülése érdekében.

Implicit függőség kényszerítéséhez az erőforrásra hivatkozzon név szerint, nem pedig erőforrás-azonosító alapján. Ha átadja az erőforrás-azonosítót a referencia- vagy listafüggvényekbe, a rendszer nem hoz létre implicit hivatkozást.

A függvény általános formátuma reference :

reference('resourceName').propertyPath

A függvény általános formátuma listKeys :

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

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

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

További információ: referenciafüggvény.

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

A másolási ciklus erőforrásaitól függő erőforrások üzembe helyezéséhez két lehetősége van. Beállíthat függőséget az egyes erőforrásoktól a hurokban vagy a teljes hurokban.

Megjegyzés

A legtöbb forgatókönyv esetében a másolási cikluson belül kell beállítani az egyes erőforrásoktól való függőséget. Csak akkor függ az egész ciklustól, ha a ciklusban lévő összes erőforrásnak léteznie kell a következő erőforrás létrehozása előtt. Ha a függőséget az egész ciklusra állítja, a függőségi diagram jelentősen megnő, különösen akkor, ha ezek a hurkolt erőforrások más erőforrásoktól függnek. A kibővített függőségek megnehezítik az üzembe helyezés hatékony elvégzését.

Az alábbi példa bemutatja, hogyan helyezhet üzembe több virtuális gépet. A sablon ugyanannyi hálózati adaptert hoz létre. Minden virtuális gép egy hálózati adaptertől függ, nem pedig a teljes huroktól.

{
  "type": "Microsoft.Network/networkInterfaces",
  "apiVersion": "2022-07-01",
  "name": "[format('{0}-{1}', variables('nicPrefix'), copyIndex())]",
  "location": "[parameters('location')]",
  "copy": {
    "name": "nicCopy",
    "count": "[parameters('vmCount')]"
  },
  ...
},
{
  "type": "Microsoft.Compute/virtualMachines",
  "apiVersion": "2022-11-01",
  "name": "[format('{0}{1}', variables('vmPrefix'), copyIndex())]",
  "location": "[parameters('location')]",
  "dependsOn": [
    "[resourceId('Microsoft.Network/networkInterfaces',format('{0}-{1}', variables('nicPrefix'),copyIndex()))]"
  ],
  "copy": {
    "name": "vmCopy",
    "count": "[parameters('vmCount')]"
  },
  "properties": {
    "networkProfile": {
      "networkInterfaces": [
        {
          "id": "[resourceId('Microsoft.Network/networkInterfaces',format('(0)-(1)', 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 meg, hogy az copy elem name értéke storagecopy és a dependsOn virtuális gép eleme is értékre storagecopyvan állítva.

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

A szimbolikus nevek tömbökben dependsOn is használhatók. Ha a szimbolikus név egy másolási hurokhoz tartozik, a hurokban lévő összes erőforrás függőségként lesz hozzáadva. Az előző minta a következő JSON-ként írható. A mintában a myVM a myStorages hurok összes tárfiókjától függ.

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "languageVersion": "2.0",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "location": {
      "type": "string",
      "defaultValue": "[resourceGroup().location]"
    }
  },
  "resources": {
    "myStorages": {
      "type": "Microsoft.Storage/storageAccounts",
      "apiVersion": "2022-09-01",
      "name": "[format('{0}storage{1}, copyIndex(), uniqueString(resourceGroup().id))]",
      "location": "[parameters('location')]",
      "sku": {
        "name": "Standard_LRS"
      },
      "kind": "Storage",
      "copy": {
        "name": "storagecopy",
        "count": 3
      },
      "properties": {}
    },
    "myVM": {
      "type": "Microsoft.Compute/virtualMachines",
      "apiVersion": "2022-11-01",
      "name": "[format('VM{0}', uniqueString(resourceGroup().id))]",
      "dependsOn": ["myStorages"],
      ...
    }
  }
}

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

Resource Manager azonosítja a körkörös függőségeket a sablon érvényesítése során. Ha a körkörös függőségekkel kapcsolatban hibaüzenetet kap, értékelje ki a sablont, és ellenőrizze, 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 egyes üzembehelyezési műveleteket gyermekerőforrásokba helyez át. Helyezze üzembe a gyermekerőforrásokat a körkörös függőségű erőforrások után. Tegyük fel például, hogy két virtuális gépet helyez üzembe, de mindegyiken meg kell adnia a másikra hivatkozó tulajdonságokat. Ezeket a következő sorrendben helyezheti üzembe:

  1. vm1
  2. vm2
  3. A vm1 bővítménye a vm1-től és a vm2-től függ. A bővítmény beállítja a vm1 azon értékeit, amelyeket a vm2-ből kap.
  4. A vm2 bővítménye a vm1-től és a vm2-től függ. A bővítmény beállítja a vm2 azon értékeit, amelyeket a vm1-ből kap.

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

Következő lépések