使用 Import-DSCResource
Import-DSCResource
是只能在配置脚本块内使用的动态关键,用于导入配置中所需的任何资源。
$PSHOME
下的资源是自动导入的,但显式导入配置中使用的所有资源仍被视为是最佳做法。
Import-DSCResource
的语法如下所示。 按名称指定模块时,要求在新行中列出每个模块。
Import-DscResource [-Name <ResourceName(s)>] [-ModuleName <ModuleName>] [-ModuleVersion <ModuleVersion>]
parameters
-
-Name
- 必须导入的 DSC 资源名称。 如果指定了模块名称,命令将在该模块中搜索这些 DSC 资源;否则,命令将在所有 DSC 资源路径中搜索 DSC 资源。 支持通配符。 -
-ModuleName
- 模块名称或模块规范。 如果指定要从模块导入的资源,该命令将尝试只导入这些资源。 如果仅指定模块,则命令将导入模块中的所有 DSC 资源。 -
-ModuleVersion
- 从 PowerShell 5.0 开始,可以指定配置应使用的模块版本。 有关详细信息,请参阅导入已安装资源的特定版本。
Import-DscResource -ModuleName xActiveDirectory
示例:在配置中使用 Import-DSCResource
Configuration MSDSCConfiguration
{
# Search for and imports Service, File, and Registry from the module PSDesiredStateConfiguration.
Import-DSCResource -ModuleName PSDesiredStateConfiguration -Name Service, File, Registry
# Search for and import Resource1 from the module that defines it.
# If only –Name parameter is used then resources can belong to different PowerShell modules as well.
# TimeZone resource is from the ComputerManagementDSC module which is not installed by default.
# As a best practice, list each requirement on a different line if possible. This makes reviewing
# multiple changes in source control a bit easier.
Import-DSCResource -Name File
Import-DSCResource -Name TimeZone
# Search for and import all DSC resources inside the module PSDesiredStateConfiguration.
# When specifying the modulename parameter, it is a requirement to list each on a new line.
Import-DSCResource -ModuleName PSDesiredStateConfiguration
# In PowerShell 5.0 and later, you can specify a ModuleVersion parameter
Import-DSCResource -ModuleName ComputerManagementDsc -ModuleVersion 6.0.0.0
...
注意
不支持在同一命令中为资源名称和模块名称指定多个值。 当相同的资源存在于多个模块中时,可能会存在从哪个模块加载哪个资源的非确定性行为。 下面的命令将在编译期间导致错误。
Import-DscResource -Name UserConfigProvider*,TestLogger1 -ModuleName UserConfigProv,PsModuleForTestLogger
仅使用 Name 参数时要考虑的事项:
- 它是一种资源密集型操作,具体取决于安装在计算机上的模块数量。
- 它将加载使用给定名称找到的第一个资源。 如果安装了多个具有相同名称的资源,则可能加载错误资源。
建议的用法是使用 -Name
参数指定 –ModuleName
,如下所述。
这种用法具有以下优势:
- 它通过限制指定资源的搜索范围来降低性能影响。
- 它显式定义定义资源的模块,以确保加载正确资源。
注意
在 PowerShell 5.0 中,DSC 资源可以拥有多个版本,并且这些版本可以并行安装在计算机上。 这是通过将多个版本的资源模块包含在同一个模块文件夹中实现的。 有关详细信息,请参阅使用具有多个版本的资源。
Intellisense 与 Import-DSCResource
在 ISE 中创作 DSC 配置时,PowerShell 为资源和资源属性提供 IntelliSense。
$pshome
模块路径下的资源定义将自动加载。
当使用 Import-DSCResource
关键字导入资源时,将添加指定的资源定义,并扩展 Intellisense 以包含导入的资源架构。
注意
从 PowerShell 5.0 开始,已将 Tab 自动补全添加到 DSC 资源及其属性的 ISE 中。 有关详细信息,请参阅资源。
在编译配置时,PowerShell 使用导入的资源定义来验证配置中的所有资源块。 根据以下规则,使用资源的架构定义对每个资源块进行验证。
- 仅使用架构中定义的属性。
- 每个属性的数据类型均正确无误。
- 指定键属性。
- 不使用只读属性。
- 验证值映射类型。
请考虑以下配置:
Configuration SchemaValidationInCorrectEnumValue
{
# It is best practice to explicitly import all resources used in your Configuration.
# This includes resources that are imported automatically, like WindowsFeature.
Import-DSCResource -Name WindowsFeature
Node localhost
{
WindowsFeature ROLE1
{
Name = "Telnet-Client"
Ensure = "Invalid"
}
}
}
编译此配置会导致错误。
PSDesiredStateConfiguration\WindowsFeature: At least one of the values 'Invalid' is not supported or
valid for property 'Ensure' on class 'WindowsFeature'. Please specify only supported values:
Present, Absent.
Intellisense 和架构验证允许在解析和编译期间捕获更多错误,从而避免了运行时的复杂性。
注意
每个 DSC 资源都可以有一个名称,以及一个由资源架构定义的 FriendlyName 。 下面是“MSFT_ServiceResource.shema.mof”的前两行。
[ClassVersion("1.0.0"),FriendlyName("Service")]
class MSFT_ServiceResource : OMI_BaseResource
在配置中使用此资源时,可以指定 MSFT_ServiceResource 或 Service 。
PowerShell v4 和 v5 差异
你会发现,在 PowerShell 4.0 中编写配置与在 PowerShell 5.0 及更高版本中编写配置有许多不同之处。 本节将重点介绍你所看到的与本文相关的差异。
多个资源版本
PowerShell 4.0 不支持同时安装和使用多个资源版本。 如果注意到将资源导入配置时存在问题,请确保只安装一个资源版本。
在下图中,安装了两个版本的 xPSDesiredStateConfiguration 模块。
将所需模块版本的内容复制到模块目录的顶层。
资源位置
在编写和编译配置时,资源可以存储在 PSModulePath 指定的任何目录中。
在 PowerShell 4.0 中,LCM 要求所有 DSC 资源模块都存储在“Program Files\WindowsPowerShell\Modules”或 $pshome\Modules
下。 从 PowerShell 5.0 开始,此要求已被删除,资源模块可以存储在 PSModulePath
指定的任何目录中。
已添加 ModuleVersion
从 PowerShell 5.0 开始,使用 -ModuleVersion
参数可以指定在配置中使用的模块版本。