Создание политик для свойств массива ресурсов Azure

Свойства Azure Resource Manager обычно определяются как строки и логические значения. Если существует связь "один ко многим", то сложные свойства определяются как массивы. В Политике Azure массивы используются несколькими различными способами:

В этой статье рассматривается каждый вариант использования в Политике Azure и приводится несколько примеров определений.

Массивы параметров

Определение массива параметров

Определение параметра в качестве массива обеспечивает гибкость политики, если требуется более одного значения. Это определение политики позволяет использовать любое отдельное расположение для параметра 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 Использование является необязательным.

Передача значений в массив параметров во время назначения

При назначении политики через портал Azure параметр массива отображается в виде одного текстового type поля. Подсказка говорит Use ; to separate values. (e.g. London;New York). Чтобы передать допустимые значения расположения eastus2, eastus и westus2 в параметр, используйте следующую строку:

eastus2;eastus;westus2

Формат значения параметра различается при использовании Azure CLI, Azure PowerShell или REST API. Значения передаются в строке JSON, которая также содержит имя параметра.

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

Чтобы использовать эту строку с каждым пакетом SDK, выполните следующие команды:

  • Azure CLI: команда az policy assignment create with parameter params.
  • Azure PowerShell: командлет New-AzPolicyAssignment с параметром PolicyParameter.
  • REST API: в операции создания PUT в составе текста запроса в качестве значения properties.parameters свойства.

Использование массивов в условиях

In и notIn

Условия in и notIn работают только со значениями массива. Они проверяют существование значения в массиве. Массивом может быть литеральный массив JSON или ссылка на параметр массива. Например:

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

Value count

Выражение value count показывает, сколько элементов массива соответствуют условию. Оно позволяет вычислять одно и то же условие несколько раз, используя при каждой итерации разные значения. Например, следующее условие проверяет, соответствует ли имя ресурса какому-либо шаблону из массива шаблонов:

{
  "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*"

Условие имеет значение true, только если полученное количество больше 0.

Чтобы сделать предыдущее условие более универсальным, используйте ссылку parameters вместо литерального массива:

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

value count Если выражение не находится под другим count выражением, является необязательным и current() count.name функция может использоваться без каких-либо аргументов:

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

Полезные примеры см. в разделе Примеры выражений value count.

Ссылки на свойства ресурсов массива

Во многих вариантах использования требуется работа со свойствами массива в оцениваемом ресурсе. Для некоторых сценариев требуется ссылка на весь массив (например, проверка его длины). Другие требуют применения условия к каждому отдельному элементу массива (например, проверки того, что все правила брандмауэра блокируют доступ из Интернета). Основные сведения о различных способах, с помощью которых Политика 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() возвращаемое значение представляет собой массив из содержимого запроса, который затем можно использовать с любыми поддерживаемыми функциями шаблонов, принимающими аргументы массива. Например, следующее условие проверяет, больше ли 0 длина значения stringArray:

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

Ссылка на коллекцию элементов массива

Псевдонимы, использующие [*] синтаксис, представляют коллекцию значений свойств, выбранных из свойства массива, который отличается от выбора самого свойства массива. Например, Microsoft.Test/resourceType/stringArray[*] возвращает коллекцию, в которую входят все члены stringArray. Как упоминалось ранее, field условие проверяет, соответствует ли все выбранные свойства ресурса условию, поэтому следующее условие имеет значение true, только если все члены stringArray равны "value".

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

Если массив пуст, условие оценивается как true, так как элемент массива не нарушается. В этом сценарии рекомендуется использовать выражение счетчика. Если массив содержит объекты, псевдоним [*] можно использовать для выбора значения определенного свойства из каждого члена массива. Пример:

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

Это условие имеет значение true, если значения всех свойств property в objectArray равны значению параметра "value". Дополнительные примеры см . в дополнительных примерах псевдонимов.

При использовании функции field() для ссылки на псевдоним массива возвращаемое значение является массивом всех выбранных значений. Такое поведение означает, что основной способ использования функции field(), способность применять функции шаблонов к значениям свойств ресурсов, ограничен. В этом случае можно использовать только те функции шаблона, которые принимают аргументы массива. Например, с помощью функции [length(field('Microsoft.Test/resourceType/objectArray[*].property'))] можно получить длину массива. Однако более сложные сценарии, такие как применение функции шаблона к каждому элементу массива и его сравнение с нужным значением, возможны только при использовании выражения count. Дополнительные сведения см. в разделе Выражение field 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, , 234

При использовании 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]

Выражения field count

Выражение field count подсчитывает, сколько элементов массива соответствуют условию, и сравнивает их количество с целевым значением. Выражение 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 выбирает один член 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
}
Итерация Выбранные значения Результат вложенной оценки выражения count
1 Microsoft.Test/resourceType/objectArray[*].nestedArray[*] =>1, 2 nestedArray[*] содержит 2 элемента измерения =>true
2 Microsoft.Test/resourceType/objectArray[*].nestedArray[*] =>3, 4 nestedArray[*] содержит 2 элемента измерения =>true

Поскольку оба элемента objectArray[*] имеют дочерний массив nestedArray[*] с двумя элементами, внешнее выражение count возвращает значение 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
}
Итерация Выбранные значения Результат вложенной оценки выражения count
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, внешнее выражение count возвращает значение 2.

Примечание.

Вложенные выражения field count могут ссылаться только на вложенные массивы. Например, выражение count, ссылающееся на Microsoft.Test/resourceType/objectArray[*], может иметь вложенное выражение count, направленное на вложенный массив Microsoft.Test/resourceType/objectArray[*].nestedArray[*], но не может иметь вложенное выражение count, направленное на массив 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 в условиях where

Функцию field() можно также использовать для доступа к значению текущего элемента массива, если выражение count не находится внутри условия существования (функция 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

Полезные примеры см. в разделе Примеры выражений field count.

Изменение массивов

Свойства append и modify изменяют свойства ресурса в процессе создания или обновления. При работе со свойствами массива поведение этих эффектов зависит от того, пытается ли операция изменить [*] псевдоним.

Примечание.

Использование этого эффекта 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 каждого элемента массива.

Дополнительные сведения см. в примерах добавления.

Дополнительные примеры псевдонимов

Рекомендуется использовать выражения счетчика полей, чтобы проверить, соответствуют ли anyOf allOfчлены массива в содержимом запроса. Для некоторых простых условий можно добиться того же результата, используя метод доступа к полям с псевдонимом массива, как описано в разделе "Ссылка на коллекцию элементов массива". Этот шаблон может быть полезен в правилах политики, превышающих ограничение допустимых 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".

Следующие результаты являются результатом сочетания условия и примера правила политики и массива предыдущих существующих значений:

Condition Результат Сценарий Описание
{<field>,"notEquals":"127.0.0.1"} Ничего Ни одного совпадения Один элемент массива оценивается как false (127.0.0.1 != 127.0.0.1) и один как true (127.0.0.1 != 192.168.1.1), поэтому notEquals условие равно false , и эффект не активируется.
{<field>,"notEquals":"10.0.4.1"} Эффект политики Ни одного совпадения Оба элемента массива оцениваются как true (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" } Эффект политики Одно или несколько совпадений Один элемент массива вычисляется как false (127.0.0.1 != 127.0.0.1) и один как true (127.0.0.1 != 192.168.1.1), поэтому notEquals условие равно false. Логический оператор оценивается как true (не false), поэтому эффект активируется.
"not":{<field>,"notEquals":"10.0.4.1"} Ничего Одно или несколько совпадений Оба элемента массива оцениваются как true (10.0.4.1 != 127.0.0.1 and 10.0.4.1 != 192.168.1.1), поэтому notEquals условие имеет значение true. Логический оператор оценивается как false (не true), поэтому эффект не активируется.
"not":{<field>,"Equals":"127.0.0.1"} Эффект политики Не все совпадают Один элемент массива оценивается как true (127.0.0.1 == 127.0.0.1) и один как false (127.0.0.1 == 192.168.1.1), поэтому Equals условие равно false. Логический оператор оценивается как true (не false), поэтому эффект активируется.
"not":{<field>,"Equals":"10.0.4.1"} Эффект политики Не все совпадают Оба элемента массива оцениваются как false (10.0.4.1 == 127.0.0.1 and 10.0.4.1 == 192.168.1.1), поэтому Equals условие равно false. Логический оператор оценивается как true (не false), поэтому эффект активируется.
{<field>,"Equals":"127.0.0.1"} Ничего Совпадают все Один элемент массива оценивается как true (127.0.0.1 == 127.0.0.1) и один как false (127.0.0.1 == 192.168.1.1), поэтому Equals условие равно false , и эффект не активируется.
{<field>,"Equals":"10.0.4.1"} Ничего Совпадают все Оба элемента массива оцениваются как false (10.0.4.1 == 127.0.0.1 and 10.0.4.1 == 192.168.1.1), поэтому Equals условие равно false , и эффект не активируется.

Следующие шаги