DSC 配置

适用于:Windows PowerShell 4.0、Windows PowerShell 5.0

DSC 配置是定义特殊类型函数的 PowerShell 脚本。 若要定义配置,请使用 PowerShell 关键字 Configuration

Configuration MyDscConfiguration {
    Node "TEST-PC1" {
        WindowsFeature MyFeatureInstance {
            Ensure = 'Present'
            Name = 'RSAT'
        }
        WindowsFeature My2ndFeatureInstance {
            Ensure = 'Present'
            Name = 'Bitlocker'
        }
    }
}
MyDscConfiguration

将脚本另存为 .ps1 文件。

配置语法

配置脚本由以下部分组成:

  • 配置块。 这是最外部的脚本块。 您可以通过使用 Configuration 关键字并提供名称来定义它。 在这种情况下,配置的名称为 MyDscConfiguration
  • 一个或多个 节点 块。 这些定义了要配置的节点(计算机或虚拟机)。 在上述配置中,有一个 Node 块针对名为 的计算机 TEST-PC1Node 块可以接受多个计算机名称。
  • 一个或多个资源块。 配置在此处设置其正在配置的资源的属性。 在这种情况下,有两个资源块,每个资源块都调用 WindowsFeature 资源。

注释

WindowsFeature DSC 资源仅在 Windows Server 计算机上可用。 对于具有客户端作系统(如 Windows 11)的计算机,您需要改用 WindowsOptionalFeature 。 有关详细信息,请参阅 PSDscResources 文档的“WindowsOptionalFeature”部分

配置 块中,可以执行通常在 PowerShell 函数中可以执行的任何作。 在前面的示例中,如果不想在配置中对目标计算机的名称进行硬编码,则可以为节点名称添加参数。

在此示例中,通过在编译配置时将节点作为 ComputerName 参数传递来指定节点的名称。 名称默认为 localhost.

Configuration MyDscConfiguration
{
    param
    (
        [string[]]$ComputerName='localhost'
    )

    Node $ComputerName
    {
        WindowsFeature MyFeatureInstance
        {
            Ensure = 'Present'
            Name = 'RSAT'
        }

        WindowsFeature My2ndFeatureInstance
        {
            Ensure = 'Present'
            Name = 'Bitlocker'
        }
    }
}

MyDscConfiguration

Node 块还可以接受多个计算机名称。 在上面的示例中,您可以使用该 -ComputerName 参数,也可以将以逗号分隔的计算机列表直接传递给 Node 块。

MyDscConfiguration -ComputerName "localhost", "Server01"

在为 节点 块指定计算机列表时,从 配置中,您需要使用数组表示法。

Configuration MyDscConfiguration
{
    Node @('localhost', 'Server01')
    {
        WindowsFeature MyFeatureInstance
        {
            Ensure = 'Present'
            Name = 'RSAT'
        }

        WindowsFeature My2ndFeatureInstance
        {
            Ensure = 'Present'
            Name = 'Bitlocker'
        }
    }
}

MyDscConfiguration

编译配置

在制定配置之前,必须将其编译为 MOF 文档。 为此,可以像调用 PowerShell 函数一样调用配置。 示例的最后一行仅包含配置的名称,调用配置。

注释

若要调用配置,该函数必须位于全局范围内(与任何其他 PowerShell 函数一样)。 您可以通过“点源”脚本或使用 F5 或单击 ISE 中的 “运行脚本 ”按钮运行配置脚本来实现此目的。 要对脚本进行点源,请运行命令 . .\myConfig.ps1 where myConfig.ps1 是包含配置的脚本文件的名称。

调用配置时,它:

  • 解决所有变量
  • 在当前目录中创建一个与配置同名的文件夹。
  • 在新目录中创建一个名为 NodeName.mof 的文件,其中 NodeName 是配置的目标节点的名称。 如果有多个节点,则将为每个节点创建一个 MOF 文件。

注释

MOF 文件包含目标节点的所有配置信息。 因此,请务必确保其安全。 有关详细信息,请参阅 保护 MOF 文件

编译上述第一个配置将产生以下文件夹结构:

. .\MyDscConfiguration.ps1
MyDscConfiguration
    Directory: C:\users\default\Documents\DSC Configurations\MyDscConfiguration
Mode                LastWriteTime         Length Name
----                -------------         ------ ----
-a----       10/23/2015   4:32 PM           2842 localhost.mof

如果配置采用参数,如第二个示例所示,则必须在编译时提供该参数。 这是它的样子:

. .\MyDscConfiguration.ps1
MyDscConfiguration -ComputerName 'MyTestNode'
    Directory: C:\users\default\Documents\DSC Configurations\MyDscConfiguration
Mode                LastWriteTime         Length Name
----                -------------         ------ ----
-a----       10/23/2015   4:32 PM           2842 MyTestNode.mof

在配置中使用新资源

如果运行了前面的示例,你可能已注意到你已警告你正在使用资源而不显式导入资源。 目前,DSC 附带 12 个资源作为 PSDesiredStateConfiguration 模块的一部分。

cmdlet Get-DscResource 可用于确定系统上安装了哪些资源并可供 LCM 使用。 将这些模块放入 $env:PSModulePath 并被 Get-DscResource 正确识别后,仍需要在配置中加载它们。

Import-DscResource 是一个动态关键字,只能在 Configuration 块中识别,它不是 cmdlet。 Import-DscResource 支持两个参数:

  • ModuleName 是使用 Import-DscResource 的推荐方法。 它接受包含要导入的资源的模块的名称(以及模块名称的字符串数组)。
  • 名称 是要导入的资源的名称。 这不是 Get-DscResource 作为“Name”返回的友好名称,而是定义资源架构时使用的类名(由 Get-DscResource 返回为 ResourceType)。

有关使用 Import-DSCResource的详细信息,请参阅 使用 Import-DSCResource

PowerShell v4 和 v5 差异

DSC 资源在 PowerShell 4.0 中的存储位置存在差异。 有关详细信息,请参阅 资源位置

另请参阅