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

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

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

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

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

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

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

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

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

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

    }
}

ملاحظة

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

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

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

عند تعيين السياسة من خلال مدخل Azure، يتم عرض معلمة صفيفالنوع كمربع نص واحد. يذكر التلميح "استخدام؛ لفصل القيم. (مثل لندن؛ نيويورك)". لتمرير قيم الموقع المسموح بها لـ eastus2، و eastus، و westus2 إلى المعلمة، استخدم السلسلة التالية:

eastus2;eastus;westus2

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

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

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

  • Azure CLI: الأمر az policy assignment create بمعلمة params
  • Azure PowerShell: Cmdlet New-AzPolicyAssignment بمعلمة PolicyParameter
  • واجهة برمجة تطبيقات REST: في عملية إنشاء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.

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

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

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

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

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

{
    "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_"
    }
    

يتضمن شرط الحقل سلوك "كل من" الضمني. إذا كان الاسم المستعار يمثل مجموعة من القيم، فإنه يتحقق مما إذا كانت جميع القيم الفردية تفي بالشرط. تقوم الدالة 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 يساوي "القيمة" فحسب.

{
  "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, 3, 4

عند استخدام الدالة 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. عند تحديده، تقوم سياسة Azure بتعداد أعضاء الصفيف وتقييم كل منها مقابل الشرط، مع حساب عدد أعضاء الصفيف الذين تم تقييمهم إلى true. على وجه التحديد، في كل تكرار لتقييم الشرط where، تُحدّد سياسة Azure عضو صفيف واحد 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[*] =>1، 2
false
2 Microsoft.Test/resourceType/objectArray[*].property =>"value2"
Microsoft.Test/resourceType/objectArray[*].nestedArray[*] =>3، 4
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() عند الإشارة إلى الصفيف المُقيم إلى المفاهيم التالية:

  1. يتم حل الأسماء المستعارة للصفيف في مجموعة من القيم المُحدّدة من جميع أعضاء الصفيف.
  2. تقوم دالات field() التي تشير إلى أسماء الصفيف المستعارة صفيفًا بالقيم المحددة.
  3. تقوم الإشارة إلى الاسم المستعار للصفيف الذي تم حسابه داخل الشرط 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 الموجودة لكل عضو صفيف.

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

أمثلة الأسماء المستعارة [*] الإضافية

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

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

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

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