تكرار متغير في قوالب ARM

توضح هذه المقالة كيفية إنشاء أكثر من قيمة لمتغير في قالب Azure Resource Manager (قالب ARM). بإضافة copy العنصر إلى قسم المتغيرات في القالب الخاص بك، يمكنك تعيين عدد العناصر لمتغير ديناميكيا أثناء النشر. يمكنك أيضًا تجنب الحاجة إلى تكرار بناء جملة القالب.

يمكنك أيضا استخدام النسخ مع الموارد والخصائص في مورد والمخرجات.

تلميح

نوصي باستخدام Bicep لأنها تقدم نفس الإمكانات التي توفرها نماذج ARM ولأن البنية أسهل في الاستخدام. لمعرفة المزيد، راجع التكرارات الحلقية.

بناء الجملة

يحتوي عنصر النسخ على التنسيق العام التالي:

"copy": [
  {
    "name": "<name-of-loop>",
    "count": <number-of-iterations>,
    "input": <values-for-the-variable>
  }
]

الخاصية name هي أي قيمة تُعرف الحلقة. count تحدد الخاصية عدد التكرارات التي تريدها للمتغير.

تحددinputالخاصية الخصائص التي تريد تكرارها. قم بإنشاء صفيف من العناصر التي تم إنشاؤها من القيمة فيinputالخاصية. يمكن أن يكون خاصية واحدة (مثل سلسلة)، أو كائن مع خصائص عدة.

حدود النسخ

العدد لا يمكن أن يتجاوز 800.

لا يمكن أن يكون العدد رقمًا سالبًا. يمكن أن يكون صفر إذا قمت بنشر القالب مع إصدار حديث من Azure CLI أو PowerShell أو واجهة برمجة تطبيقات REST. وبوجه خاص، يجب استخدام:

  • إصدار 2.6 من Azure PowerShell أو إصدار أحدث
  • إصدار 2.0.74 من Azure CLI أو إصدار أحدث
  • إصدار 2019-05-10 من واجهة برمجة تطبيقات REST أو إصدار أحدث
  • يجب أن تستخدم عمليات النشر المرتبطة إصدار 2019-05-10 من واجهة برمجة التطبيقات أو إصدار أحدث لنوع مورد النشر

الإصدارات السابقة من PowerShell وCLI وواجهة برمجة تطبيقات REST لا تدعم الصفر للعد.

تكرار متغير

يوضح المثال التالي كيفية إنشاء صفيف من قيم السلسلة:

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "itemCount": {
      "type": "int",
      "defaultValue": 5
    }
  },
  "variables": {
    "copy": [
      {
        "name": "stringArray",
        "count": "[parameters('itemCount')]",
        "input": "[concat('item', copyIndex('stringArray', 1))]"
      }
    ]
  },
  "resources": [],
  "outputs": {
    "arrayResult": {
      "type": "array",
      "value": "[variables('stringArray')]"
    }
  }
}

يرجع القالب السابق صفيف بالقيم التالية:

[
  "item1",
  "item2",
  "item3",
  "item4",
  "item5"
]

يوضح المثال التالي كيفية إنشاء صفيف كائنات بثلاث خصائص - name وdiskSizeGB وdiskIndex.

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "itemCount": {
      "type": "int",
      "defaultValue": 5
    }
  },
  "variables": {
    "copy": [
      {
        "name": "objectArray",
        "count": "[parameters('itemCount')]",
        "input": {
          "name": "[concat('myDataDisk', copyIndex('objectArray', 1))]",
          "diskSizeGB": "1",
          "diskIndex": "[copyIndex('objectArray')]"
        }
      }
    ]
  },
  "resources": [],
  "outputs": {
    "arrayResult": {
      "type": "array",
      "value": "[variables('objectArray')]"
    }
  }
}

يقوم المثال السابق بإرجاع صفيف بالقيم التالية:

[
  {
    "name": "myDataDisk1",
    "diskSizeGB": "1",
    "diskIndex": 0
  },
  {
    "name": "myDataDisk2",
    "diskSizeGB": "1",
    "diskIndex": 1
  },
  {
    "name": "myDataDisk3",
    "diskSizeGB": "1",
    "diskIndex": 2
  },
  {
    "name": "myDataDisk4",
    "diskSizeGB": "1",
    "diskIndex": 3
  },
  {
    "name": "myDataDisk5",
    "diskSizeGB": "1",
    "diskIndex": 4
  }
]

إشعار

يدعم التكرار المتغير وسيطة الإزاحة. يجب أن تأتي الإزاحة بعد اسم التكرار، مثل copyIndex('diskNames', 1). إذا لم تقدم قيمة إزاحة، فإنها تُعد افتراضيًا عند 0 للمثيل الأول.

يمكنك أيضا استخدام copy العنصر داخل متغير. ينشئ المثال التالي عنصر يحتوي على صفيف كأحد قيمه.

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "itemCount": {
      "type": "int",
      "defaultValue": 5
    }
  },
  "variables": {
    "topLevelObject": {
      "sampleProperty": "sampleValue",
      "copy": [
        {
          "name": "disks",
          "count": "[parameters('itemCount')]",
          "input": {
            "name": "[concat('myDataDisk', copyIndex('disks', 1))]",
            "diskSizeGB": "1",
            "diskIndex": "[copyIndex('disks')]"
          }
        }
      ]
    }
  },
  "resources": [],
  "outputs": {
    "objectResult": {
      "type": "object",
      "value": "[variables('topLevelObject')]"
    }
  }
}

يرجع المثال السابق عنصر بالقيم التالية:

{
  "sampleProperty": "sampleValue",
  "disks": [
    {
      "name": "myDataDisk1",
      "diskSizeGB": "1",
      "diskIndex": 0
    },
    {
      "name": "myDataDisk2",
      "diskSizeGB": "1",
      "diskIndex": 1
    },
    {
      "name": "myDataDisk3",
      "diskSizeGB": "1",
      "diskIndex": 2
    },
    {
      "name": "myDataDisk4",
      "diskSizeGB": "1",
      "diskIndex": 3
    },
    {
      "name": "myDataDisk5",
      "diskSizeGB": "1",
      "diskIndex": 4
    }
  ]
}

يوضح المثال التالي الطرق المختلفة التي يمكنك استخدامها copy مع المتغيرات.

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {},
  "variables": {
    "disk-array-on-object": {
      "copy": [
        {
          "name": "disks",
          "count": 5,
          "input": {
            "name": "[concat('myDataDisk', copyIndex('disks', 1))]",
            "diskSizeGB": "1",
            "diskIndex": "[copyIndex('disks')]"
          }
        },
        {
          "name": "diskNames",
          "count": 5,
          "input": "[concat('myDataDisk', copyIndex('diskNames', 1))]"
        }
      ]
    },
    "copy": [
      {
        "name": "top-level-object-array",
        "count": 5,
        "input": {
          "name": "[concat('myDataDisk', copyIndex('top-level-object-array', 1))]",
          "diskSizeGB": "1",
          "diskIndex": "[copyIndex('top-level-object-array')]"
        }
      },
      {
        "name": "top-level-string-array",
        "count": 5,
        "input": "[concat('myDataDisk', copyIndex('top-level-string-array', 1))]"
      },
      {
        "name": "top-level-integer-array",
        "count": 5,
        "input": "[copyIndex('top-level-integer-array')]"
      }
    ]
  },
  "resources": [],
  "outputs": {
    "exampleObject": {
      "value": "[variables('disk-array-on-object')]",
      "type": "object"
    },
    "exampleArrayOnObject": {
      "value": "[variables('disk-array-on-object').disks]",
      "type" : "array"
    },
    "exampleObjectArray": {
      "value": "[variables('top-level-object-array')]",
      "type" : "array"
    },
    "exampleStringArray": {
      "value": "[variables('top-level-string-array')]",
      "type" : "array"
    },
    "exampleIntegerArray": {
      "value": "[variables('top-level-integer-array')]",
      "type" : "array"
    }
  }
}

قوالب المثال

تظهر الأمثلة التالية سيناريوهات شائعة لإنشاء أكثر من قيمة واحدة لمتغير.

Template ‏‏الوصف
نسخ المتغيرات توضيح الطرق المختلفة للتكرار على المتغيرات.
قواعد أمان متعددة توزيع العديد من قواعد الأمان في مجموعة الأمان للشبكة. يبني قواعد الأمان من معلمة. بالنسبة للمعلمة، راجع ملف معلمة NSG متعدد.
نسخ التخزين باستخدام المتغيرات مثال على كيفية تكرار متغير وإنشاء حسابات تخزين متعددة.

الخطوات التالية