示例 - 在资源组强制执行标记及其值

此策略要求资源组有标记和值。 由你指定标记名称和值。

可以使用以下方法部署此示例策略:

如果没有 Azure 订阅,可在开始前创建一个试用帐户

示例策略

策略定义

结构完整的 JSON 策略定义,可以通过 REST API、“部署到 Azure”按钮以及手动在门户中使用。

{
   "properties": {
      "displayName": "Enforce tag and its value on resource groups",
      "description": "Enforces a required tag and its value on resource groups.",
      "mode": "All",
      "parameters": {
         "tagName": {
            "type": "String",
            "metadata": {
               "description": "Name of the tag, such as costCenter"
            }
         },
         "tagValue": {
            "type": "String",
            "metadata": {
               "description": "Value of the tag, such as headquarter"
            }
         }
      },
      "policyRule": {
         "if": {
            "allOf": [
               {
                  "field": "type",
                  "equals": "Microsoft.Resources/subscriptions/resourceGroups"
               },
               {
                  "not": {
                     "field": "[concat('tags[',parameters('tagName'), ']')]",
                     "equals": "[parameters('tagValue')]"
                  }
               }
            ]
         },
         "then": {
            "effect": "deny"
         }
      }
   }
}

Note

如果手动在门户中创建策略,请使用上面的 properties.parametersproperties.policyRule 部分。 使用大括号 {} 将这两部分括在一起,使其成为有效的 JSON。

策略规则

定义了策略规则的 JSON,由 Azure CLI 和 Azure PowerShell 使用。

{
   "if": {
      "allOf": [
         {
            "field": "type",
            "equals": "Microsoft.Resources/subscriptions/resourceGroups"
         },
         {
            "not": {
               "field": "[concat('tags[',parameters('tagName'), ']')]",
               "equals": "[parameters('tagValue')]"
            }
         }
      ]
   },
   "then": {
      "effect": "deny"
   }
}

策略参数

定义了策略参数的 JSON,由 Azure CLI 和 Azure PowerShell 使用。

{
    "tagName": {
        "type": "String",
        "metadata": {
            "description": "Name of the tag, such as costCenter"
        }
    },
    "tagValue": {
        "type": "String",
        "metadata": {
            "description": "Value of the tag, such as headquarter"
        }
    }
}
Name 类型 字段 说明
tagName String 标记 标记的名称,如 costCenter
tagValue String 标记 标记的值,如 headquarter

通过 PowerShell 或 Azure CLI 创建分配时,可以使用 -PolicyParameter (PowerShell) 或 --params (Azure CLI) 通过字符串或文件将参数值传递为 JSON。 PowerShell 还支持 -PolicyParameterObject,这要求向该 cmdlet 传递一个 Name/Value 哈希表,其中,Name 是参数名称,Value 是在赋值期间传递的单个值或值数组。

在此示例参数中,定义的 tagNamecostCentertagValueheadquarter

{
    "tagName": {
        "value": "costCenter"
    },
    "tagValue": {
        "value": "headquarter"
    }
}

Azure 门户

“部署到 Azure”

Azure PowerShell

本示例需要 Azure PowerShell。 运行 Get-Module -ListAvailable Az 即可查找版本。 如果需要进行安装或升级,请参阅安装 Azure PowerShell 模块

运行 Connect-AzAccount -Environment AzureChinaCloud,创建与 Azure 的连接。

使用 Azure PowerShell 部署

# Create the Policy Definition (Subscription scope)
$definition = New-AzPolicyDefinition -Name 'enforce-resourceGroup-tags' -DisplayName 'Enforce tag and its value on resource groups' -description 'Enforces a required tag and its value on resource groups.' -Policy 'https://raw.githubusercontent.com/Azure/azure-policy/master/samples/ResourceGroup/enforce-resourceGroup-tags/azurepolicy.rules.json' -Parameter 'https://raw.githubusercontent.com/Azure/azure-policy/master/samples/ResourceGroup/enforce-resourceGroup-tags/azurepolicy.parameters.json' -Mode All

# Set the scope to a resource group; may also be a resource, subscription, or management group
$scope = Get-AzResourceGroup -Name 'YourResourceGroup'

# Set the Policy Parameter (JSON format)
$policyParam = '{ "tagName": { "value": "costCenter" }, "tagValue": { "value": "headquarter" } }'

# Create the Policy Assignment
$assignment = New-AzPolicyAssignment -Name 'enforce-resourceGroup-tags-assignment' -Scope $scope.ResourceId -PolicyDefinition $definition -PolicyParameter $policyParam

使用 Azure PowerShell 删除

运行以下命令来删除以前的分配和定义:

# Remove the Policy Assignment
Remove-AzPolicyAssignment -Id $assignment.ResourceId

# Remove the Policy Definition
Remove-AzPolicyDefinition -Id $definition.ResourceId

Azure PowerShell 说明

部署和删除脚本使用以下命令。 下表中的每条命令均链接到特定于命令的文档:

命令 注释
New-AzPolicyDefinition 创建新的 Azure Policy 定义。
Get-AzResourceGroup 获取单个资源组。
New-AzPolicyAssignment 创建新的 Azure Policy 分配。 在此示例中,我们向其提供了一个定义,但它也可以接受计划。
Remove-AzPolicyAssignment 删除现有的 Azure Policy 分配。
Remove-AzPolicyDefinition 删除现有的 Azure Policy 定义。

Azure CLI

若要运行此示例,请确保已安装最新版本的 Azure CLI。 若要开始,请运行 az login 以创建与 Azure 的连接。

Note

在运行 az login 之前,请先运行 az cloud set -n AzureChinaCloud 以更改云环境。 如果要切换回全球 Azure,请再次运行 az cloud set -n AzureCloud

此示例在 Bash shell 中正常工作。 有关在 Windows 客户端上运行 Azure CLI 脚本的选项,请参阅在 Windows 上安装 Azure CLI

使用 Azure CLI 进行部署

# Create the Policy Definition (Subscription scope)
definition=$(az policy definition create --name 'enforce-resourceGroup-tags' --display-name 'Enforce tag and its value on resource groups' --description 'Enforces a required tag and its value on resource groups.' --rules 'https://raw.githubusercontent.com/Azure/azure-policy/master/samples/ResourceGroup/enforce-resourceGroup-tags/azurepolicy.rules.json' --params 'https://raw.githubusercontent.com/Azure/azure-policy/master/samples/ResourceGroup/enforce-resourceGroup-tags/azurepolicy.parameters.json' --mode All)

# Set the scope to a resource group; may also be a resource, subscription, or management group
scope=$(az group show --name 'YourResourceGroup')

# Set the Policy Parameter (JSON format)
policyParam='{ "tagName": { "value": "costCenter" }, "tagValue": { "value": "headquarter" } }'

# Create the Policy Assignment
assignment=$(
az policy assignment create --name 'enforce-resourceGroup-tags-assignment' --display-name 'Enforce tag and its value on resource groups'  --scope `echo $scope | jq '.id' -r` --policy `echo $definition | jq '.name' -r` --params "$policyparam")

使用 Azure CLI 进行删除

运行以下命令来删除以前的分配和定义:

# Remove the Policy Assignment
az policy assignment delete --name `echo $assignment | jq '.name' -r`

# Remove the Policy Definition
az policy definition delete --name `echo $definition | jq '.name' -r`

Azure CLI 说明

命令 注释
az policy definition create 创建新的 Azure Policy 定义。
az group show 获取单个资源组。
az policy assignment create 创建新的 Azure Policy 分配。 在此示例中,我们向其提供了一个定义,但它也可以接受计划。
az policy assignment delete 删除现有的 Azure Policy 分配。
az policy definition delete 删除现有的 Azure Policy 定义。

有多个工具可以用来与资源管理器 REST API 进行交互,例如 ARMClient 或 PowerShell。 可以在策略定义结构别名部分中找到通过 PowerShell 调用 REST API 的示例。

REST API

使用 REST API 进行部署

  • 创建策略定义(订阅范围)。 将策略定义 JSON 用于请求正文。

    PUT https://management.chinacloudapi.cn/subscriptions/{subscriptionId}/providers/Microsoft.Authorization/policyDefinitions/enforce-resourceGroup-tags?api-version=2016-12-01
    
  • 创建策略分配(资源组范围)

    PUT https://management.chinacloudapi.cn/subscriptions/{subscriptionId}/resourceGroups/YourResourceGroup/providers/Microsoft.Authorization/policyAssignments/enforce-resourceGroup-tags-assignment?api-version=2017-06-01-preview
    

    将以下 JSON 示例用于请求正文:

  {
      "properties": {
          "displayName": "Enforce tag and its value Assignment",
          "policyDefinitionId": "/subscriptions/{subscriptionId}/providers/Microsoft.Authorization/policyDefinitions/enforce-resourceGroup-tags",
          "parameters": {
              "tagName": {
                  "value": "costCenter"
              },
              "tagValue": {
                  "value": "headquarter"
              }
          }
      }
  }

使用 REST API 进行删除

  • 删除策略分配

    DELETE https://management.chinacloudapi.cn/subscriptions/{subscriptionId}/providers/Microsoft.Authorization/policyAssignments/enforce-resourceGroup-tags-assignment?api-version=2017-06-01-preview
    
  • 删除策略定义

    DELETE https://management.chinacloudapi.cn/subscriptions/{subscriptionId}/providers/Microsoft.Authorization/policyDefinitions/enforce-resourceGroup-tags?api-version=2016-12-01
    

REST API 说明

服务 操作 注释
资源管理 策略定义 创建 在订阅中创建新的 Azure Policy 定义。 替换项:在管理组中创建
资源管理 策略分配 创建 创建新的 Azure Policy 分配。 在此示例中,我们向其提供了一个定义,但它也可以接受计划。
资源管理 策略分配 删除 删除现有的 Azure Policy 分配。
资源管理 策略定义 删除 删除现有的 Azure Policy 定义。 替换项:在管理组中删除

后续步骤