مؤلف سياسات خصائص الصفيف على موارد Azure

يتم تعريف خصائص Azure Resource Manager عادةً كسلاسل وقيم منطقية. عند وجود علاقة واحد إلى متعدد، يتم تعريف الخصائص المعقدة بدلاً من ذلك على أنها صفائف. في سياسة Azure، يتم استخدام الصفائف بعدة طرق مختلفة:

  • نوع معلمة التعريف، لتوفير خيارات متعددة.
  • جزء من قاعدة نهج باستخدام الشروط in أو notIn.
  • جزء من قاعدة نهج تحسب عدد أعضاء الصفيف الذين يستوفون شرطا.
  • في الإرفاق و تعديل التأثيرات لتحديث صفيف موجود

تتناول هذه المقالة جميع استخدامات Azure Policy وتوفر العديد من أمثلة التعريفات.

صفائف المعلمات

تعريف صفيف المعلمة

يتيح تعريف المعلمة كصفيف مرونة السياسة عند الحاجة إلى أكثر من قيمة واحدة. يسمح تعريف النهج هذا بأي موقع واحد للمعلمة allowedLocations والإعدادات الافتراضية ل eastus2:

"parameters": {
  "allowedLocations": {
    "type": "string",
    "metadata": {
      "description": "The list of allowed locations for resources.",
      "displayName": "Allowed locations",
      "strongType": "location"
    },
    "defaultValue": "eastus2"
  }
}

كما type كانت السلسلة، يمكن تعيين قيمة واحدة فقط عند تعيين النهج. إذا تم تعيين هذا السياسة، يسمح بالموارد في النطاق فحسب داخل منطقة واحدة بـ Azure. تحتاج معظم تعريفات السياسة إلى السماح بقائمة بالخيارات المعتمدة، مثل السماح بـ eastus2، و eastus، و westus2.

لإنشاء تعريف النهج للسماح بخيارات متعددة، استخدم الصفيف type. يمكن إعادة كتابة السياسة نفسها على النحو التالي:

"parameters": {
  "allowedLocations": {
    "type": "array",
    "metadata": {
      "description": "The list of allowed locations for resources.",
      "displayName": "Allowed locations",
      "strongType": "location"
    },
    "defaultValue": [
      "eastus2"
    ],
    "allowedValues": [
      "eastus2",
      "eastus",
      "westus2"
    ]
  }
}

إشعار

بمجرد حفظ تعريف النهج، لا يمكن تغيير الخاصية على type معلمة.

يستوعب تعريف المعلمة الجديد أكثر من قيمة واحدة أثناء تعيين السياسة. مع تحديد خاصية allowedValues الصفيف، تقتصر القيم المتوفرة أثناء التعيين بشكل أكبر على قائمة الخيارات المحددة مسبقا. allowedValues استخدام اختياري.

قم بتمرير القيم إلى صفيف المعلمة أثناء التعيين

عند تعيين النهج من خلال مدخل Microsoft Azure، يتم عرض معلمة صفيف type كم مربع نص واحد. التلميح يقول Use ; to separate values. (e.g. London;New York). لتمرير قيم الموقع المسموح بها لـ eastus2، و eastus، و westus2 إلى المعلمة، استخدم السلسلة التالية:

eastus2;eastus;westus2

يختلف تنسيق قيمة المعلمة عند استخدام Azure CLI، أو Azure PowerShell، أو واجهة برمجة تطبيقات REST. يتم تمرير القيم من خلال سلسلة JSON التي تتضمن أيضًا اسم المعلمة.

{
  "allowedLocations": {
    "value": [
      "eastus2",
      "eastus",
      "westus2"
    ]
  }
}

لاستخدام هذه السلسلة مع كل SDK، استخدم الأوامر التالية:

  • Azure CLI: الأمر az policy assignment create with parameter params.
  • Azure PowerShell: Cmdlet New-AzPolicyAssignment مع المعلمة PolicyParameter.
  • REST API: في عملية إنشاء PUT كجزء من نص الطلب كقيمة للخاصية properties.parameters .

استخدام الصفائف في الشروط

In وnotIn

تتعامل الشروط in وnotIn مع قيم الصفيف فحسب. يتحققون من وجود قيمة في صفيف. يمكن أن يكون الصفيف صفيفاً حرفياً لـ JSON أو مرجعاً لمعلمة الصفيف. على سبيل المثال:

{
  "field": "tags.environment",
  "in": [
    "dev",
    "test"
  ]
}
{
  "field": "location",
  "notIn": "[parameters('allowedLocations')]"
}

عدد القيم

يحسب تعبير عدد القيم عدد أعضاء الصفيف الذين يستوفون الشرط. يوفر طريقة لتقييم الشرط نفسه عدة مرات، باستخدام قيم مختلفة على كل تكرار. على سبيل المثال، يتحقق الشرط التالي مما إذا كان اسم المورد يطابق أي نمط من صفيف من الأنماط التالية:

{
  "count": {
    "value": [
      "test*",
      "dev*",
      "prod*"
    ],
    "name": "pattern",
    "where": {
      "field": "name",
      "like": "[current('pattern')]"
    }
  },
  "greater": 0
}

من أجل تقييم التعبير، تقوم سياسة Azure بتقييم الشرط where ثلاث مرات، مرة لكل عضو في [ "test*", "dev*", "prod*" ]، مما يحسب عدد المرات التي تم تقييمه فيها إلى true. في كل تكرار، يتم إقران قيمة عضو الصفيف الحالي باسم الفهرس pattern المحدد بواسطة count.name. يمكن بعد ذلك الإشارة إلى هذه القيمة داخل الشرط where عن طريق استدعاء دالة قالب خاص: current('pattern').

التكرار current('pattern') القيمة المرجعة
1 "test*"
2 "dev*"
3 "prod*"

يكون الشرط صحيحًا إذا كان العدد الناتج أكبر من 0.

لجعل الشرط السابق أكثر عمومية، استخدم مرجعا parameters بدلا من صفيف حرفي:

{
  "count": {
    "value": "[parameters('patterns')]",
    "name": "pattern",
    "where": {
      "field": "name",
      "like": "[current('pattern')]"
    }
  },
  "greater": 0
}

value count عندما لا يكون التعبير ضمن أي تعبير آخرcount، count.name يكون اختياريا ويمكن استخدام الدالة current() دون أي وسيطات:

{
  "count": {
    "value": "[parameters('patterns')]",
    "where": {
      "field": "name",
      "like": "[current()]"
    }
  },
  "greater": 0
}

value count يدعم أيضا صفائف الكائنات المعقدة، ما يسمح بشروط أكثر تعقيدا. على سبيل المثال، يقوم الشرط التالي بتعريف قيمة العلامة المطلوبة لكل نمط اسم ويتحقق مما إذا كان اسم المورد يطابق النمط، ولكنه لا يحتوي على قيمة العلامة المطلوبة:

{
  "count": {
    "value": [
      {
        "pattern": "test*",
        "envTag": "dev"
      },
      {
        "pattern": "dev*",
        "envTag": "dev"
      },
      {
        "pattern": "prod*",
        "envTag": "prod"
      },
    ],
    "name": "namePatternRequiredTag",
    "where": {
      "allOf": [
        {
          "field": "name",
          "like": "[current('namePatternRequiredTag').pattern]"
        },
        {
          "field": "tags.env",
          "notEquals": "[current('namePatternRequiredTag').envTag]"
        }
      ]
    }
  },
  "greater": 0
}

للحصول على أمثلة مفيدة، راجع أمثلة عدد القيم.

الإشارة إلى خصائص مورد الصفيف

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

الرجوع إلى خصائص المورد

يمكن الإشارة إلى خصائص المورد بواسطة سياسة Azure باستخدام الأسماء المستعارة توجد طريقتان للإشارة إلى قيم خاصية مورد ضمن سياسة Azure:

  • استخدم شرط الحقل للتحقق مما إذا كانت كافة خصائص المورد المحددة تفي بشرط. مثال:

    {
      "field": "Microsoft.Test/resourceType/property",
      "equals": "value"
    }
    
  • استخدم الدالة field() للوصول إلى قيمة الخاصية. مثال:

    {
      "value": "[take(field('Microsoft.Test/resourceType/property'), 7)]",
      "equals": "prefix_"
    }
    

شرط الحقل له سلوك ضمني allOf . إذا كان الاسم المستعار يمثل مجموعة من القيم، فإنه يتحقق مما إذا كانت جميع القيم الفردية تفي بالشرط. تقوم الدالة field() بإرجاع القيم الممثلة بالاسم المستعار كما هي، التي يمكن معالجتها بعد ذلك بواسطة دالات القالب الأُخرى.

الرجوع إلى حقول الصفيف

يتم تمثيل خصائص مورد الصفيف بنوعين مختلفين من الأسماء المستعارة. اسم مستعار عادي واحد وأسماء مستعارة [*] للصفيف مرفقة به:

  • Microsoft.Test/resourceType/stringArray
  • Microsoft.Test/resourceType/stringArray[*]

الرجوع إلى الصفيف

يمثل الاسم المستعار الأول قيمة واحدة، قيمة الخاصية stringArray من محتوى الطلب. نظرًا إلى أن قيمة هذه الخاصية عبارة عن صفيف، فهي ليست مفيدة في شروط السياسة. على سبيل المثال:

{
  "field": "Microsoft.Test/resourceType/stringArray",
  "equals": "..."
}

يقارن هذا الشرط الصفيف stringArray بأكمله مع قيمة سلسلة واحدة. إن معظم الشروط، بما في ذلك equals، تقبل قيم السلسلة فحسب، لذلك لا يوجد استخدام كبير في مقارنة صفيف بسلسلة. إن يكون الرجوع إلى خاصية الصفيف مفيدًا في السيناريو الرئيس عند التحقق مما إذا كانت موجودة:

{
  "field": "Microsoft.Test/resourceType/stringArray",
  "exists": "true"
}

مع الدالة field()، فإن القيمة التي تم إرجاعها هي الصفيف من محتوى الطلب، الذي يمكن استخدامه بعد ذلك في أي من دالات القالب المدعومة التي تقبل وسيطات الصفيف. على سبيل المثال، يتحقق الشرط التالي مما إذا كان طول stringArray أكبر من 0:

{
  "value": "[length(field('Microsoft.Test/resourceType/stringArray'))]",
  "greater": 0
}

الرجوع إلى مجموعة أعضاء الصفيف

تمثل الأسماء المستعارة التي تستخدم بناء الجملة [*] مجموعة من قيم الخصائص المحددة من خاصية صفيف، والتي تختلف عن تحديد خاصية الصفيف نفسها. على سبيل المثال، Microsoft.Test/resourceType/stringArray[*] إرجاع مجموعة تحتوي على جميع أعضاء stringArray. كما ذكرنا سابقا، field يتحقق الشرط من أن كافة خصائص المورد المحددة تفي بالشرط، لذلك الشرط التالي صحيح فقط إذا كان جميع أعضاء stringArray يساوي "value".

{
  "field": "Microsoft.Test/resourceType/stringArray[*]",
  "equals": "value"
}

إذا كان الصفيف فارغا، يتم تقييم الشرط إلى صحيح لأنه لا يوجد عضو في الصفيف في انتهاك. في هذا السيناريو، التوصية هي استخدام تعبير العد بدلا من ذلك. إذا كان الصفيف يحتوي على عنصر، يمكن استخدام اسم [*] مستعار لتحديد قيمة خاصية معينة من كل عضو صفيف. مثال:

{
  "field": "Microsoft.Test/resourceType/objectArray[*].property",
  "equals": "value"
}

هذا الشرط صحيح إذا كانت قيم جميع property الخصائص في objectArray تساوي "value". لمزيد من الأمثلة، راجع المزيد من الأمثلة على الأسماء المستعارة.

عند استخدام الدالة field() للإشارة إلى الاسم المستعار للصفيف، تكون القيمة التي تم إرجاعها عبارة عن صفيف من كافة القيم المحددة. يعني هذا السلوك أن حالة الاستخدام الشائعة للدالة field()، فإن القدرة على تطبيق دالات القالب على قيم خصائص المورد محدودة. إن دالات القالب الوحيدة التي يمكن استخدامها في هذه الحالة هي تلك التي تقبل وسيطات الصفيف. على سبيل المثال، من الممكن الحصول على طول الصفيف باستخدام [length(field('Microsoft.Test/resourceType/objectArray[*].property'))]. ومع ذلك، فإن السيناريوهات الأكثر تعقيدًا مثل تطبيق دالة القالب على كل عضو صفيف ومقارنتها بالقيمة المطلوبة مُمكنة عند استخدام التعبير count فحسب. لمزيد من المعلومات، راجع تعبير عدد الحقول.

لنلخص الأمر، راجع المثال التالي لمحتوى المورد والقيم المحددة التي تم إرجاعها بواسطة أسماء مستعارة مختلفة:

{
  "tags": {
    "env": "prod"
  },
  "properties": {
    "stringArray": [
      "a",
      "b",
      "c"
    ],
    "objectArray": [
      {
        "property": "value1",
        "nestedArray": [
          1,
          2
        ]
      },
      {
        "property": "value2",
        "nestedArray": [
          3,
          4
        ]
      }
    ]
  }
}

عند استخدام شرط الحقل على مثال محتوى المورد، تكون النتائج كما يلي:

الاسم المستعار القيم المحددة
Microsoft.Test/resourceType/missingArray null
Microsoft.Test/resourceType/missingArray[*] مجموعة فارغة من القيم.
Microsoft.Test/resourceType/missingArray[*].property مجموعة فارغة من القيم.
Microsoft.Test/resourceType/stringArray ["a", "b", "c"]
Microsoft.Test/resourceType/stringArray[*] "a"، ، "b""c"
Microsoft.Test/resourceType/objectArray[*] { "property": "value1", "nestedArray": [ 1, 2 ] },
{ "property": "value2", "nestedArray": [ 3, 4 ] }
Microsoft.Test/resourceType/objectArray[*].property "value1", "value2"
Microsoft.Test/resourceType/objectArray[*].nestedArray [ 1, 2 ], [ 3, 4 ]
Microsoft.Test/resourceType/objectArray[*].nestedArray[*] 1، ، 2، 34

عند استخدام الدالة field() على مثال محتوى المورد، تكون النتائج كما يلي:

Expression القيمة المرجعة
[field('Microsoft.Test/resourceType/missingArray')] ""
[field('Microsoft.Test/resourceType/missingArray[*]')] []
[field('Microsoft.Test/resourceType/missingArray[*].property')] []
[field('Microsoft.Test/resourceType/stringArray')] ["a", "b", "c"]
[field('Microsoft.Test/resourceType/stringArray[*]')] ["a", "b", "c"]
[field('Microsoft.Test/resourceType/objectArray[*]')] [{ "property": "value1", "nestedArray": [ 1, 2 ] }, { "property": "value2", "nestedArray": [ 3, 4 ] }]
[field('Microsoft.Test/resourceType/objectArray[*].property')] ["value1", "value2"]
[field('Microsoft.Test/resourceType/objectArray[*].nestedArray')] [[ 1, 2 ], [ 3, 4 ]]
[field('Microsoft.Test/resourceType/objectArray[*].nestedArray[*]')] [1, 2, 3, 4]

تعبيرات عدد الحقول

عدد الحقول تحسب تعبيرات عدد أعضاء الصفيف الذين يستوفون شرطًا ويقارنون العدد بقيمة الهدف. Count أكثر بديهيةً وتنوعًا لتقييم الصفائف مقارنة بالشروط field. يتشكل بناء الجملة من:

{
  "count": {
    "field": <[*
    ] alias>,
    "where": <optional policy condition expression>
  },
  "equals|greater|less|any other operator": <target value>
}

عند استخدامها دون شرطwhere، count ما عليك سوى إرجاع طول الصفيف. مع مثال محتوى المورد من القسم السابق، يتم تقييم التعبير count التالي إلى true منذ stringArray الذي يتضمن ثلاثة أعضاء:

{
  "count": {
    "field": "Microsoft.Test/resourceType/stringArray[*]"
  },
  "equals": 3
}

يتعامل هذا السلوك أيضًا مع الصفائف المتداخلة. على سبيل المثال، يتم تقييم التعبير count التالي إلى true نظرًا لوجود أربعة أعضاء صفيف في الصفائف nestedArray:

{
  "count": {
    "field": "Microsoft.Test/resourceType/objectArray[*].nestedArray[*]"
  },
  "greaterOrEquals": 4
}

تكمن قوة count في الشرط where. عند count تحديدها، يقوم نهج Azure بتعداد أعضاء الصفيف وتقييم كل منها مقابل الشرط، مع حساب عدد أعضاء الصفيف الذين تم تقييمهم إلى true. على وجه التحديد، في كل تكرار where لتقييم الشرط، يحدد Azure Policy عضوا i واحدا في الصفيف ويقيم محتوى المورد مقابل where الشرط كما لو كان i العضو الوحيد في الصفيف. يوفر وجود عضو صفيف واحد فقط متوفر في كل تكرار طريقةً لتطبيق الشروط المُعقّدة على كل عضو صفيف فردي.

مثال:

{
  "count": {
    "field": "Microsoft.Test/resourceType/stringArray[*]",
    "where": {
      "field": "Microsoft.Test/resourceType/stringArray[*]",
      "equals": "a"
    }
  },
  "equals": 1
}

من أجل تقييم التعبير count، يقوم سياسة Azure بتقييم الشرط where ثلاث مرات، مرة لكل عضو في stringArray، مما يحسب عدد المرات التي تم تقييمه فيها إلى true. where عندما يشير الشرط إلى Microsoft.Test/resourceType/stringArray[*] أعضاء الصفيف، بدلا من تحديد جميع أعضاء stringArray، فإنه يحدد عضو صفيف واحد فقط في كل مرة:

التكرار القيم Microsoft.Test/resourceType/stringArray[*] المحددة where نتيجة التقييم
1 "a" true
2 "b" false
3 "c" false

إن count تقوم بإرجاع 1.

فيما يلي تعبير أكثر تعقيدًا:

{
  "count": {
    "field": "Microsoft.Test/resourceType/objectArray[*]",
    "where": {
      "allOf": [
        {
          "field": "Microsoft.Test/resourceType/objectArray[*].property",
          "equals": "value2"
        },
        {
          "field": "Microsoft.Test/resourceType/objectArray[*].nestedArray[*]",
          "greater": 2
        }
      ]
    }
  },
  "equals": 1
}
التكرار القيم المحددة where نتيجة التقييم
1 Microsoft.Test/resourceType/objectArray[*].property=>"value1" Microsoft.Test/resourceType/objectArray[*].nestedArray[*]
=،>12
false
2 Microsoft.Test/resourceType/objectArray[*].property=>"value2" Microsoft.Test/resourceType/objectArray[*].nestedArray[*]
=،>34
true

إن count تقوم بإرجاع 1.

فحقيقة أن التعبير where يتم تقييمه مقابل محتوى الطلب بأكمله (مع تغييرات يتم إجراؤها على عضو الصفيف الذي يتم تعداده حاليًا فحسب) يعني أن الشرط where يمكن أن يشير أيضًا إلى حقول خارج الصفيف:

{
  "count": {
    "field": "Microsoft.Test/resourceType/objectArray[*]",
    "where": {
      "field": "tags.env",
      "equals": "prod"
    }
  },
  "equals": 0
}
التكرار القيم المحددة where نتيجة التقييم
1 tags.env =>"prod" true
2 tags.env =>"prod" true

يمكن استخدام تعبيرات العدد المتداخلة لتطبيق الشروط على حقول الصفيف المتداخلة. على سبيل المثال، يتحقق الشرط التالي من أن الصفيف objectArray[*] يحتوي على عضوين بهما nestedArray[*] عضو واحد أو أكثر:

{
  "count": {
    "field": "Microsoft.Test/resourceType/objectArray[*]",
    "where": {
      "count": {
        "field": "Microsoft.Test/resourceType/objectArray[*].nestedArray[*]"
      },
      "greaterOrEquals": 1
    }
  },
  "equals": 2
}
التكرار القيم المحددة نتيجة تقييم العدد المتداخل
1 Microsoft.Test/resourceType/objectArray[*].nestedArray[*] =>1، 2 nestedArray[*] يحتوي على عضوين =>true
2 Microsoft.Test/resourceType/objectArray[*].nestedArray[*] =>3، 4 nestedArray[*] يحتوي على عضوين =>true

نظرًا لأن كلا عضوين objectArray[*] يحتويان على صفيف فرعي nestedArray[*] تابع به عضوين، فإن تعبير العدد الخارجي يقوم بإرجاع 2.

مثال أكثر تعقيدًا: تحقق من أن الصفيف objectArray[*] يحتوي على عضوين بهما nestedArray[*] مع أي أعضاء يساوي 2 أو 3:

{
  "count": {
    "field": "Microsoft.Test/resourceType/objectArray[*]",
    "where": {
      "count": {
        "field": "Microsoft.Test/resourceType/objectArray[*].nestedArray[*]",
        "where": {
          "field": "Microsoft.Test/resourceType/objectArray[*].nestedArray[*]",
          "in": [
            2,
            3
          ]
        }
      },
      "greaterOrEquals": 1
    }
  },
  "equals": 2
}
التكرار القيم المحددة نتيجة تقييم العدد المتداخل
1 Microsoft.Test/resourceType/objectArray[*].nestedArray[*] =>1، 2 nestedArray[*] يحتوي على 2 =>true
2 Microsoft.Test/resourceType/objectArray[*].nestedArray[*] =>3، 4 nestedArray[*] يحتوي على 3 =>true

نظرا إلى أن كلا العضوين objectArray[*] يحتويان على صفيف فرعي nestedArray[*] تابع يحتوي إما على 2 أو 3، فإن تعبير العدد الخارجي يقوم بإرجاع 2.

إشعار

قد تشير تعبيرات عدد الحقول المتداخلة إلى الصفائف المُتداخلة فحسب. على سبيل المثال، يمكن أن يكون لتعبير العدد الذي يشير إلى Microsoft.Test/resourceType/objectArray[*] عدد متداخل يستهدف الصفيف Microsoft.Test/resourceType/objectArray[*].nestedArray[*]المتداخل، ولكن لا يمكن أن يكون له تعبير عدد متداخل يستهدف Microsoft.Test/resourceType/stringArray[*].

الوصول إلى عضو الصفيف الحالي باستخدام دالات القالب

عند استخدام دالات القالب، استخدم الدالة current() للوصول إلى قيمة عضو الصفيف الحالي أو قيم أي من خصائصه. للوصول إلى قيمة عضو الصفيف الحالي، قم بمرير الاسم المستعار المحدد في count.field أو أي من الأسماء المستعارة التابعة له كوسيطة للدالة current(). على سبيل المثال:

{
  "count": {
    "field": "Microsoft.Test/resourceType/objectArray[*]",
    "where": {
      "value": "[current('Microsoft.Test/resourceType/objectArray[*].property')]",
      "like": "value*"
    }
  },
  "equals": 2
}
التكرار current() القيمة المرجعة where نتيجة التقييم
1 إن قيمة property في العضو الأول من objectArray[*]: value1 true
2 إن قيمة property في العضو الأول من objectArray[*]: value2 true

دالة الحقل داخل المكان حيث الشروط

يمكن أن يتم استخدام دالة field() أيضًا للوصول إلى قيمة عضو الصفيف الحالي ما دام أن تعبير العد ليس داخل شرط وجود (field()تشير الدالة دائمًا إلى المورد الذي تم تقييمه في شرط if). يستند سلوك field() عند الإشارة إلى الصفيف المُقيم إلى المفاهيم التالية:

  • يتم حل الأسماء المستعارة للصفيف في مجموعة من القيم المُحدّدة من جميع أعضاء الصفيف.
  • تقوم دالات field() التي تشير إلى أسماء الصفيف المستعارة صفيفًا بالقيم المحددة.
  • تقوم الإشارة إلى الاسم المستعار للصفيف الذي تم حسابه داخل الشرط where بإرجاع مجموعة بقيمة واحدة محددة من عضو الصفيف الذي يتم تقييمه في التكرار الحالي.

يعني هذا السلوك أنه عند الإشارة إلى عضو الصفيف الذي تم حسابه مع دالة field() داخل الشرط where، فإنه يقوم بإرجاع صفيف مع عضو واحد. على الرغم من أن هذا السلوك قد لا يكون بديهيا، فإنه يتسق مع فكرة أن الأسماء المستعارة للصفيف ترجع دائما مجموعة من الخصائص المحددة. إليك مثال:

{
  "count": {
    "field": "Microsoft.Test/resourceType/stringArray[*]",
    "where": {
      "field": "Microsoft.Test/resourceType/stringArray[*]",
      "equals": "[field('Microsoft.Test/resourceType/stringArray[*]')]"
    }
  },
  "equals": 0
}
التكرار قيم التعبير where نتيجة التقييم
1 Microsoft.Test/resourceType/stringArray[*]= =>"a"
[field('Microsoft.Test/resourceType/stringArray[*]')] >[ "a" ]
false
2 Microsoft.Test/resourceType/stringArray[*]= =>"b"
[field('Microsoft.Test/resourceType/stringArray[*]')] >[ "b" ]
false
3 Microsoft.Test/resourceType/stringArray[*]= =>"c"
[field('Microsoft.Test/resourceType/stringArray[*]')] >[ "c" ]
false

لذلك، عند الحاجة إلى الوصول إلى قيمة الاسم المستعار للصفيف الذي تم حسابه باستخدام دالة field()، فإن الطريقة للقيام بذلك هي بتضمينها في دالة قالب first():

{
  "count": {
    "field": "Microsoft.Test/resourceType/stringArray[*]",
    "where": {
      "field": "Microsoft.Test/resourceType/stringArray[*]",
      "equals": "[first(field('Microsoft.Test/resourceType/stringArray[*]'))]"
    }
  }
}
التكرار قيم التعبير where نتيجة التقييم
1 Microsoft.Test/resourceType/stringArray[*]= =>"a"
[first(field('Microsoft.Test/resourceType/stringArray[*]'))] >"a"
true
2 Microsoft.Test/resourceType/stringArray[*]= =>"b"
[first(field('Microsoft.Test/resourceType/stringArray[*]'))] >"b"
true
3 Microsoft.Test/resourceType/stringArray[*]= =>"c"
[first(field('Microsoft.Test/resourceType/stringArray[*]'))] >"c"
true

للحصول على أمثلة مفيدة، راجع أمثلة عدد الحقول.

تعديل الصفائف

يقوم الإرفاق و التعديل بتعديل الخصائص في المورد أثناء الإنشاء أو التحديث. عند العمل مع خصائص الصفيف، يعتمد سلوك هذه التأثيرات على ما إذا كانت العملية تحاول تعديل [*] الاسم المستعار أم لا:

إشعار

إن استخدام modify التأثير مع الأسماء المستعارة قيد المعاينة حاليًا.

الاسم المستعار التأثير النتيجة
Microsoft.Storage/storageAccounts/networkAcls.ipRules append تقوم سياسة Azure بإرفاق الصفيف بأكمله المحدد في تفاصيل التأثير إذا كان مفقودًا.
Microsoft.Storage/storageAccounts/networkAcls.ipRules تعد modify مع عملية add تقوم سياسة Azure بإرفاق الصفيف بأكمله المحدد في تفاصيل التأثير إذا كان مفقودًا.
Microsoft.Storage/storageAccounts/networkAcls.ipRules تعد modify مع عملية addOrReplace تقوم سياسة Azure بإرفاق الصفيف بأكمله المحدد في تفاصيل التأثير إذا كان مفقودًا أو يستبدل الصفيف الموجود.
Microsoft.Storage/storageAccounts/networkAcls.ipRules[*] append تقوم سياسة Azure بإرفاق عضو الصفيف المحدد في تفاصيل التأثير.
Microsoft.Storage/storageAccounts/networkAcls.ipRules[*] تعد modify مع عملية add تقوم سياسة Azure بإرفاق عضو الصفيف المحدد في تفاصيل التأثير.
Microsoft.Storage/storageAccounts/networkAcls.ipRules[*] تعد modify مع عملية addOrReplace تزيل سياسة Azure جميع أعضاء الصفيف الحالية ويلحق عضو الصفيف المُحدّد في تفاصيل التأثير.
Microsoft.Storage/storageAccounts/networkAcls.ipRules[*].action append تقوم سياسة Azure بإرفاق القيمة بخاصية action لكل عضو صفيف.
Microsoft.Storage/storageAccounts/networkAcls.ipRules[*].action تعد modify مع عملية add تقوم سياسة Azure بإرفاق القيمة بخاصية action لكل عضو صفيف.
Microsoft.Storage/storageAccounts/networkAcls.ipRules[*].action تعد modify مع عملية addOrReplace تقوم سياسة Azure بإرفاق أو استبدال الخاصية action الموجودة لكل عضو صفيف.

لمزيد من المعلومات، راجع أمثلة الإرفاق.

المزيد من الأمثلة على الأسماء المستعارة

التوصية هي استخدام تعبيرات عدد الحقول للتحقق مما إذا كان allOfanyOf أعضاء الصفيف في محتوى الطلب يستوفون شرطا أم لا. بالنسبة لبعض الشروط البسيطة، من الممكن تحقيق نفس النتيجة باستخدام ملحق حقل مع اسم مستعار للصفيف كما هو موضح في الرجوع إلى مجموعة أعضاء الصفيف. يمكن أن يكون هذا النمط مفيدا في قواعد النهج التي تتجاوز حد التعبيرات المسموح بها count . فيما يلي أمثلة لحالات الاستخدام الشائعة:

مثال قاعدة النهج لجدول السيناريو التالي:

"policyRule": {
  "if": {
    "allOf": [
      {
        "field": "Microsoft.Storage/storageAccounts/networkAcls.ipRules",
        "exists": "true"
      },
            <-- Condition (see table below) -->
    ]
  },
  "then": {
    "effect": "[parameters('effectType')]"
  }
}

الصفيف ipRules كما يلي لجدول السيناريو التالي:

"ipRules": [
  {
    "value": "127.0.0.1",
    "action": "Allow"
  },
  {
    "value": "192.168.1.1",
    "action": "Allow"
  }
]

لكل من أمثلة الشرط التالية، استبدل <field> ب "field": "Microsoft.Storage/storageAccounts/networkAcls.ipRules[*].value".

النتائج التالية هي نتيجة الجمع بين الشرط وقاعدة النهج المثال وصفيف القيم الموجودة السابقة:

الشرط النتيجة السيناريو الشرح
{<field>,"notEquals":"127.0.0.1"} لا شيء لا شيء يتطابق يتم تقييم عنصر صفيف واحد على أنه خطأ (127.0.0.1 != 127.0.0.1) والآخر على أنه صحيح (127.0.0.1 != 192.168.1.1)، لذلك notEquals الشرط خطأ ولا يتم تشغيل التأثير.
{<field>,"notEquals":"10.0.4.1"} تأثير السياسة لا شيء يتطابق يتم تقييم كلا عنصري الصفيف على أنه صحيح (10.0.4.1 != 127.0.0.1 and 10.0.4.1 != 192.168.1.1)، لذلك notEquals الشرط صحيح ويتم تشغيل التأثير.
"not":{<field>,"notEquals":"127.0.0.1" } تأثير السياسة تطابق واحد أو أكثر يتم تقييم عنصر صفيف واحد على أنه خطأ (127.0.0.1 != 127.0.0.1) والآخر على أنه صحيح (127.0.0.1 != 192.168.1.1)، لذلك notEquals الشرط خطأ. يتم تقييم عامل التشغيل المنطقي على أنه صحيح (ليس خطأ)، لذلك يتم تشغيل التأثير.
"not":{<field>,"notEquals":"10.0.4.1"} لا شيء تطابق واحد أو أكثر يتم تقييم كلا عنصري الصفيف على أنه صحيح (10.0.4.1 != 127.0.0.1 and 10.0.4.1 != 192.168.1.1)، لذلك notEquals الشرط صحيح. يتم تقييم عامل التشغيل المنطقي على أنه خطأ (غير صحيح)، لذلك لا يتم تشغيل التأثير.
"not":{<field>,"Equals":"127.0.0.1"} تأثير السياسة لا يتطابق الجميع يتم تقييم عنصر صفيف واحد على أنه صحيح (127.0.0.1 == 127.0.0.1) والآخر على أنه خطأ (127.0.0.1 == 192.168.1.1)، لذلك Equals الشرط خطأ. يتم تقييم عامل التشغيل المنطقي على أنه صحيح (ليس خطأ)، لذلك يتم تشغيل التأثير.
"not":{<field>,"Equals":"10.0.4.1"} تأثير السياسة لا يتطابق الجميع يتم تقييم كلا عنصري الصفيف على أنه خطأ (10.0.4.1 == 127.0.0.1 and 10.0.4.1 == 192.168.1.1)، لذلك Equals الشرط خطأ. يتم تقييم عامل التشغيل المنطقي على أنه صحيح (ليس خطأ)، لذلك يتم تشغيل التأثير.
{<field>,"Equals":"127.0.0.1"} لا شيء يتطابق الجميع يتم تقييم عنصر صفيف واحد على أنه صحيح (127.0.0.1 == 127.0.0.1) والآخر على أنه خطأ (127.0.0.1 == 192.168.1.1)، لذلك Equals الشرط خطأ ولا يتم تشغيل التأثير.
{<field>,"Equals":"10.0.4.1"} لا شيء يتطابق الجميع يتم تقييم كلا عنصري الصفيف على أنه خطأ (10.0.4.1 == 127.0.0.1 and 10.0.4.1 == 192.168.1.1)، لذلك Equals الشرط خطأ ولا يتم تشغيل التأثير.

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