تكرار الخاصية في قوالب ARM

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

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

يمكنك أيضا استخدام حلقة النسخ مع الموارد والمتغيرات والمخرجات.

تلميح

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

بناء الجملة

copy أضف العنصر إلى قسم الموارد في القالب لتعيين عدد العناصر لخاصية. يحتوي عنصر النسخ على التنسيق العام التالي:

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

بالنسبة إلى 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 لا تدعم الصفر للعد.

تكرار الخاصية

يوضح المثال التالي كيفية تطبيق حلقة النسخ على الخاصية dataDisks على جهاز ظاهري:

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "numberOfDataDisks": {
      "type": "int",
      "minValue": 0,
      "maxValue": 16,
      "defaultValue": 3,
      "metadata": {
        "description": "The number of dataDisks to create."
      }
    },
    ...
  },
  "resources": [
    {
      "type": "Microsoft.Compute/virtualMachines",
      "apiVersion": "2022-11-01",
      ...
      "properties": {
        "storageProfile": {
          ...
          "copy": [
            {
              "name": "dataDisks",
              "count": "[parameters('numberOfDataDisks')]",
              "input": {
                "lun": "[copyIndex('dataDisks')]",
                "createOption": "Empty",
                "diskSizeGB": 1023
              }
            }
          ]
        }
        ...
      }
    }
  ]
}

لاحظ أنه عند استخدام ⁧⁩copyIndex داخل تكرار الخاصية، يجب توفير اسم التكرار. يعتمد تكرار الخاصية أيضًا وسيطة إزاحة. يجب أن تأتي الإزاحة بعد اسم التكرار، مثل copyIndex('dataDisks', 1).

يصبح القالب المنشور:

{
  "name": "examplevm",
  "type": "Microsoft.Compute/virtualMachines",
  "apiVersion": "2020-06-01",
  "properties": {
    "storageProfile": {
      "dataDisks": [
        {
          "lun": 0,
          "createOption": "Empty",
          "diskSizeGB": 1023
        },
        {
          "lun": 1,
          "createOption": "Empty",
          "diskSizeGB": 1023
        },
        {
          "lun": 2,
          "createOption": "Empty",
          "diskSizeGB": 1023
        }
      ],
      ...

عملية النسخ مفيدة عند العمل مع الصفائف لأنه يمكنك التكرار خلال كل عنصر في الصفيف. استخدم الدالة length على الصفيف لتحديد عدد التكرارات، واستخدم copyIndexلاسترداد الفهرس الحالي في الصفيف.

إنشاء قالب المثال التالي مجموعة تجاوز الفشل لقواعد البيانات التي يتم تمريرها في صفائف.

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "primaryServerName": {
      "type": "string"
    },
    "secondaryServerName": {
      "type": "string"
    },
    "databaseNames": {
      "type": "array",
      "defaultValue": [
        "mydb1",
        "mydb2",
        "mydb3"
      ]
    }
  },
  "variables": {
    "failoverName": "[format('{0}/{1}failovergroups', parameters('primaryServerName'), parameters('primaryServerName'))]"
  },
  "resources": [
    {
      "type": "Microsoft.Sql/servers/failoverGroups",
      "apiVersion": "2015-05-01-preview",
      "name": "[variables('failoverName')]",
      "properties": {
        "readWriteEndpoint": {
          "failoverPolicy": "Automatic",
          "failoverWithDataLossGracePeriodMinutes": 60
        },
        "readOnlyEndpoint": {
          "failoverPolicy": "Disabled"
        },
        "partnerServers": [
          {
            "id": "[resourceId('Microsoft.Sql/servers', parameters('secondaryServerName'))]"
          }
        ],
        "copy": [
          {
            "name": "databases",
            "count": "[length(parameters('databaseNames'))]",
            "input": "[resourceId('Microsoft.Sql/servers/databases', parameters('primaryServerName'), parameters('databaseNames')[copyIndex('databases')])]"
          }
        ]
      }
    }
  ],
  "outputs": {
  }
}

copy العنصر عبارة عن صفيف بحيث يمكنك تحديد أكثر من خاصية واحدة للمورد.

{
  "type": "Microsoft.Network/loadBalancers",
  "apiVersion": "2017-10-01",
  "name": "exampleLB",
  "properties": {
    "copy": [
      {
        "name": "loadBalancingRules",
        "count": "[length(parameters('loadBalancingRules'))]",
        "input": {
          ...
        }
      },
      {
        "name": "probes",
        "count": "[length(parameters('loadBalancingRules'))]",
        "input": {
          ...
        }
      }
    ]
  }
}

يمكنك استخدام تكرار الموارد والخصائص معًا. مرجع تكرار الخاصية حسب الاسم.

{
  "type": "Microsoft.Network/virtualNetworks",
  "apiVersion": "2018-04-01",
  "name": "[format('{0}{1}', parameters('vnetname'), copyIndex())]",
  "copy":{
    "count": 2,
    "name": "vnetloop"
  },
  "location": "[resourceGroup().location]",
  "properties": {
    "addressSpace": {
      "addressPrefixes": [
        "[parameters('addressPrefix')]"
      ]
    },
    "copy": [
      {
        "name": "subnets",
        "count": 2,
        "input": {
          "name": "[format('subnet-{0}', copyIndex('subnets'))]",
          "properties": {
            "addressPrefix": "[variables('subnetAddressPrefix')[copyIndex('subnets')]]"
          }
        }
      }
    ]
  }
}

قوالب المثال

يوضح المثال التالي سيناريو شائع لإنشاء أكثر من قيمة واحدة للخاصية.

Template ‏‏الوصف
نشر الجهاز الظاهري مع عدد متغير من أقراص البيانات نشر عدة أقراص بيانات مع جهاز ظاهري.

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