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

Azure 自动化 State Configuration 到计算机配置迁移计划

计算机配置是 Azure 自动化 State Configuration(也称为 Azure 自动化 Desired State Configuration 或 AADSC)提供的功能的最新实现。 如果可能,应计划将内容和计算机移动到新服务。 本文提供有关制定从 Azure 自动化到计算机配置的迁移策略的指导。

机器配置中的新功能解决客户请求:

  • 将配置的大小限制提高到了 100 MB
  • 通过 Azure Resource Graph 进行高级报告(包括资源 ID 和状态)
  • 管理相同计算机的多个配置
  • 当计算机偏离所需状态时,可控制进行修正的时间
  • Linux 和 Windows 都使用基于 PowerShell 的 DSC 资源

开始之前,最好参阅 Azure Policy 计算机配置页中的概念性概述信息。

了解迁移

迁移的最佳方法是先重新部署内容,然后迁移计算机。 本部分概述迁移的预期步骤。

  1. 从 Azure 自动化导出配置
  2. 发现模块要求并在环境中加载它们
  3. 编译配置
  4. 创建和发布计算机配置包
  5. 测试计算机配置包
  6. 将混合计算机加入 Azure Arc
  7. 从 Azure 自动化 State Configuration 注销服务器
  8. 使用计算机配置将配置分配给服务器

计算机配置将 DSC 版本 3 与 PowerShell 版本 7 结合使用。 DSC 版本 3 可以在 WindowsLinux 中与较旧 DSC 版本共存。 实现是独立的。 但是没有冲突检测。

计算机配置不需要将模块或配置发布到服务或是在服务中进行编译。 但需要使用专用工具开发和测试内容,然后在计算机可通过 HTTPS 访问的任何位置(通常是 Azure Blob 存储)进行发布。

如果决定在某段时间内让计算机同时使用这两种服务,则不会有技术障碍。 两种服务是独立的。

从 Azure 自动化导出内容

首先从 Azure 自动化 State Configuration 发现内容并将其导出到为机器配置创建、测试和发布内容包的开发环境。

配置

只能从 Azure 自动化中导出配置脚本。 无法导出节点配置或已编译的 MOF 文件。 如果将 MOF 文件直接发布到了自动化帐户,并且不再有权访问原始文件,则需要从专用配置脚本重新编译。 如果找不到原始配置,则必须重新为其授权。

要从 Azure 自动化导出配置脚本,请首先标识包含配置的 Azure 自动化帐户,以及部署自动化帐户的资源组的名称。

安装 PowerShell 模块 Az.Automation。

Install-Module -Name Az.Automation

接下来,使用 Get-AzAutomationAccount 命令标识自动化帐户以及部署它们的资源组。 属性“ResourceGroupName”和“AutomationAccountName”对于后续步骤非常重要。

Get-AzAutomationAccount
SubscriptionId        : <your-subscription-id>
ResourceGroupName     : <your-resource-group-name>
AutomationAccountName : <your-automation-account-name>
Location              : centralus
State                 :
Plan                  :
CreationTime          : 6/30/2021 11:56:17 AM -05:00
LastModifiedTime      : 6/30/2021 11:56:17 AM -05:00
LastModifiedBy        :
Tags                  : {}

发现自动化帐户中的配置。 输出为每个配置一个条目。 如果有许多配置,则会将信息存储为变量,以便更轻松地处理。

$getParams = @{
    ResourceGroupName     = '<your-resource-group-name>'
    AutomationAccountName = '<your-automation-account-name>'
}

Get-AzAutomationDscConfiguration @getParams
ResourceGroupName     : <your-resource-group-name>
AutomationAccountName : <your-automation-account-name>
Location              : centralus
State                 : Published
Name                  : <your-configuration-name>
Tags                  : {}
CreationTime          : 6/30/2021 12:18:26 PM -05:00
LastModifiedTime      : 6/30/2021 12:18:26 PM -05:00
Description           :
Parameters            : {}
LogVerbose            : False

最后,使用命令 Export-AzAutomationDscConfiguration 将每个配置导出到本地脚本文件。 生成的文件名使用模式 \ConfigurationName.ps1

$exportParams = @{
    OutputFolder          = '<location-on-your-machine>'
    ResourceGroupName     = '<your-resource-group-name>'
    AutomationAccountName = '<your-automation-account-name>'
    Name                  = '<your-configuration-name>'
}
Export-AzAutomationDscConfiguration @exportParams
UnixMode   User             Group                 LastWriteTime           Size Name
--------   ----             -----                 -------------           ---- ----
                                               12/31/1600 18:09

使用 PowerShell 管道导出配置

发现帐户和配置数量后,可能希望将所有配置导出到计算机上的本地文件夹。 要自动执行此过程,请将前面示例中每个命令的输出通过管道传递给下一个命令。

示例导出了 5 个配置。 输出模式是唯一的成功指示。

Get-AzAutomationAccount |
    Get-AzAutomationDscConfiguration |
    Export-AzAutomationDSCConfiguration -OutputFolder <location on your machine>
UnixMode   User             Group                 LastWriteTime           Size Name
--------   ----             -----                 -------------           ---- ----
                                               12/31/1600 18:09
                                               12/31/1600 18:09
                                               12/31/1600 18:09
                                               12/31/1600 18:09
                                               12/31/1600 18:09

考虑分解复杂的配置文件

对于每台计算机,机器配置可以管理多个配置。 许多为 Azure 自动化 State Configuration 编写的配置都采用为每台计算机管理单个配置的限制。 要利用机器配置提供的扩展功能,可以将大型配置文件划分为许多较小的配置,让每个小配置处理特定方案。

计算机配置中没有任何业务流程来控制配置的排序方式。 如果需要按顺序执行配置中的步骤,请将它们保留在一个包中。

模块

无法从 Azure 自动化导出模块或自动关联哪些配置需要哪个模块和版本。 必须让模块处于本地环境中才能创建新的计算机配置包。 若要创建迁移所需的模块列表,请使用 PowerShell 对 Azure 自动化查询模块的名称和版本。

如果使用的模块是自定义创作的,并且仅存在于专用开发环境中,则无法从 Azure 自动化导出它们。

如果在环境和帐户中找不到配置所需的自定义模块,则无法编译配置。 因此,也无法迁移配置。

列出在 Azure 自动化中导入的模块

要检索自动化帐户中安装的所有模块的列表,请使用 Get-AzAutomationModule 命令。 属性 IsGlobal 会告知模块是否始终内置在 Azure 自动化中,或者是否已发布到帐户。

例如,用于创建发布到任何帐户的所有模块的列表。

Get-AzAutomationAccount |
    Get-AzAutomationModule |
    Where-Object IsGlobal -eq $false

还可以使用 PowerShell 库来帮助查找有关公开提供的模块的详细信息。 以下示例列出的模块内置于新自动化帐户并包含 DSC 资源。

Get-AzAutomationAccount |
    Get-AzAutomationModule |
    Where-Object IsGlobal -eq $true |
    Find-Module -ErrorAction SilentlyContinue |
    Where-Object {'' -ne $_.Includes.DscResource} |
    Select-Object -Property Name, Version -Unique |
    Format-Table -AutoSize
Name                       Version
----                       -------
AuditPolicyDsc             1.4.0
ComputerManagementDsc      8.4.0
PSDscResources             2.12.0
SecurityPolicyDsc          2.10.0
xDSCDomainjoin             1.2.23
xPowerShellExecutionPolicy 3.1.0.0
xRemoteDesktopAdmin        1.1.0.0

如果模块是从 PowerShell 库导入的,则可以通过管道将 Find-Module 的输出直接传输到 Install-Module。 跨命令通过管道发送输出提供了一种解决方案来加载开发人员环境,其中在 PowerShell 库中提供的所有模块当前都处于自动化帐户中。

如果在本地环境中已将自定义 NuGet 源注册为 PowerShellGet 存储库,则可以使用相同的方法从该源中拉取模块。

示例中的 Find-Module 命令不禁止显示错误,这意味着在库中找不到的任何模块都会返回错误消息。

Get-AzAutomationAccount |
    Get-AzAutomationModule |
    Where-Object IsGlobal -eq $false |
    Find-Module |
    Where-Object { '' -ne $_.Includes.DscResource } |
    Install-Module

检查配置脚本的模块要求

如果从 Azure 自动化导出了配置脚本,则还可以查看内容,了解有关将每个配置编译为 MOF 文件所需的模块的详细信息。 仅当在已删除模块的自动化帐户中找到配置时,才需要此方法。 配置对计算机不再有用,但它们可能仍在帐户中。

在每个文件的顶部,查找包含 Import-DscResource 的行。 此命令仅适用于配置内部,用于在编译时加载模块。

例如,PowerShell 库中的 WindowsIISServerConfig 配置包含此示例中的行。

configuration WindowsIISServerConfig
{

Import-DscResource -ModuleName @{ModuleName = 'xWebAdministration';ModuleVersion = '1.19.0.0'}
Import-DscResource -ModuleName 'PSDesiredStateConfiguration'

该配置要求你使用“xWebAdministration”模块版本 1.19.0.0 和模块“PSDesiredStateConfiguration”。

在 Azure 计算机配置中测试内容

要评估 Azure 自动化 State Configuration 中的内容是否可与机器配置一起使用,请按照如何创建自定义机器配置包项目页面中的分步教程进行操作。

执行到步骤创作配置时,生成 MOF 文件的配置脚本应该是从 Azure 自动化 State Configuration 中导出的脚本之一。 必须先在环境中安装所需 PowerShell 模块,然后才能将配置编译为 MOF 文件并创建计算机配置包。

如果模块不适用于机器配置,该怎么办?

某些模块可能与机器配置不兼容。 最常见的问题是 .NET framework 与 .NET core 的相关问题。 Windows PowerShell 5.1 与 PowerShell 7.x 之间的差异页面上提供了详细技术信息。

解决兼容性问题的一种方法是,通过运行 powershell.exe,在 PowerShell 7 中导入的模块内运行 Windows PowerShell 中的命令。 可以在 Azure-Policy 存储库中查看一个使用此技术的示例模块,该模块用于审核 Windows DSC 配置的状态。

该示例还演示了一个小的概念证明。

# example function that could be loaded from module
function New-TaskResolvedInPWSH7 {
    # runs the fictitious command 'Get-myNotCompatibleCommand' in Windows PowerShell
    $compatObject = & powershell.exe -NoProfile -NonInteractive -Command {
        Get-myNotCompatibleCommand
    }
    # resulting object can be used in PowerShell 7
    return $compatObject
}

是否需要在迁移的所有模块中都将 Reasons 属性添加到 Get-TargetResource?

从 Azure 门户查看配置分配的结果时,实现 Reasons 属性可提供更好的体验。 如果模块中的 Get 方法不包含 Reasons,会返回泛型输出,以及 Get 方法返回的属性的详细信息。 因此,这是迁移时的可选操作。

在测试完计算机配置中的 Azure 自动化 State Configuration 内容后,需制定计划来迁移计算机。

Azure 自动化 State Configuration 适用于 Azure 中的虚拟机和位于 Azure 外部的混合计算机。 必须使用不同的步骤来规划每个方案。

Azure VM

Azure 虚拟机已在 Azure 中拥有资源,这意味着它们已准备好进行将它们与配置关联的计算机配置分配。 迁移 Azure 虚拟机的高级别任务是将它们从 Azure 自动化 State Configuration 中删除,然后使用计算机配置分配配置。

若要从 Azure 自动化 State Configuration 中删除计算机,请按照如何从自动化 State Configuration 中删除配置和节点页面中的步骤进行操作。

若要使用计算机配置分配配置,请按照 Azure Policy 快速入门(例如快速入门:创建策略分配以识别不合规资源)中的步骤进行操作。 在步骤 6 中选择策略定义时,请选取应用从 Azure 自动化 State Configuration 迁移的配置的定义。

混合计算机

Azure 外部的计算机可以注册到 Azure 自动化 State Configuration,但它们在 Azure 中没有计算机资源。 可使用计算机内部的本地 Configuration Manager (LCM) 服务来连接 Azure 自动化。 节点的记录作为 Azure 自动化提供程序类型中的资源进行管理。

从 Azure 自动化 State Configuration 中删除计算机之前,请将每个节点作为已启用 Azure Arc 的服务器进行加入。 加入 Azure Arc 会在 Azure 中创建计算机资源,以便可以通过 Azure Policy 管理计算机。 计算机可以随时加入 Azure Arc,但你可以使用 Azure 自动化 State Configuration 自动执行该过程。

导出内容时排查问题

本部分提供有关已知问题的详细信息。

导出配置导致文件名中出现“\”字符

如果在 macOS 和 Linux 上使用 PowerShell,则在处理 Export-AzAutomationDSCConfiguration 输出的文件名时会遇到问题。

作为一种解决方法,一个模块已发布到 PowerShell 库,名为 AADSCConfigContent。 该模块只有一个命令,该命令通过对服务发出 REST 请求来导出存储在 Azure 自动化中的配置内容。

后续步骤