使用 PowerShell DSC 实现所需状态

已完成

可以使用 PowerShell DSC 指定 VM 的所需状态。 本单元将详细介绍 PowerShell DSC,以及如何使用它来控制 VM 的状态。 在示例方案中,你将使用 PowerShell DSC 来确保在所有 Web 服务器上都安装并配置了适用于 Windows Server 的 IIS。

完成本单元的学习后,你将能够:

  • 理解节点和配置块。
  • 理解凭据资产。
  • 编写 PowerShell DSC 代码,以幂等方式安装 Microsoft IIS。

DSC 资源

你已了解 PowerShell DSC 是一种声明性脚本语言。 声明性编程关注的是结果,而不是过程。 如果需要在一组 VM 中以一致的方式配置和部署 Azure 资源,则可以使用 PowerShell DSC。 即使不熟悉安装和配置软件和服务所涉及的技术步骤,也可以使用 PowerShell DSC。

Windows Server 具有一组内置的 PowerShell DSC 资源。 可通过运行 Get-DSCResource PowerShell cmdlet 来查看这些资源。

Get-DscResource | select Name,Module,Properties

下表列出了一些内置的 PowerShell DSC 资源。

资源 说明
文件 管理节点上的文件和文件夹
存档 以 .zip 格式解压缩存档
环境 管理系统环境变量
日志 在 DSC 事件日志中写入一条消息
安装或删除包
注册表 管理节点的注册表项(HKEY 用户除外)
脚本 在节点上执行 PowerShell 命令
服务 管理 Windows 服务
用户 管理节点上的本地用户
WindowsFeature 添加或删除节点上的角色或功能
WindowsOptionalFeature 添加或删除节点上的可选角色或功能
WindowsProcess 管理 Windows 进程

对于更复杂的资源(例如 Active Directory 集成),请使用 DSC 资源工具包,它每月都会更新。 可以在本模块末尾的“摘要”单元中找到 DSC 资源工具包的链接。

要配置的资源必须已是 VM 或 VM 映像的一部分。 否则该作业将无法编译和运行。

DSC 代码块的解析

DSC 代码块包含四个部分。 请使用下例进一步了解。 在此示例中,数字不是语法的一部分。 它们被表示为注释,它们指的是下面讨论中的各部分。

Configuration MyDscConfiguration {              ##1
    Node "localhost" {                          ##2
        WindowsFeature MyFeatureInstance {      ##3
            Ensure = 'Present'
            Name = 'Web-Server'
        }
    }
}
MyDscConfiguration -OutputPath C:\temp\         ##4

配置语法包含以下部分:

  1. 配置:配置块是最外层的脚本块。 它以 Configuration 关键字开头,你将提供名称。 此处的配置名称为 MyDscConfiguration

    配置块描述所需的配置。 可将配置块视为一种函数,只是它描述的是要安装的资源,而不是用于安装这些资源的代码。

    与 PowerShell 函数一样,配置块也可使用参数。 例如,可以参数化节点名称。

    Configuration MyDscConfiguration {
    param
    (
        [string] $ComputerName='localhost'
    )
    
    Node $ComputerName {
        ...
    }
    
  2. 节点:可以有一个或多个节点块。 节点块确定编译配置时生成的 .mof 文件的名称。 例如,节点名称 localhost 只生成一个 localhost.mof 文件,但你可以将该 .mof 文件发送到任何服务器。 如果使用多个节点名称,则会生成多个 .mof 文件。

    可使用节点块中的数组表示法来锁定多个主机。 例如:

    Node @('WEBSERVER1', 'WEBSERVER2', 'WEBSERVER3')
    
  3. 资源:可以使用一个或多个资源块来指定要配置的资源。 在本示例中,有一个引用 WindowsFeature 资源的资源块。 此处的 WindowsFeature 资源确保安装了 Web-Server Windows 功能。

  4. MyDscConfiguration:此调用会调用 MyDscConfiguration 块。 它类似于运行函数。 运行配置块时,它将编译到托管对象格式 (MOF) 文档中。 MOF 是由桌面管理任务组根据接口定义语言创建的已编译语言。

    对于 DSC 脚本中列出的每个节点,都将在使用 -OutputPath 参数指定的文件夹中创建一个 .mof 文件。

DSC 脚本中的配置数据

在配置数据块中,可以提供配置过程可能需要的数据。 可以将这些数据应用于命名节点,或在所有节点上全局应用。

配置数据块是包含节点数组的命名块。 数组必须命名为 AllNodes。 在 AllNodes 数组内,使用 NodeName 变量指定节点的数据。

使用前面的方案,假设在每个节点上安装的 Web 服务器上,要将 SiteName 属性设置为不同的值。 可以按如下所示定义配置数据块:

$datablock =
@{
    AllNodes =
    @(
        @{
            NodeName = "WEBSERVER1"
            SiteName = "WEBSERVER1-Site"
        },
        @{
            NodeName = "WEBSERVER2"
            SiteName = "WEBSERVER2-Site"
        },
        @{
            NodeName = "WEBSERVER3"
            SiteName = "WEBSERVER3-Site"
        }
    );
}

若要在每个节点中将属性设置为相同的值,请在 AllNodes 数组中指定 NodeName = "*"

保护 DSC 脚本中的凭据

DSC 脚本可能需要配置过程的凭据信息。 避免在源代码管理工具中以纯文本形式放置凭据。 相反,Azure 自动化中的 DSC 配置可以引用 PSCredential 对象中存储的凭据。 可以使用 PSCredential 类型为 DSC 脚本定义参数。 运行脚本之前,请获取用户凭据,使用这些凭据创建新的 PSCredential 对象,然后将此对象作为参数传递给脚本。

默认情况下不会在 .mof 文件中加密凭据,而是以纯文本的形式公开它们。 若要加密凭据,需要在配置数据中使用证书。 证书的私钥需要存在于要应用配置的节点上。 证书可通过节点的 LCM 进行配置。

从 PowerShell 5.1 开始,将静态加密节点上的 .mof 文件。 在传输过程中,所有凭据都通过 WinRM 进行加密。

将配置推送到节点

为配置创建已编译的 .mof 文件后,可以通过运行 Start-DscConfiguration cmdlet 将其推送到节点。 如果将路径添加到目录,它会将在该目录中找到的任何 .mof 文件应用于节点:

Start-DscConfiguration -path D:\

此步骤对应于上一单元中所述的“推送模式”。

拉取节点的配置

如果 Azure 上有数百个 VM,那么与推送模式相比,使用拉取模式更为合适。

可以将 Azure 自动化帐户配置为充当拉取服务,只需将配置上传到自动化帐户,然后将 VM 注册到此帐户。

在编译配置之前,请将 DSC 进程所需的所有 PowerShell 模块导入到自动化帐户中。 这些模块定义了如何完成任务以实现所需状态。

例如,上一单元中的 DSC 脚本使用 xSmbShare PowerShell 模块指示 DSC 如何检查文件共享的状态。 DSC 会自动从自动化帐户向节点拉取模块。

下图显示了设置 Azure Automation State Configuration 的方式。 我们将在下一个单元中更详细地探讨这些步骤。

显示 DSC 设置步骤的示意图。

默认情况下,15 分钟后,VM 上的 LCM 会轮询 Azure 自动化以了解 DSC 配置文件的任何更改。 对 VM 所做的任何更改都将记录在 Desired State Configuration 中。 如果修改配置,可以将其上传到自动化帐户,VM 会自动进行重新配置。

下图显示了 LCM 在 VM 上管理所需状态时所采取的过程。

显示 VM 如何轮询 Azure 自动化的示意图。

自动化帐户以本机方式处理凭据。 此管理功能降低了保护和使用凭据的复杂性。