قاعدة نهج بنية تعريف نهج Azure

تتكون قاعدة النهج من if كتل و then . في if الكتلة، يمكنك تعريف شرط واحد أو أكثر يحدد وقت فرض النهج. يمكنك تطبيق عوامل التشغيل المنطقية على هذه الشروط لتحديد سيناريو النهج بدقة.

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

في then الكتلة، يمكنك تحديد التأثير الذي يحدث عند if استيفاء الشروط.

{
  "if": {
      <condition> | <logical operator>
  },
  "then": {
    "effect": "deny | audit | modify | denyAction | append | auditIfNotExists | deployIfNotExists | disabled"
  }
}

لمزيد من المعلومات حول policyRule، انتقل إلى مخطط تعريف النهج.

العوامل المنطقية

عوامل التشغيل المنطقية المدعومة هي:

  • "not": {condition or operator}
  • "allOf": [{condition or operator},{condition or operator}]
  • "anyOf": [{condition or operator},{condition or operator}]

يؤدي not بناء الجملة إلى عكس نتيجة الشرط. allOf يتطلب بناء الجملة (على غرار العملية المنطقيةand) أن تكون جميع الشروط صحيحة. anyOf يتطلب بناء الجملة (مشابه للعملية المنطقيةor) شرطا واحدا أو أكثر ليكون صحيحا.

يمكنك تداخل العوامل المنطقية. يوضح not المثال التالي عملية متداخلة allOf داخل عملية.

"if": {
  "allOf": [
    {
      "not": {
        "field": "tags",
        "containsKey": "application"
      }
    },
    {
      "field": "type",
      "equals": "Microsoft.Storage/storageAccounts"
    }
  ]
},

‏‏شروط

يقيم الشرط ما إذا كانت القيمة تفي بمعايير معينة. الشروط المدعومة هي:

  • "equals": "stringValue"
  • "notEquals": "stringValue"
  • "like": "stringValue"
  • "notLike": "stringValue"
  • "match": "stringValue"
  • "matchInsensitively": "stringValue"
  • "notMatch": "stringValue"
  • "notMatchInsensitively": "stringValue"
  • "contains": "stringValue"
  • "notContains": "stringValue"
  • "in": ["stringValue1","stringValue2"]
  • "notIn": ["stringValue1","stringValue2"]
  • "containsKey": "keyName"
  • "notContainsKey": "keyName"
  • "less": "dateValue" | "less": "stringValue" | "less": intValue
  • "lessOrEquals": "dateValue" | "lessOrEquals": "stringValue" | "lessOrEquals": intValue
  • "greater": "dateValue" | "greater": "stringValue" | "greater": intValue
  • "greaterOrEquals": "dateValue" | "greaterOrEquals": "stringValue" | "greaterOrEquals": intValue
  • "exists": "bool"

بالنسبة إلى lessو greaterlessOrEqualsو و، greaterOrEqualsإذا لم يتطابق نوع الخاصية مع نوع الشرط، يتم طرح خطأ. يتم إجراء مقارنات السلسلة باستخدام InvariantCultureIgnoreCase.

عند استخدام الشرطين like و notLike ، يمكنك توفير حرف بدل (*) في القيمة. يجب ألا تحتوي القيمة على أكثر من حرف بدل واحد.

عند استخدام الشرطين match و notMatch ، قم بتوفير علامة تجزئة (#) لمطابقة رقم وعلامة استفهام (?) لحرف ونقطة (.) لمطابقة أي حرف وأي حرف آخر لمطابقة هذا الحرف الفعلي. بينما match تكون و notMatch حساسة لحالة الأحرف، فإن جميع الشروط الأخرى التي تقيم stringValue غير حساسة لحالة الأحرف. تتوفر بدائل غير حساسة لحالة الأحرف في matchInsensitively و notMatchInsensitively.

الحقول

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

  • name

  • fullName

    • إرجاع الاسم الكامل للمورد. الاسم الكامل للمورد هو اسم المورد الذي تم إلحاقه مسبقا بأي أسماء موارد أصل (على سبيل المثال myServer/myDatabase).
  • kind

  • type

  • location

    • تتم تسوية حقول الموقع لدعم تنسيقات مختلفة. على سبيل المثال، East US 2 يعتبر مساويا لـ eastus2.
    • استخدم global للموارد غير المحددة للموقع.
  • id

    • يرجع معرف المورد للمورد الذي يتم تقييمه.
    • مثال: /subscriptions/11111111-1111-1111-1111-111111111111/resourceGroups/myRG/providers/Microsoft.KeyVault/vaults/myVault
  • identity.type

  • tags

  • tags['<tagName>']

    • يدعم بناء جملة القوس هذا أسماء العلامات التي تحتوي على علامات ترقيم، مثل واصلة أو نقطة أو مسافة.
    • أين tagName هو اسم العلامة للتحقق من صحة الشرط.
    • أمثلة: tags['Acct.CostCenter'] حيث Acct.CostCenter هو اسم العلامة.
  • tags['''<tagName>''']

    • يدعم بناء الجملة المحتوي على القوس أسماء العلامات التي تحتوي على فاصلات اقتباس بداخلها عن طريق الإفلات بفاصلات اقتباس مزدوجة.
    • أين tagName هو اسم العلامة للتحقق من صحة الشرط.
    • مثال: tags['''My.Apostrophe.Tag'''] حيث 'My.Apostrophe.Tag' هو اسم العلامة.

    إشعار

    tags.<tagName> وtags[tagName]وtags[tag.with.dots] لا تزال الطرق المقبولة للإعلان عن حقل علامات. ومع ذلك، التعبيرات المفضلة هي تلك المذكورة أعلاه.

  • الأسماء المستعارة للخاصية - للحصول على قائمة، راجع الأسماء المستعارة.

    إشعار

    في field التعبيرات التي تشير إلى الاسم المستعار [*] للصفيف يتم تقييم كل عنصر في الصفيف بشكل فردي مع منطقي and بين العناصر. لمزيد من المعلومات، راجع الرجوع إلى خصائص مورد الصفيف.

يمكن أن تحل الشروط التي تستخدم field التعبيرات محل بناء جملة "source": "action"تعريف النهج القديم ، والذي يستخدم للعمل في عمليات الكتابة. على سبيل المثال، لم يعد هذا مدعوما:

{
  "source": "action",
  "like": "Microsoft.Network/publicIPAddresses/*"
}

ولكن يمكن تحقيق السلوك المطلوب باستخدام field المنطق:

{
  "field": "type",
  "equals": "Microsoft.Network/publicIPAddresses"
}

استخدام العلامات مع المعلمات

يمكن تمرير قيمة معلمة إلى حقل علامة. يؤدي تمرير معلمة إلى حقل علامة إلى زيادة مرونة تعريف النهج أثناء تعيين النهج.

في المثال التالي، concat يتم استخدام لإنشاء بحث حقل علامات عن العلامة المسماة قيمة المعلمة tagName . إذا لم تكن هذه العلامة موجودة، modify يتم استخدام التأثير لإضافة العلامة باستخدام قيمة نفس العلامة المسماة التي تم تعيينها على مجموعة الموارد الأصلية للموارد التي تم تدقيقها باستخدام دالة resourcegroup() البحث.

{
  "if": {
    "field": "[concat('tags[', parameters('tagName'), ']')]",
    "exists": "false"
  },
  "then": {
    "effect": "modify",
    "details": {
      "operations": [
        {
          "operation": "add",
          "field": "[concat('tags[', parameters('tagName'), ']')]",
          "value": "[resourcegroup().tags[parameters('tagName')]]"
        }
      ],
      "roleDefinitionIds": [
        "/providers/microsoft.authorization/roleDefinitions/4a9ae827-6dc8-4573-8ac7-8239d42aa03f"
      ]
    }
  }
}

القيمة‬

الشروط التي تقيم ما إذا كانت القيمة تفي بمعايير معينة يمكن تشكيلها باستخدام value تعبير. يمكن أن تكون القيم قيماً حرفية أو قيم معلمات أو القيم التي تم إرجاعها لأي دالات قالب معتمدة.

تحذير

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

أمثلة القيمة

يستخدم value مثال قاعدة النهج هذا لمقارنة نتيجة الدالة resourceGroup() والخاصية التي تم إرجاعها name بشرط like .*netrg ترفض القاعدة أي مورد ليس من Microsoft.Network/*type في أي مجموعة موارد ينتهي اسمها ب *netrg.

{
  "if": {
    "allOf": [
      {
        "value": "[resourceGroup().name]",
        "like": "*netrg"
      },
      {
        "field": "type",
        "notLike": "Microsoft.Network/*"
      }
    ]
  },
  "then": {
    "effect": "deny"
  }
}

يستخدم value مثال قاعدة النهج هذا للتحقق مما إذا كانت نتيجة دالات متداخلة equalstrueمتعددة . ترفض القاعدة أي مورد لا يحتوي على ثلاث علامات على الأقل.

{
  "mode": "indexed",
  "policyRule": {
    "if": {
      "value": "[less(length(field('tags')), 3)]",
      "equals": "true"
    },
    "then": {
      "effect": "deny"
    }
  }
}

تجنب فشل القالب

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

{
  "policyRule": {
    "if": {
      "value": "[substring(field('name'), 0, 3)]",
      "equals": "abc"
    },
    "then": {
      "effect": "audit"
    }
  }
}

تستخدم قاعدة نهج المثال أعلاه السلسلة الفرعية () لمقارنة الأحرف الثلاثة الأولى من name ب abc. إذا كانت name أقصر من ثلاثة أحرف، ينتج عن الدالة substring() خطأ. يؤدي هذا الخطأ إلى أن يصبح النهج تأثيرا deny .

بدلا من ذلك، استخدم الدالة if() للتحقق مما إذا كانت الأحرف الثلاثة الأولى من name يساوي abc دون السماح name لأقصر من ثلاثة أحرف بالتسبب في حدوث خطأ:

{
  "policyRule": {
    "if": {
      "value": "[if(greaterOrEquals(length(field('name')), 3), substring(field('name'), 0, 3), 'not starting with abc')]",
      "equals": "abc"
    },
    "then": {
      "effect": "audit"
    }
  }
}

مع قاعدة النهج المنقحة، if() يتحقق من name طول قبل محاولة الحصول substring() على قيمة بأقل من ثلاثة أحرف. إذا كانت name قصيرة جدا، يتم إرجاع القيمة "لا تبدأ ب abc" بدلا من ذلك ومقارنتها ب abc. لا يزال المورد الذي يحمل اسما قصيرا لا يبدأ ب abc يفشل في قاعدة النهج، ولكنه لم يعد يتسبب في حدوث خطأ أثناء التقييم.

عدد

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

عدد الحقول

حساب عدد أعضاء الصفيف في حمولة الطلب التي تفي بتعبير الشرط. بنية field count التعبيرات هي:

{
  "count": {
    "field": "<[*] alias>",
    "where": {
      /* condition expression */
    }
  },
  "<condition>": "<compare the count of true condition expression array members to this value>"
}

يتم استخدام الخصائص التالية مع field count:

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

لمزيد من التفاصيل حول كيفية العمل مع خصائص الصفيف في Azure Policy، بما في ذلك شرح مفصل حول كيفية field count تقييم التعبير، راجع الرجوع إلى خصائص مورد الصفيف.

عدد القيم

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

{
  "count": {
    "value": "<literal array | array parameter reference>",
    "name": "<index name>",
    "where": {
      /* condition expression */
    }
  },
  "<condition>": "<compare the count of true condition expression array members to this value>"
}

يتم استخدام الخصائص التالية مع value count:

  • count.value (مطلوب): الصفيف المراد تقييمه.
  • count.name (مطلوب): اسم الفهرس، يتكون من أحرف وأرقام إنجليزية. تعريف اسم لقيمة عضو الصفيف الذي تم تقييمه في التكرار الحالي. يتم استخدام الاسم للإشارة إلى القيمة الحالية داخل الشرط count.where. اختياري عندما count لا يكون التعبير في تعبير تابع لتعبير آخر count . عند عدم توفيره، يتم تعيين اسم الفهرس ضمنياً إلى "default".
  • count.where (اختياري): تعبير الشرط المراد تقييمه بشكل فردي لكل عضو صفيف من count.value. إذا لم يتم توفير هذه الخاصية، يتم تقييم جميع أعضاء الصفيف إلى true. يمكن استخدام أي شرط داخل هذه الخاصية. يمكن استخدام عوامل التشغيل المنطقية داخل هذه الخاصية لإنشاء متطلبات تقييم معقدة. يمكن الوصول إلى قيمة عضو الصفيف الذي تم تعداده حالياً عن طريق استدعاء الدالة الحالية.
  • condition (مطلوب): تتم مقارنة القيمة بعدد العناصر التي تفي بتعبير count.where الشرط. يجب استخدام شرط رقمي.

الدالة الحالية

تتوفر الدالة current() فقط داخل الشرط count.where. تقوم بإرجاع قيمة عضو الصفيف الذي تم تعداده حاليا بواسطة count تقييم التعبير.

استخدام عدد القيم

  • current(<index name defined in count.name>). على سبيل المثال: current('arrayMember').
  • current(). مسموح به فقط عندما value count لا يكون التعبير تابعا لتعبير آخر count . إرجاع نفس القيمة كما هو موضح أعلاه.

إذا كانت القيمة التي تم إرجاعها بواسطة الاستدعاء عنصرًا، يتم دعم موصلات الخصائص. على سبيل المثال: current('objectArrayMember').property.

استخدام عدد الحقول

  • current(<the array alias defined in count.field>). على سبيل المثال، current('Microsoft.Test/resource/enumeratedArray[*]')
  • current(). مسموح به فقط عندما field count لا يكون التعبير تابعا لتعبير آخر count . إرجاع نفس القيمة كما هو موضح أعلاه.
  • current(<alias of a property of the array member>). على سبيل المثال، current('Microsoft.Test/resource/enumeratedArray[*].property')

أمثلة على عدد الحقول

مثال 1: تحقق مما إذا كان الصفيف فارغاً

{
  "count": {
    "field": "Microsoft.Network/networkSecurityGroups/securityRules[*]"
  },
  "equals": 0
}

مثال 2: التحقق من وجود عضو صفيف واحد فقط لتلبية تعبير الشرط

{
  "count": {
    "field": "Microsoft.Network/networkSecurityGroups/securityRules[*]",
    "where": {
      "field": "Microsoft.Network/networkSecurityGroups/securityRules[*].description",
      "equals": "My unique description"
    }
  },
  "equals": 1
}

مثال 3: التحقق من وجود عضو صفيف واحد على الأقل لتلبية تعبير الشرط

{
  "count": {
    "field": "Microsoft.Network/networkSecurityGroups/securityRules[*]",
    "where": {
      "field": "Microsoft.Network/networkSecurityGroups/securityRules[*].description",
      "equals": "My common description"
    }
  },
  "greaterOrEquals": 1
}

مثال 4: تحقق من أن جميع أعضاء صفيف العنصر يستوفون تعبير الشرط

{
  "count": {
    "field": "Microsoft.Network/networkSecurityGroups/securityRules[*]",
    "where": {
      "field": "Microsoft.Network/networkSecurityGroups/securityRules[*].description",
      "equals": "description"
    }
  },
  "equals": "[length(field('Microsoft.Network/networkSecurityGroups/securityRules[*]'))]"
}

مثال 5: تحقق من تطابق عضو صفيف واحد على الأقل مع خصائص متعددة في تعبير الشرط

{
  "count": {
    "field": "Microsoft.Network/networkSecurityGroups/securityRules[*]",
    "where": {
      "allOf": [
        {
          "field": "Microsoft.Network/networkSecurityGroups/securityRules[*].direction",
          "equals": "Inbound"
        },
        {
          "field": "Microsoft.Network/networkSecurityGroups/securityRules[*].access",
          "equals": "Allow"
        },
        {
          "field": "Microsoft.Network/networkSecurityGroups/securityRules[*].destinationPortRange",
          "equals": "3389"
        }
      ]
    }
  },
  "greater": 0
}

مثال 6: استخدم الدالة current() داخل الشروط where للوصول إلى قيمة عضو الصفيف الذي تم تعداده حالياً في دالة قالب. يتحقق هذا الشرط مما إذا كانت الشبكة الظاهرية تحتوي على بادئة عنوان ليست ضمن نطاق CIDR 10.0.0.0/24.

{
  "count": {
    "field": "Microsoft.Network/virtualNetworks/addressSpace.addressPrefixes[*]",
    "where": {
      "value": "[ipRangeContains('10.0.0.0/24', current('Microsoft.Network/virtualNetworks/addressSpace.addressPrefixes[*]'))]",
      "equals": false
    }
  },
  "greater": 0
}

مثال 7: استخدم الدالة field() داخل الشروط where للوصول إلى قيمة عضو الصفيف الذي تم تعداده حالياً. يتحقق هذا الشرط مما إذا كانت الشبكة الظاهرية تحتوي على بادئة عنوان ليست ضمن نطاق CIDR 10.0.0.0/24.

{
  "count": {
    "field": "Microsoft.Network/virtualNetworks/addressSpace.addressPrefixes[*]",
    "where": {
      "value": "[ipRangeContains('10.0.0.0/24', first(field(('Microsoft.Network/virtualNetworks/addressSpace.addressPrefixes[*]')))]",
      "equals": false
    }
  },
  "greater": 0
}

أمثلة على عدد القيم

مثال 1: تحقق مما إذا كان اسم المورد يطابق أيًا من أنماط الاسم المحددة.

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

مثال 2: تحقق مما إذا كان اسم المورد يطابق أيًا من أنماط الاسم المحددة. لا تحدد الدالة current() اسم فهرس. والنتيجة هي نفس المثال السابق.

{
  "count": {
    "value": [
      "prefix1_*",
      "prefix2_*"
    ],
    "where": {
      "field": "name",
      "like": "[current()]"
    }
  },
  "greater": 0
}

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

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

مثال 4: تحقق مما إذا كانت أي من بادئات عناوين الشبكة الظاهرية ليست ضمن قائمة البادئات المعتمدة.

{
  "count": {
    "field": "Microsoft.Network/virtualNetworks/addressSpace.addressPrefixes[*]",
    "where": {
      "count": {
        "value": "[parameters('approvedPrefixes')]",
        "name": "approvedPrefix",
        "where": {
          "value": "[ipRangeContains(current('approvedPrefix'), current('Microsoft.Network/virtualNetworks/addressSpace.addressPrefixes[*]'))]",
          "equals": true
        },
      },
      "equals": 0
    }
  },
  "greater": 0
}

مثال 5: تحقق من تعريف جميع قواعد NSG المحجوزة في NSG. يتم تعريف خصائص قواعد NSG المحجوزة في معلمة صفيف تحتوي على عناصر.

قيمة المعلمة:

[
  {
    "priority": 101,
    "access": "deny",
    "direction": "inbound",
    "destinationPortRange": 22
  },
  {
    "priority": 102,
    "access": "deny",
    "direction": "inbound",
    "destinationPortRange": 3389
  }
]

النهج:

{
  "count": {
    "value": "[parameters('reservedNsgRules')]",
    "name": "reservedNsgRule",
    "where": {
      "count": {
        "field": "Microsoft.Network/networkSecurityGroups/securityRules[*]",
        "where": {
          "allOf": [
            {
              "field": "Microsoft.Network/networkSecurityGroups/securityRules[*].priority",
              "equals": "[current('reservedNsgRule').priority]"
            },
            {
              "field": "Microsoft.Network/networkSecurityGroups/securityRules[*].access",
              "equals": "[current('reservedNsgRule').access]"
            },
            {
              "field": "Microsoft.Network/networkSecurityGroups/securityRules[*].direction",
              "equals": "[current('reservedNsgRule').direction]"
            },
            {
              "field": "Microsoft.Network/networkSecurityGroups/securityRules[*].destinationPortRange",
              "equals": "[current('reservedNsgRule').destinationPortRange]"
            }
          ]
        }
      },
      "equals": 1
    }
  },
  "equals": "[length(parameters('reservedNsgRules'))]"
}

وظائف النهج

يمكن استخدام الدالات لإدخال منطق إضافي في قاعدة النهج. يتم حلها ضمن قاعدة النهج لتعريف النهج وضمن قيم المعلمات المعينة لتعريفات النهج في مبادرة.

تتوفر جميع دالات القالب Resource Manager لاستخدامها ضمن قاعدة نهج، باستثناء الدالات التالية والدالات المعرفة من قبل المستخدم:

  • copyIndex()
  • dateTimeAdd()
  • dateTimeFromEpoch
  • dateTimeToEpoch
  • deployment()
  • environment()
  • extensionResourceId()
  • lambda() لمزيد من المعلومات، انتقل إلى lambda
  • listAccountSas()
  • listKeys()
  • listSecrets()
  • list*
  • managementGroup()
  • newGuid()
  • pickZones()
  • providers()
  • reference()
  • resourceId()
  • subscriptionResourceId()
  • tenantResourceId()
  • tenant()
  • variables()

إشعار

لا تزال هذه الوظائف متوفرة ضمن details.deployment.properties.template جزء نشر القالب في تعريف النهج deployIfNotExists .

تتوفر الدالة التالية لاستخدامها في قاعدة نهج، ولكنها تختلف عن استخدامها في قالب Azure Resource Manager (قالب ARM):

  • utcNow() - على عكس قالب ARM، يمكن استخدام هذه الخاصية خارج defaultValue.
    • تقوم بإرجاع سلسلة تم تعيينها إلى التاريخ والوقت الحاليين بتنسيق Universal ISO 8601 DateTime format yyyy-MM-ddTHH:mm:ss.fffffffZ.

تتوفر الدالات التالية فقط في قواعد النهج:

  • addDays(dateTime, numberOfDaysToAdd)

    • dateTime: [مطلوب] سلسلة - سلسلة بتنسيق UNIVERSAL ISO 8601 DateTime 'yyyy-MM-ddTHH:mm:ss. FFFFFFFZ'
    • numberOfDaysToAdd: [مطلوب] عدد صحيح - عدد الأيام المراد إضافتها
  • field(fieldName)

    • fieldName: سلسلة [مطلوب] - اسم الحقل المراد استرداده
    • إرجاع قيمة هذا الحقل من المورد الذي يتم تقييمه بواسطة شرط If.
    • field يستخدم بشكل أساسي مع auditIfNotExists و deployIfNotExists للإشارة إلى الحقول على المورد الذي يتم تقييمه. يمكن مشاهدة مثال على هذا الاستخدام في مثال DeployIfNotExists.
  • requestContext().apiVersion

    • يُعرض إصدار واجهة برمجة التطبيقات للطلب الذي قام بتشغيل تقييم النهج (على سبيل المثال: 2021-09-01). هذه القيمة هي إصدار واجهة برمجة التطبيقات الذي تم استخدامه في طلب PUT/PATCH للتقييمات حول إنشاء/تحديث الموارد. يتم استخدام أحدث إصدار من واجهة برمجة التطبيقات دائما أثناء تقييم التوافق على الموارد الموجودة.
  • policy()

    • إرجاع المعلومات التالية حول النهج الذي يتم تقييمه. يمكن الوصول إلى الخصائص من العنصر الذي تم إرجاعه (مثال: [policy().assignmentId]).

      {
        "assignmentId": "/subscriptions/11111111-1111-1111-1111-111111111111/providers/Microsoft.Authorization/policyAssignments/myAssignment",
        "definitionId": "/providers/Microsoft.Authorization/policyDefinitions/34c877ad-507e-4c82-993e-3452a6e0ad3c",
        "setDefinitionId": "/providers/Microsoft.Authorization/policySetDefinitions/42a694ed-f65e-42b2-aa9e-8052e9740a92",
        "definitionReferenceId": "StorageAccountNetworkACLs"
      }
      
  • ipRangeContains(range, targetRange)

    • range: [مطلوب] سلسلة - سلسلة تحدد نطاق عناوين IP للتحقق مما إذا كان targetRange داخل.
    • targetRange: سلسلة [مطلوب] - سلسلة تحدد نطاقا من عناوين IP للتحقق من صحتها كما هو مضمن داخل النطاق.
    • يعرض قيمة منطقية لمعرفة ما إذا كان نطاق عناوين IP للنطاق يحتوي على نطاق عنوان IP targetRange. لا يُسمح بالنطاقات الفارغة أو الاختلاط بين عائلات IP، ويؤدي إلى فشل التقييم.

    التنسيقات المدعومة:

    • عنوان IP واحد (أمثلة: 10.0.0.0، 2001:0DB8::3:FFFE)
    • نطاق CIDR (أمثلة: 10.0.0.0/24، 2001:0DB8::/110)
    • النطاق المحدد بواسطة عناوين IP للبدء والانتهاء (أمثلة: 192.168.0.1-192.168.0.9، 2001:0DB8::-2001:0DB8::3:FFFF)
  • current(indexName)

مثال دالة النهج

يستخدم مثال قاعدة النهج هذا دالة resourceGroup المورد للحصول على name الخاصية، جنبا إلى جنب مع concat دالة الصفيف والعنصر لإنشاء like شرط يفرض اسم المورد للبدء باسم مجموعة الموارد.

{
  "if": {
    "not": {
      "field": "name",
      "like": "[concat(resourceGroup().name,'*')]"
    }
  },
  "then": {
    "effect": "deny"
  }
}

حدود قواعد النهج

الحدود المفروضة أثناء التأليف

يتم فرض حدود لبنية قواعد النهج أثناء تأليف النهج أو تعيينه. ستفشل محاولات إنشاء تعريفات النهج التي تتجاوز هذه الحدود أو تعيينها.

الحد القيمة‬ التفاصيل الإضافية
تعبيرات الشرط في if الشرط 4096
تعبيرات الشرط في then الكتلة 128 ينطبق على النهج existenceConditionauditIfNotExists و deployIfNotExists
وظائف النهج لكل قاعدة نهج 2048
عدد المعلمات لدالة النهج 128 مثال: [function('parameter1', 'parameter2', ...)]
عمق دالات النهج المتداخلة 64 مثال: [function(nested1(nested2(...)))]
طول سلسلة تعبير دالات النهج 81920 مثال: طول "[function(....)]"
Field count التعبيرات لكل صفيف 5
Value count التعبيرات لكل قاعدة نهج 10
Value count عدد تكرار التعبيرات 100 بالنسبة للتعبيرات المتداخلة Value count ، يتضمن هذا أيضا عدد التكرارات للتعبير الأصل

الحدود المفروضة أثناء التقييم

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

{
  "field": "name",
  "equals": "[concat(field('stringPropertyA'), field('stringPropertyB'))]"
}

يعتمد طول السلسلة التي تم إنشاؤها بواسطة الدالة concat() على قيمة الخصائص في المورد الذي تم تقييمه.

الحد القيمة‬ مثال
طول السلسلة التي تم إرجاعها بواسطة دالة 131072 [concat(field('longString1'), field('longString2'))]
عمق العناصر المعقدة التي يتم توفيرها كمعلمة لدالة أو يتم إرجاعها بواسطة دالة 128 [union(field('largeObject1'), field('largeObject2'))]
عدد عقد العناصر المعقدة المقدمة كمعلمة لدالة أو التي يتم إرجاعها بواسطة دالة 32768 [concat(field('largeArray1'), field('largeArray2'))]

تحذير

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

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