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

如何创建自定义计算机配置包项目

在开始之前,最好先阅读计算机配置的概述页面。

审核/配置 Windows 和 Linux 时,计算机配置使用 Desired State Configuration (DSC)。 DSC 配置定义了计算机应处于的条件。

重要

审核环境状态并应用配置的自定义包已处于正式发布(GA)支持状态。 但以下限制将适用:

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

GuestConfiguration 模块仅在 Ubuntu 18 及更高版本上可用。 但是,该模块生成的包和策略可以在 Azure 或 Arc 中支持的任何 Linux 发行版和版本上使用。

macOS 上的测试包不可用。

不要在自定义内容包中使用机密或保密信息。

请使用以下步骤来创建自己的配置,用于管理 Azure 或非 Azure 计算机的状态。

安装 PowerShell 7 和所需的 PowerShell 模块

首先,按照如何设置计算机配置创作环境中的步骤进行操作。 这些步骤可帮助你安装 OS 所需的 PowerShell 版本、GuestConfiguration 模块和 PSDesiredStateConfiguration 模块。

创作配置

创建配置包之前,请创作和编译 DSC 配置。 可以使用针对 Windows 和 Linux 提供的示例配置。

重要

编译 Windows 的配置时,请使用 PSDesiredStateConfiguration 版本 2.0.7(稳定版本)。 在为 Linux 编译配置时,请安装预发布版本 3.0.0。

此示例配置适用于 Windows 计算机。 它将计算机配置为在 ProcessMachine 范围内创建 MC_ENV_EXAMPLE 环境变量。 变量值设置为 'This was set by machine configuration'

Configuration MyConfig {
    Import-DscResource -Name 'Environment' -ModuleName 'PSDscResources'
    Environment MachineConfigurationExample {
        Name   = 'MC_ENV_EXAMPLE'
        Value  = 'This was set by machine configuration'
        Ensure = 'Present'
        Target = @('Process', 'Machine')
    }
}

MyConfig

MyConfig.ps1 脚本文件中保存该定义后,可以运行脚本来编译配置。

. .\MyConfig.ps1
    Directory: C:\dsc\MyConfig

Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
-a---           5/16/2023 10:39 AM           1080 localhost.mof

配置将编译到当前工作目录的 MyConfig 文件夹中的 localhost.mof 文件中。 将 localhost.mof 重命名为要用作包名称的名称,例如 MyConfig.mof

Rename-Item -Path .\MyConfig\localhost.mof -NewName MyConfig.mof -PassThru
    Directory: C:\dsc\MyConfig

Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
-a---           5/16/2023 10:40 AM           1080 MyConfig.mof

注意

此示例演示如何为 Windows 计算机创作和编译配置。 对于 Linux,需要使用 PowerShell 类来创建自定义 DSC 资源模块。 使用 PowerShell 类编写自定义 DSC 资源一文中提供了自定义资源和配置(已使用计算机配置进行了测试)的完整示例。

本文的其余部分适用于为 Linux 和 Windows 计算机定义的配置,除非有提到特定于平台的注意事项。

创建配置包项目

编译 MOF 后,支持文件必须打包在一起。 计算机配置使用已完成的包来创建 Azure Policy 定义。

New-GuestConfigurationPackage cmdlet 创建包。 配置所需的模块必须在开发环境的 $Env:PSModulePath 中提供,以便模块中的命令可以将它们添加到包中。

创建 Windows 内容时 New-GuestConfigurationPackage cmdlet 的参数:

  • 名称:计算机配置包名称。
  • 配置:已编译 DSC 配置文档完整路径。
  • 路径:输出文件夹路径。 此参数是可选的。 如果未指定,则在当前目录中创建包。
  • 类型:(AuditAuditandSet)确定配置是应当只审核,还是配置在计算机状态不是所需状态时更改其状态。 默认为 Audit

此步骤不需要提升特权。 如果多次运行该命令,则可以使用 Force 参数覆盖现有包。

以下命令创建包项目:

# Create a package that will only audit compliance
$params = @{
    Name          = 'MyConfig'
    Configuration = './MyConfig/MyConfig.mof'
    Type          = 'Audit'
    Force         = $true
}
New-GuestConfigurationPackage @params
# Create a package that will audit and apply the configuration (Set)
$params = @{
    Name          = 'MyConfig'
    Configuration = './MyConfig/MyConfig.mof'
    Type          = 'AuditAndSet'
    Force         = $true
}
New-GuestConfigurationPackage @params

将返回一个对象,其中包含已创建的包的名称和路径。

Name     Path
----     ----
MyConfig C:\dsc\MyConfig.zip

计算机配置项目的预期内容

计算机配置使用已完成的包来创建 Azure Policy 定义。 包中包含:

  • 作为 MOF 的已编译 DSC 配置
  • 模块文件夹
    • GuestConfiguration 模块
    • DscNativeResources 模块
    • MOF 所需的 DSC 资源模块
  • 一个元配置文件,存储包 typeversion

PowerShell cmdlet 可创建包 .zip 文件。 不需要根级别文件夹或版本文件夹。 包格式必须是 .zip 文件,未压缩时总大小不能超过 100 MB。

可以使用 Expand-Archive cmdlet 解压存档以进行检查。

Expand-Archive -Path .\MyConfig.zip -DestinationPath MyConfigZip

可以使用 PowerShell 获取未压缩包的总大小。

Get-ChildItem -Recurse -Path .\MyConfigZip |
    Measure-Object -Sum Length |
    ForEach-Object -Process {
        $Size = [math]::Round(($_.Sum / 1MB), 2)
        "$Size MB"
    }

使用第三方工具扩展计算机配置

可以扩展计算机配置的项目包以包含第三方工具。 扩展计算机配置要求开发两个组件。

  • 处理与管理第三方工具相关的所有活动的 Desired State Configuration 资源
    • 安装
    • Invoke
    • 转换输出
  • 供工具以本机方式使用的格式正确的内容

如果社区解决方案尚不存在,则 DSC 资源需要自定义开发。 可以通过在 PowerShell 库中搜索标记 GuestConfiguration 来发现社区解决方案。

注意

计算机配置扩展性是“自带许可”方案。 使用之前,请确保已满足任何第三方工具的条款和条件。

在开发环境中安装 DSC 资源之后,使用 New-GuestConfigurationPackage 的 FilesToInclude 参数在内容项目中包含第三方平台的内容。

下一步