你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

如何创建自定义计算机配置策略定义

开始之前,建议阅读计算机配置的概述页,以及有关计算机配置的修正选项的详细信息。

重要

Azure 虚拟机需要计算机配置扩展。 若要在所有计算机上大规模部署此扩展,请分配以下策略计划:Deploy prerequisites to enable machine configuration policies on virtual machines

若要使用应用配置的计算机配置包,需要 Azure VM 来宾配置扩展版本 1.26.24 或更高版本,或者 Arc 代理 1.10.0 或更高版本。

使用 AuditIfNotExistsDeployIfNotExists 的自定义计算机配置策略定义处于正式发布 (GA) 支持状态。

使用以下步骤创建你自己的策略,这些策略可审核合规性或管理 Azure 计算机或启用了 Arc 的计算机的状态。

安装 PowerShell 7 和所需的 PowerShell 模块

首先,设置计算机配置创作环境来安装 OS 和 GuestConfiguration 模块所需的 PowerShell 版本。

创建和发布计算机配置包项目

如果尚未设置,请按照如何创建自定义计算机配置包项目中的步骤创建和发布自定义计算机配置包。 然后,按照如何测试计算机配置包项目中的步骤在开发环境中验证包。

注意

本文中的示例代码引用 $contentUri 变量。 如果使用与前面教程相同的 PowerShell 会话来创建和测试包项目,则该变量可能已有包的 URI。

如果未在 PowerShell 会话中将 $contentUri 变量设置为包的 URI,需要对其进行设置。 此示例使用存储帐户的连接字符串New-AzStorageContext cmdlet 来创建存储上下文。 然后,它获取已发布的包的存储 Blob,并使用该对象的属性来获取内容 URI。

$connectionString = '<storage-account-connection-string>'
$context = New-AzStorageContext -ConnectionString $connectionString
$getParams = @{
    Context   = $context
    Container = '<container-name>'
    Blob      = '<published-package-file-name>'
}
$blob = Get-AzStorageBlob @getParams
$contentUri = $blob.ICloudBlob.Uri.AbsoluteUri

计算机配置的策略要求

策略定义元数据部分必须包括计算机配置服务的两个属性,以自动预配和报告来宾配置分配。 类别属性必须设置为 Guest Configuration,并且名为 guestConfiguration 的部分必须包含有关计算机配置分配的信息。 New-GuestConfigurationPolicy cmdlet 会自动创建此文本。

下面的示例演示了由 New-GuestConfigurationPolicy 自动创建的元数据部分。

"metadata": {
    "category": "Guest Configuration",
    "guestConfiguration": {
        "name": "test",
        "version": "1.0.0",
        "contentType": "Custom",
        "contentUri": "CUSTOM-URI-HERE",
        "contentHash": "CUSTOM-HASH-VALUE-HERE",
        "configurationParameter": {}
    }
}

如果定义效果设置为 DeployIfNotExists,则 then 部分必须包含有关计算机配置分配的部署详细信息。 New-GuestConfigurationPolicy cmdlet 会自动创建此文本。

创建 Azure Policy 定义

在创建并上传计算机配置自定义策略包后,创建计算机配置策略定义。 New-GuestConfigurationPolicy cmdlet 需要使用自定义策略包,并创建策略定义。

PolicyId 参数 New-GuestConfigurationPolicy 需要唯一字符串。 需要使用全局唯一标识符 (GUID)。 对于新定义,可使用 cmdlet New-GUID 生成新得 GUID。 对定义进行更新时,对 PolicyId 使用相同的唯一字符串,以确保更新正确的定义。

New-GuestConfigurationPolicy cmdlet 的参数:

  • PolicyId:一个 GUID。
  • ContentUri:计算机配置内容包的公共 HTTP(S) URI。
  • DisplayName:策略显示名称。
  • 说明:策略说明。
  • 参数:哈希表中提供的策略参数。
  • PolicyVersion:策略版本。
  • 路径:在其中创建策略定义的目标路径。
  • Platform:计算机配置策略和内容包的目标平台 (Windows/Linux)。
  • 模式:(区分大小写:ApplyAndMonitorApplyAndAutoCorrectAudit)选择策略应审核还是部署配置。 默认为 Audit
  • Tag 向策略定义添加一个或多个标记筛选器
  • Category 在策略定义中设置类别元数据字段

有关模式参数的详细信息,请参阅如何配置适用于计算机配置的修正选项页面。

创建一个策略定义,该定义使用指定路径中的自定义配置包进行审核:

$PolicyConfig      = @{
  PolicyId      = '_My GUID_'
  ContentUri    = $contentUri
  DisplayName   = 'My audit policy'
  Description   = 'My audit policy'
  Path          = './policies/auditIfNotExists.json'
  Platform      = 'Windows'
  PolicyVersion = 1.0.0
}

New-GuestConfigurationPolicy @PolicyConfig

创建一个策略定义,该定义使用指定路径中的自定义配置包部署配置:

$PolicyConfig2      = @{
  PolicyId      = '_My GUID_'
  ContentUri    = $contentUri
  DisplayName   = 'My deployment policy'
  Description   = 'My deployment policy'
  Path          = './policies/deployIfNotExists.json'
  Platform      = 'Windows'
  PolicyVersion = 1.0.0
  Mode          = 'ApplyAndAutoCorrect'
}

New-GuestConfigurationPolicy @PolicyConfig2

cmdlet 输出返回一个对象,其中包含策略文件的定义显示名称和路径。 创建审核策略定义的定义 JSON 文件名为 auditIfNotExists.json,创建策略定义以应用配置的文件名为 deployIfNotExists.json

使用标记筛选计算机配置策略

GuestConfiguration 模块中由 cmdlet 创建的策略定义可以选择包括标记筛选器。 New-GuestConfigurationPolicy标记数支持包含各个标记条目的哈希表数组。 标记会添加到策略定义的 if 部分,并且不能通过策略分配进行修改。

下面给出了可筛选标记的策略定义的示例代码片段。

"if": {
  "allOf" : [
    {
      "allOf": [
        {
          "field": "tags.Owner",
          "equals": "BusinessUnit"
        },
        {
          "field": "tags.Role",
          "equals": "Web"
        }
      ]
    },
    {
      // Original machine configuration content
    }
  ]
}

使用自定义计算机配置策略定义中的参数

计算机配置支持在运行时替代 DSC 配置属性。 此功能意味着包中 MOF 文件内的值不必被认为是静态的。 替代值是通过 Azure Policy 提供的,并且不会改变 DSC 配置的创作或编译方式。

计算机配置支持参数的以下值类型:

  • 字符串
  • 布尔
  • Double
  • 浮点

cmdlet New-GuestConfigurationPolicyGet-GuestConfigurationPackageComplianceStatus 包含名为 Parameter 的参数。 此参数采用包含每个参数所有详细信息的哈希表定义,并创建用于 Azure Policy 定义的每个文件的必需部分。

下面的示例创建策略定义来审核服务,其中用户在策略分配时从列表中进行选择。

# This DSC resource definition...
Service 'UserSelectedNameExample' {
    Name   = 'ParameterValue'
    Ensure = 'Present'
    State  = 'Running'
}

# ...can be converted to a hash table:
$PolicyParameterInfo     = @(
  @{
    # Policy parameter name (mandatory)
    Name                 = 'ServiceName'
    # Policy parameter display name (mandatory)
    DisplayName          = 'windows service name.'
    # Policy parameter description (optional)
    Description          = 'Name of the windows service to be audited.'
    # DSC configuration resource type (mandatory)
    ResourceType         = 'Service'
    # DSC configuration resource id (mandatory)
    ResourceId           = 'UserSelectedNameExample'
    # DSC configuration resource property name (mandatory)
    ResourcePropertyName = 'Name'
    # Policy parameter default value (optional)
    DefaultValue         = 'winrm'
    # Policy parameter allowed values (optional)
    AllowedValues        = @('BDESVC','TermService','wuauserv','winrm')
  })

# ...and then passed into the `New-GuestConfigurationPolicy` cmdlet
$PolicyParam = @{
  PolicyId      = 'My GUID'
  ContentUri    = $contentUri
  DisplayName   = 'Audit Windows Service.'
  Description   = "Audit if a Windows Service isn't enabled on Windows machine."
  Path          = '.\policies\auditIfNotExists.json'
  Parameter     = $PolicyParameterInfo
  PolicyVersion = 1.0.0
}

New-GuestConfigurationPolicy @PolicyParam

发布 Azure Policy 定义

最后,可以使用 New-AzPolicyDefinition cmdlet 发布策略定义。 以下命令会将计算机配置策略发布到策略中心。

要运行 New-AzPolicyDefinition 命令,需要具有在 Azure 中创建策略定义的访问权限。 Azure Policy 概述页中收录了具体的授权要求。 建议的内置角色为 Resource Policy Contributor

New-AzPolicyDefinition -Name 'mypolicydefinition' -Policy '.\policies\auditIfNotExists.json'

或者,如果该策略为 deploy if not exist 策略 (DINE),请使用此命令:

New-AzPolicyDefinition -Name 'mypolicydefinition' -Policy '.\policies\deployIfNotExists.json'

在 Azure 中创建策略定义后,最后一步是分配定义。 了解如何使用门户Azure CLIAzure PowerShell 分配定义。

策略生命周期

如果要发布策略定义更新,请同时更改来宾配置包和 Azure Policy 定义详细信息。

注意

计算机配置分配的 version 属性仅影响 Microsoft 托管的包。 对自定义内容进行版本控制的最佳做法是在文件名中包含版本。

首先,在运行 New-GuestConfigurationPackage 时为包指定一个名称,使其与以前的版本不同。 可以在名称中包含版本号,例如 PackageName_1.0.0。 使用本示例中的数字只是为了让包独一无二,而不是指定该包应被视为比其他包更新或更旧。

接下来,按下面的每项说明更新与 New-GuestConfigurationPolicy cmdlet 一起使用的参数。

  • 版本:运行 New-GuestConfigurationPolicy cmdlet 时,必须指定高于当前发布版本的版本号。
  • contentUri:运行 New-GuestConfigurationPolicy cmdlet 时,必须为包的位置指定一个 URI。 在文件名中包含包版本将确保此属性的值在每个版本中都会更改。
  • contentHashNew-GuestConfigurationPolicy cmdlet 自动更新此属性。 它是 New-GuestConfigurationPackage 创建的包的哈希值。 对于你发布的 .zip 文件,此属性必须是正确的。 如果只更新了 contentUri 属性,则扩展会拒绝内容包。

发布更新后的包的最简单方法是重复本文中描述的过程,并指定更新后的版本号。 该过程可保证正确更新所有属性。

后续步骤