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

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

  • тип параметра определения для предоставления нескольких параметров;
  • часть правила политики с использованием условий in или notIn;
  • часть правила политики, которая подсчитывает, сколько элементов массива соответствует тому или иному условию;
  • в эффектах добавления и изменения для обновления существующего массива.

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

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

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

Определение параметра в качестве массива обеспечивает гибкость политики, если требуется более одного значения. Это определение политики допускает любое отдельное расположение в параметре allowedLocations и по умолчанию использует значение eastus2:

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

Так как параметр type имеет значение string, при назначении этой политики можно задать только одно значение. При назначении этой политики ресурсы в области допускаются только в пределах одного региона Azure. Большинство определений политик должно допускать список утвержденных параметров, например eastus2, eastus и westus2.

Чтобы создать определение политики, допускающее несколько параметров, используйте свойство type со значением array. Эту же политику можно переписать следующим образом:

"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 параметр с типоммассива отображается как одно текстовое поле. В подсказке указано "Указывайте значения через ;. (например, Лондон;Нью-Йорк)". Чтобы передать допустимые значения расположения 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 с параметром params;
  • Azure PowerShell: командлет New-AzPolicyAssignment с параметром PolicyParameter;
  • REST API: операция PUTcreate в тексте запроса в качестве значения свойства 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.

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

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

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

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

Во многих вариантах использования требуется работа со свойствами массива в оцениваемом ресурсе. Для некоторых сценариев требуется ссылка на весь массив (например, проверка его длины). Другие требуют применения условия к каждому отдельному элементу массива (например, проверки того, что все правила брандмауэра блокируют доступ из Интернета). Основные сведения о различных способах, с помощью которых Политика Azure может ссылаться на свойства ресурсов, а также о том, как эти ссылки ведут себя, когда ссылаются на свойства массива, являются ключом к написанию условий для подобных сценариев.

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

Политика Azure может ссылаться на свойства ресурсов, используя псевдонимы. Ссылаться на значения свойства ресурса в Политике Azure можно двумя способами:

  • Использовать условие field, чтобы проверить, соответствуют ли условию все выбранные свойства ресурса. Пример

    {
      "field" : "Microsoft.Test/resourceType/property",
      "equals": "value"
    }
    
  • Использовать функцию field() для доступа к значению свойства. Пример

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

Условие field имеет неявное поведение "все из". Если псевдоним представляет коллекцию значений, он проверяет, соответствуют ли условию все отдельные значения. Функция 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, так как ни один из элементов массива не нарушается. В этом сценарии рекомендуется использовать выражение count . Если массив содержит объекты, псевдоним [*] можно использовать для выбора значения определенного свойства из каждого члена массива. Пример

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

При использовании условия field в примере содержимого ресурса будут получены следующие результаты:

Псевдоним Выбранные значения
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]

Выражения 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. Если указана Политика 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() при ссылке на вычисляемый массив основано на следующих понятиях.

  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

Полезные примеры см. в разделе Примеры выражений 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 каждого элемента массива.

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

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

Рекомендуется использовать выражения field count, чтобы проверить, соответствуют ли условию "все" или "любой из" элементов массива в содержимом запроса. Однако для некоторых простых условий можно добиться того же результата, используя метод доступа к выражению field с псевдонимом массива, как описано в разделе Ссылка на коллекцию элементов массива. Этот шаблон может быть полезен в правилах политики, превышающих предел допустимого количества выражений 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"} Ничего Ни одного совпадения Один элемент массива вычисляется как 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 и 10.0.4.1 != 192.168.1.1), поэтому условие notEquals имеет значение true и действие активируется.
"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 и 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 и 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 и 10.0.4.1 == 192.168.1.1), поэтому условие Equals имеет значение false и действие не активируется.

Дальнейшие действия