Desired State 配置拉取服务

重要

请求服务器(Windows 功能 DSC-Service)是 Windows Server 支持的组件,但没有计划提供新特性或功能。 我们希望你知道,较新版本的 DSC 现已正式发布,由名为 guest configuration 的 Azure Policy 功能管理。 来宾配置服务结合了 DSC 扩展、Azure 自动化 State Configuration 的功能以及客户反馈中最常请求的功能。 来宾配置还包括通过 已启用 Arc 的服务器提供的混合计算机支持。

Local Configuration Manager (LCM) 可以通过 Pull Service 解决方案进行集中管理。 使用此方法时,正在管理的节点将注册到服务,并在 LCM 设置中分配配置。 作为配置依赖项的配置和所需的所有 DSC 资源将下载到计算机,并由 LCM 用于管理配置。 有关正在管理的计算机的状态的信息将上传到服务以进行报告。 这个概念被称为 “pull service”。

拉取服务的当前选项包括:

  • Azure 自动化 Desired State Configuration 服务
  • 在 Windows Server 上运行的拉取服务
  • 社区维护的开源解决方案
  • SMB 共享

每个解决方案的建议规模如下:

解决方案 客户端节点
使用 MDB/ESENT 数据库的 Windows 拉服务器 最多 500 个节点
使用 SQL 数据库的 Windows 拉取服务器 最多 3500 个节点
Azure 自动化 DSC 小型和大型环境

推荐的解决方案以及具有最多可用功能的选项是 Azure Automation DSC。 尚未确定每个自动化帐户的节点数上限。

Azure 服务可以管理本地、私有数据中心或公有云(如 Azure 和 AWS)中的节点。 对于服务器无法直接连接到 Internet 的私有环境,请考虑将出站流量限制为仅已发布的 Azure IP 范围(请参阅 Azure IP 范围和服务标记)。

Windows Server 上的拉取服务中当前不可用的联机服务功能包括:

  • 所有数据在传输中和静态时都经过加密
  • 客户端证书是自动创建和管理的
  • 用于集中管理 密码/凭据变量 (如服务器名称或连接字符串)的密钥存储
  • 集中管理节点 LCM 配置
  • 将配置集中分配给客户端节点
  • 发布对 “Canary groups” 的配置更改,以便在进入生产环境之前进行测试
  • 图形报告
    • DSC 资源粒度级别的状态详细信息
    • 来自客户端计算机的详细错误消息,用于故障排除
  • 与 Azure Log Analytics 集成 以发出警报、自动执行任务,与 Android/iOS 应用程序集成以用于报告和警报

Windows Server 中的 DSC 拉取服务

可以将 Pull 服务配置为在 Windows Server 上运行。 请注意,Windows Server 中包含的拉取服务解决方案仅包括存储配置和模块以供下载和将报表数据捕获到数据库的功能。 它不包括 Azure 中的服务提供的许多功能,因此,它不是评估如何使用服务的好工具。

Windows Server 中提供的拉取服务是 IIS 中的一项 Web 服务,它使用 OData 接口使 DSC 配置文件在目标节点请求时可供目标节点使用。

使用拉服务器的要求:

  • 运行以下位置的服务器:
    • WMF/PowerShell 4.0 或更高版本
    • IIS 服务器角色
    • DSC 服务
  • 理想情况下,使用一些生成证书的方法,以保护传递给目标节点上的本地配置管理器 (LCM) 的凭证

将 Windows Server 配置为托管拉取服务的最佳方法是使用 DSC 配置。 下面提供了一个示例脚本。

支持的数据库系统

从 Windows Server 版本 17090 开始,WMF 5.1 包括对拉取服务(Windows 功能 DSC-Service)的 SQL Server 选项的支持。 这为缩放尚未迁移到 Azure 自动化 DSC 的大型 DSC 环境提供了一个新选项。

要将请求服务器配置为使用 SQL Server,请将 SqlProvider 设置为 $true 有效的 SQL Server 连接字符串,并将 SqlConnectionString 设置为有效的 SQL Server 连接字符串。 有关更多信息,请参阅 SqlClient 连接字符串。 有关使用 xDscWebService 配置 SQL Server 的示例,请先阅读 使用 xDscWebService 资源 ,然后查看 GitHub 上的 2-xDscWebService_RegistrationUseSQLProvider_Config.ps1

使用 xDscWebService 资源

设置 Web 拉取服务器的最简单方法是使用 xPSDesiredStateConfiguration 模块中包含的 xDscWebService 资源。 以下步骤说明如何在设置 Web 服务的 中使用 Configuration 资源。

  1. 调用 Install-Module cmdlet 以安装 xPSDesiredStateConfiguration 模块。

  2. 从组织内或公共机构内的受信任的证书颁发机构获取 DSC Pull 服务器的 SSL 证书。 从颁发机构收到的证书通常采用 PFX 格式。

  3. 将证书安装在将成为 DSC 拉取服务器的节点上,默认位置应为 CERT:\LocalMachine\My. 记下证书指纹。

  4. 选择要用作注册密钥的 GUID。 要使用 PowerShell 生成一个,请在 PS 提示符处输入以下内容,然后按 Enter: [guid]::newGuid()New-Guid. 此密钥将被客户端节点用作共享密钥,以便在注册期间进行身份验证。 有关更多信息,请参阅下面的 注册密钥 部分。

  5. 在 PowerShell ISE 中,启动 (F5) 以下配置脚本(包含在 xPSDesiredStateConfiguration 模块的文件夹中。Sample_xDscWebServiceRegistration.ps1

    此脚本设置请求服务器。

    configuration Sample_xDscWebServiceRegistration
    {
        param
        (
            [string[]]$NodeName = 'localhost',
    
            [ValidateNotNullOrEmpty()]
            [string] $certificateThumbPrint,
    
            [Parameter(HelpMessage='This should be a string with enough entropy (randomness)' +
                ' to protect the registration of clients to the pull server.  We will use new' +
                ' GUID by default.'
            )]
            [ValidateNotNullOrEmpty()]
            [string] $RegistrationKey   # A guid that clients use to initiate conversation with pull server
        )
    
        Import-DSCResource -ModuleName PSDesiredStateConfiguration
        Import-DSCResource -ModuleName xPSDesiredStateConfiguration
    
        Node $NodeName
        {
            WindowsFeature DSCServiceFeature
            {
                Ensure = "Present"
                Name   = "DSC-Service"
            }
    
            xDscWebService PSDSCPullServer
            {
                Ensure                  = "Present"
                EndpointName            = "PSDSCPullServer"
                Port                    = 8080
                PhysicalPath            = "$env:SystemDrive\inetpub\PSDSCPullServer"
                CertificateThumbPrint   = $certificateThumbPrint
                ModulePath              = "$env:PROGRAMFILES\WindowsPowerShell\DscService\Modules"
                ConfigurationPath       = "$env:PROGRAMFILES\WindowsPowerShell\DscService\Configuration"
                State                   = "Started"
                DependsOn               = "[WindowsFeature]DSCServiceFeature"
                RegistrationKeyPath     = "$env:PROGRAMFILES\WindowsPowerShell\DscService"
                AcceptSelfSignedCertificates = $true
                UseSecurityBestPractices     = $true
                Enable32BitAppOnWin64   = $false
            }
    
            File RegistrationKeyFile
            {
                Ensure          = 'Present'
                Type            = 'File'
                DestinationPath = "$env:ProgramFiles\WindowsPowerShell\DscService\RegistrationKeys.txt"
                Contents        = $RegistrationKey
            }
        }
    }
    
  6. 运行配置,将 SSL 证书的指纹作为 certificateThumbPrint 参数传递,并将 GUID 注册密钥作为 RegistrationKey 参数传递:

    # To find the Thumbprint for an installed SSL certificate for use with the pull server list all
    # certificates in your local store and then copy the thumbprint for the appropriate certificate
    # by     reviewing the certificate subjects
    
    dir Cert:\LocalMachine\my
    
    # Then include this thumbprint when running the configuration
    $sample_xDscWebServiceRegistrationSplat = @{
        certificateThumbprint = 'A7000024B753FA6FFF88E966FD6E19301FAE9CCC'
        RegistrationKey = '140a952b-b9d6-406b-b416-e0f759c9c0e4'
        OutputPath = 'C:\Configs\PullServer'
    }
    Sample_xDscWebServiceRegistration @sample_xDscWebServiceRegistrationSplat
    
    # Run the compiled configuration to make the target node a DSC Pull Server
    Start-DscConfiguration -Path c:\Configs\PullServer -Wait -Verbose
    

注册码

要允许客户端节点向服务器注册,以便它们可以使用配置名称而不是配置 ID,由上述配置创建的注册密钥将保存在名为 RegistrationKeys.txt in 的 C:\Program Files\WindowsPowerShell\DscService文件中。 注册密钥用作客户端向请求服务器进行初始注册期间使用的共享密钥。 客户端将生成一个自签名证书,该证书用于在成功完成注册后对请求服务器进行唯一身份验证。 此证书的指纹存储在本地,并与请求服务器的 URL 相关联。

注释

PowerShell 4.0 不支持注册密钥。

为了配置节点以向 pull 服务器进行身份验证,注册密钥需要位于将向此 pull 服务器注册的任何目标节点的元配置中。 请注意,在目标计算机成功注册后,将删除下面元配置中的 RegistrationKey ,并且该值必须与拉服务器上文件中存储 RegistrationKeys.txt 的值匹配(本例中为“140a952b-b9d6-406b-b416-e0f759c9c0e4”)。 始终安全地处理注册密钥值,因为知道它允许任何目标计算机向请求服务器注册。

[DSCLocalConfigurationManager()]
configuration Sample_MetaConfigurationToRegisterWithLessSecurePullServer
{
    param
    (
        [ValidateNotNullOrEmpty()]
        [string] $NodeName = 'localhost',

        # the key used to set up pull server in previous configuration
        [ValidateNotNullOrEmpty()]
        [string] $RegistrationKey,

        # The name of the pull server, same as $NodeName used in previous configuration
        [ValidateNotNullOrEmpty()]
        [string] $ServerName = 'localhost'
    )

    Node $NodeName
    {
        Settings
        {
            RefreshMode        = 'Pull'
        }

        ConfigurationRepositoryWeb CONTOSO-PullSrv
        {
            ServerURL          = "https://$ServerName`:8080/PSDSCPullServer.svc"
            RegistrationKey    = $RegistrationKey
            ConfigurationNames = @('ClientConfig')
        }

        ReportServerWeb CONTOSO-PullSrv
        {
            ServerURL       = "https://$ServerName`:8080/PSDSCPullServer.svc"
            RegistrationKey = $RegistrationKey
        }
    }
}

$MetaConfigurationSplat = @{
    RegistrationKey = $RegistrationKey
    OutputPath = 'c:\Configs\TargetNodes'
}

Sample_MetaConfigurationToRegisterWithLessSecurePullServer @MetaConfigurationSplat

注释

ReportServerWeb 部分允许将报告数据发送到请求服务器。

元配置文件中缺少 ConfigurationID 属性隐式意味着 pull 服务器支持 V2 版本的pull server协议,因此需要初始注册。 相反,存在 ConfigurationID 意味着使用请求服务器协议的 V1 版本,并且没有注册处理。

注释

在 PUSH 场景中,当前版本中存在一个错误,使得有必要在元配置文件中为从未向 pull 服务器注册的节点定义 ConfigurationID 属性。 这将强制使用 V1 Pull Server 协议并避免注册失败消息。

放置配置和资源

请求服务器设置完成后,请求服务器配置中的 ConfigurationPathModulePath 属性定义的文件夹将用于放置可供目标节点请求使用的模块和配置。 这些文件需要采用特定格式,以便 Pull 服务器能够正确处理它们。

DSC 资源模块包格式

每个资源模块都需要根据以下模式 <Module Name>_<Module Version>.zip进行压缩和命名。

例如,模块版本为 3.1.2.0 且名为 xWebAdminstration 的模块将被命名为 xWebAdministration_3.1.2.0.zip。 模块的每个版本都必须包含在单个 zip 文件中。 由于每个 zip 文件中只有一个资源版本,因此不支持在 WMF 5.0 中添加的模块格式,并支持在单个目录中使用多个模块版本。 这意味着,在打包 DSC 资源模块以用于请求服务器之前,您需要对目录结构进行少量更改。 WMF 5.0 中包含 DSC 资源的模块的默认格式为 <Module Folder>\<Module Version>\DscResources\<DSC Resource Folder>\。 在打包请求服务器之前,请删除该 <Module version> 文件夹,使路径变为 <Module Folder>\DscResources\<DSC Resource Folder>\。 通过此更改,如上所述压缩文件夹,并将这些 zip 文件放在 ModulePath 文件夹中。

用于 New-DscChecksum <module zip file> 为新添加的模块创建校验和文件。

配置 MOF 格式

配置 MOF 文件需要与校验和文件配对,以便目标节点上的 LCM 可以验证配置。 若要创建校验和,请调用 New-DscChecksum cmdlet。 cmdlet 采用 Path 参数,该参数指定配置 MOF 所在的文件夹。 该 cmdlet 将创建一个名为 ConfigurationMOFName.mof.checksum的校验和文件,其中 ConfigurationMOFName 是配置 mof 文件的名称。 如果指定文件夹中有多个配置 MOF 文件,则会为该文件夹中的每个配置创建一个校验和。 将 MOF 文件及其关联的校验和文件放在 ConfigurationPath 文件夹中。

注释

如果您以任何方式更改了配置 MOF 文件,则还必须重新创建校验和文件。

工具

要设置、验证和管理请求服务器,请使用最新版本的 xPSDesiredStateConfiguration 模块中包含的以下工具作为示例:

  1. 一个模块,可帮助打包 DSC 资源模块和配置文件,以便在请求服务器上使用。 PublishModulesAndMofsToPullServer.psm1 的 PublishModulesAndMofsToPullServer.psm1 中。 示例如下:

    # Example 1 - Package all versions of given modules installed locally and
    # MOF files are in c:\LocalDepot
    $moduleList = @('xWebAdministration', 'xPhp')
    Publish-DSCModuleAndMof -Source C:\LocalDepot -ModuleNameList $moduleList
    
    # Example 2 - Package modules and mof documents from c:\LocalDepot
    Publish-DSCModuleAndMof -Source C:\LocalDepot -Force
    
  2. 验证请求服务器配置是否正确的脚本。 PullServerSetupTests.ps1.

拉取服务的社区解决方案

DSC 社区编写了多个解决方案来实现拉取服务协议。 对于本地环境,这些解决方案提供了拉取服务功能,并有机会通过增量增强功能回馈社区。

拉取客户端配置

以下主题详细介绍了设置请求客户端:

另请参阅