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
。 - 一个或多个节点块。 这些将定义正在配置的节点(计算机或 VM)。
在上述配置中,有一个 Node 块面向名为 的计算机
TEST-PC1
。 节点块可以接受多个计算机名称。 - 一个或多个资源块。 这是此配置为其正在配置的资源设置属性的位置。 在这种情况下,有两个资源块,每个资源块都调用 WindowsFeature 资源。
注意
WindowsFeature DSC 资源仅在 Windows Server 计算机上可用。 对于具有客户端 OS(如 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
节点块还可以接受多个计算机名称。 在上述示例中,可以使用 -ComputerName
参数,也可以将以逗号分隔的计算机列表直接传递到节点块。
MyDscConfiguration -ComputerName "localhost", "Server01"
从配置中向 Node 块指定计算机列表时,需要使用数组表示法。
Configuration MyDscConfiguration
{
Node @('localhost', 'Server01')
{
WindowsFeature MyFeatureInstance
{
Ensure = 'Present'
Name = 'RSAT'
}
WindowsFeature My2ndFeatureInstance
{
Ensure = 'Present'
Name = 'Bitlocker'
}
}
}
MyDscConfiguration
正在编译配置
必须将其编译为 MOF 文档才能执行配置。 可通过调用配置(像调用 PowerShell 函数一样)来执行此操作。 此示例的最后一行仅包含配置名称,用于调用配置。
注意
函数必须在全局范围内(与其他任何 PowerShell 函数一样),才能调用配置。 可通过以下方式来实现此操作:对脚本执行“dot-source”操作,或者使用 F5 或单击 ISE 中的“运行脚本”按钮以运行配置脚本。 若要对脚本执行“dot-source”操作,请运行命令 . .\myConfig.ps1
,其中 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
如果配置采用了参数(如示例 2 所述),则需在编译时提供该参数。 其形式如下:
. .\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 是仅可在配置块中识别的动态关键字,它不是 cmdlet。 Import-DscResource 支持两种参数:
- ModuleName 是使用 Import-DscResource 的推荐方法。 它接受包含要导入资源的模块名称以及模块名称的字符串数组。
- Name 是要导入资源的名称。 这不是由 Get-DscResource 返回为“Name”的友好名称,而是定义资源架构时使用的类名(由 Get-DscResource 返回为 ResourceType)。
有关使用 Import-DSCResource
的详细信息,请参阅使用 Import-DSCResource
PowerShell v4 和 v5 差异
DSC 资源需要在 PowerShell 4.0 中存储的位置存在差异。 有关详细信息,请参阅资源位置。