Создание политик для свойств массива ресурсов 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()
при ссылке на вычисляемый массив основано на следующих понятиях.
- Псевдонимы массивов разрешаются в коллекцию значений, выбранных из всех элементов массива.
- Функции
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 каждого элемента массива. |
Дополнительные сведения см. в примерах добавления.
Дополнительные примеры псевдонимов [*]
Рекомендуется использовать выражения 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 и действие не активируется. |
Дальнейшие действия
- См. другие примеры шаблонов для службы Политика Azure.
- Изучите статью о структуре определения Политики Azure.
- Изучите сведения о действии политик.
- Узнайте о программном создании политик.
- Узнайте, как исправлять несоответствующие ресурсы.
- Дополнительные сведения о группе управления см. в статье Упорядочивание ресурсов с помощью групп управления Azure.