Я хочу создать автоматический способ создания новой политики, в которой необходимо применять теги по умолчанию к каждой развернутой виртуальной машине.
На данный момент у меня есть
Powershellscript:
#Remove Policy
#$scope = Get-AzSubscription -SubscriptionName "subscriptionname"
#$SubscriptionID = "/subscriptions/" + $scope.Id
#Remove-AzPolicyAssignment -Name 'apply-default-tag-1' -Scope $SubscriptionID
# Create the Policy Definition (Subscription scope)
$definition = New-AzPolicyDefinition -Name 'default-tags-to-vms' -DisplayName 'Append default tags to VM' -description 'This policy will add default tags to VMs' -Policy 'C:\policy.json' -Parameter 'C:\policy.parameters.json' -Mode All
# Set the scope to a resource group; may also be a resource, subscription, or management group
$scope = Get-AzSubscription -SubscriptionName "DCS-EM-AZ1"
$SubscriptionID = "/subscriptions/" + $scope.Id
# Set the Policy Parameter (JSON format)
$Tag1 = '{ "tagName": { "value": "Application"}, "tagValue": { "value": "stackoverflow" } }'
$Tag2 = '{ "tagName": { "value": "Contact"}, "tagValue": { "value": "bekind" } }'
$Tag3 = '{ "tagName": { "value": "Environment"}, "tagValue": { "value": "tome" } }'
$Tag4 = '{ "tagName": { "value": "RUNTIME"}, "tagValue": { "value": "please" } }'
# Create the Policy Assignment
$policyTag1 = New-AzPolicyAssignment -Name 'apply-default-tag-1' -DisplayName 'Apply default tag Application ' -Scope $SubscriptionID -PolicyDefinition $definition -PolicyParameter $Tag1
$policyTag2 = New-AzPolicyAssignment -Name 'apply-default-tag-2' -DisplayName 'Apply default tag Contact ' -Scope $SubscriptionID -PolicyDefinition $definition -PolicyParameter $Tag2
$policyTag3 = New-AzPolicyAssignment -Name 'apply-default-tag-3' -DisplayName 'Apply default tag Environment ' -Scope $SubscriptionID -PolicyDefinition $definition -PolicyParameter $Tag3
$policyTag4 = New-AzPolicyAssignment -Name 'apply-default-tag-4' -DisplayName 'Apply default tag Runtime ' -Scope $SubscriptionID -PolicyDefinition $definition -PolicyParameter $Tag4
JSON-файлы policy.json
{
"if": {
"allOf": [{
"field": "[concat('tags[', parameters('tagName'), ']')]",
"exists": "false"
},
{
"field": "type",
"equals": "Microsoft.Compute/virtualMachines"
}
]
},
"then": {
"effect": "append",
"details": [
{
"field": "[concat('tags[', parameters('tagName'), ']')]",
"value": "[parameters('tagValue')]"
}
]
}
}
policy.parameters.json
{
"tagName": {
"type": "string",
"metadata": {
"description": "Name of the tag, such as costCenter"
}
},
"tagValue": {
"type": "string",
"metadata": {
"description": "Value of the tag, such as headquarter"
}
}
}
Приведенное выше действие будет развертывать несколько назначений политики Azure с каждым назначениембудучи тэгом и тэгвулом, и если я тестирую развертывание внутри подписки, я вижу, что моя политика работает.Конечно, это касается не только «сейчас работает».Но также как я могу сделать это эффективным, чтобы в будущем можно было добавить это плавно, не меняя много кода.
То, что я до сих пор пробовал:
Вместо использования powershell я создал политику внутри шаблона ARM:
{
"$schema": "https://schema.management.azure.com/schemas/2018-05-01/subscriptionDeploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"parameters": {
"tagName": {
"type": "array",
"defaultValue":[
"default",
"location",
"is",
"a",
"problem"
]
},
"tagValue": {
"type": "array",
"defaultValue":[
"hello",
"darkness",
"my",
"old",
"friend"
]
}
},
"variables": {},
"resources": [
{
"type": "Microsoft.Authorization/policyDefinitions",
"name": "[concat('append-tags-to-resource'parameters('tagName')[copyindex('CopyTags')])]",
"apiVersion": "2018-05-01",
"properties": {
"policyType": "Custom",
"parameters": {},
"policyRule": {
"if": {
"field": "[concat('tags[', parameters('tagName')[copyindex('CopyTags')], ']')]",
"exists": "false"
},
"then": {
"effect": "append",
"details": [
{
"field": "[concat('tags[', parameters('tagName')[copyindex('CopyTags')], ']')]",
"value": "[parameters('tagValue')]"
}
]
}
}
},
"copy": {
"name": "CopyTags",
"count": "[length(parameters('tagName'))]"
}
}
]
}
Это дало мне многоошибки, потому что я не смог найти способ эффективного развертывания этого в подписке в качестве моей области вместо группы ресурсов.(Я пытался развернуть это без предоставления группы ресурсов, но не смог выяснить, куда пошло развертывание, нет ошибок, нет политик в каждой подписке, для которой я являюсь пользователем)
Кто-нибудь знает способ добавитьнесколько тегов эффективным способом.(эффективно: чтобы я мог добавить больше в будущем, не меняя ничего, просто подкорректировав имена и значения внутри массива).Или знает, как лучше реализовать мою политику сценария powershell?