更新2014-04-12
此答案中的原始说明可以正常工作,但它显示了创建复合资源的错误方法,这就是为什么需要显式导入模块才能在测试配置中使用复合配置的原因。
复合配置应作为普通 DSC 资源在DSCResources
容器模块的子文件夹。这个在回答里有提到这个 StackOverflow 问题我还写了一篇博客文章创建采用参数的复合 DSC 配置,该配置给出了正确方法的详细说明.
我保留了原来的答案,只是删除了,因为我认为它仍然有帮助。另外,考虑到以下信息,它也应该非常有用。
需要Import-Module调用的原因是只有普通的DSC资源能够自动加载。复合配置应在容器模块的子文件夹中创建MyContainerModule\DSCResources\BaseConfig
. The psm1
容器模块的文件可以为空,复合配置可以与原始答案完全相同(Ìmport-DscResource
命令使用Name
参数而不是ModuleName
参数,如果你想保留 BaseConfig 名称)。
创建复合 DSC 配置的详细步骤
以下是我在创建并验证名为的复合配置时执行的步骤BaseConfig
。我希望这可以为您提供指导。
对于以下所有步骤,我以管理员身份运行 PowerShell ISE。
创建文件夹来保存模块
PS C:\WINDOWS\system32> cd 'C:\Program Files\WindowsPowerShell\Modules'
PS C:\Program Files\WindowsPowerShell\Modules> md BaseConfig
Directory: C:\Program Files\WindowsPowerShell\Modules
Mode LastWriteTime Length Name
---- ------------- ------ ----
d---- 2014-03-04 23:45 BaseConfig
PS C:\Program Files\WindowsPowerShell\Modules> cd .\BaseConfig
PS C:\Program Files\WindowsPowerShell\Modules\BaseConfig>
创建复合配置文件
该文件的命名必须以“.schema.psm1”结尾,因为它被硬编码到 PowerShell DSC 模块中,您可以在文件夹中找到该代码C:\windows\system32\WindowsPowerShell\v1.0\Modules\PSDesiredStateConfiguration
.
PS C:\Program Files\WindowsPowerShell\Modules\BaseConfig> notepad BaseConfig.schema.psm1
在 BaseConfig.schema.psm1 文件中,我输入了以下配置:
Configuration BaseConfig
{
File TestFile1
{
DestinationPath = "C:\CompositeConfigurationCreatedTextFile1.txt";
Contents = "File1Content";
}
File TestFile2
{
DestinationPath = "C:\CompositeConfigurationCreatedTextFile2.txt";
Contents = "File2Content";
}
}
创建模块清单
创建模块清单很简单,只需让 PowerShell 为您完成即可。
PS C:\Program Files\WindowsPowerShell\Modules\BaseConfig> New-ModuleManifest -Path .\BaseConfig.psd1 -RootModule BaseConfig.schema.psm1
验证 PowerShell 是否找到复合配置
完成此步骤后,我们应该完成复合配置。要验证是否可以找到它,请尝试运行以下命令并验证输出:
PS C:\Program Files\WindowsPowerShell\Modules\BaseConfig> Import-Module BaseConfig
PS C:\Program Files\WindowsPowerShell\Modules\BaseConfig> Get-Command -CommandType Configuration
CommandType Name ModuleName
----------- ---- ----------
Configuration BaseConfig BaseConfig
重要的提示:我发现如果我尝试在不先导入模块的情况下执行测试配置(如下),则会失败;它无法识别 BaseConfig。导入模块后,测试配置工作得很好。但是,如果我稍后打开一个新的 PowerShell 会话或在当前 PowerShell 会话中运行“Remove-Module”(这两种方法都确保该模块不会在当前会话中加载),则配置将正常工作。因此,出于某种原因,在我至少导入该模块一次之前,它似乎无法找到我新创建的复合配置。
测试复合配置
要测试复合配置,请创建一个在节点本地主机上配置配置的配置,执行它并验证是否已进行预期的更改。我在下面详细介绍了执行此操作的具体步骤。
创建测试配置
为了使用复合配置,我首先创建了一个配置定义文件,路径为 c:\temp\testconfiguration.ps1
PS C:\Program Files\WindowsPowerShell\Modules\BaseConfig> md c:\Temp
Directory: C:\
Mode LastWriteTime Length Name
---- ------------- ------ ----
d---- 2014-03-04 23:47 Temp
PS C:\Program Files\WindowsPowerShell\Modules\BaseConfig> cd \temp
PS C:\temp> notepad testconfiguration.ps1
我给了它以下内容:
Configuration TestConfiguration
{
Import-DscResource -ModuleName BaseConfig
node localhost
{
BaseConfig Common
{
# The created configuration did not have any parameters, thus no properties
}
}
}
TestConfiguration
创建 mof 文件
然后,要创建 mof 文件,只需执行 ps1 文件
PS C:\temp> .\testconfiguration.ps1
Directory: C:\temp\TestConfiguration
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a--- 2014-03-04 23:49 2266 localhost.mof
执行 DSC 配置
之后,我让 DSC 使用以下命令执行配置:
PS C:\temp> Start-DscConfiguration TestConfiguration
Id Name PSJobTypeName State HasMoreData Location Command
-- ---- ------------- ----- ----------- -------- -------
2 Job2 Configuratio... Running True localhost Start-DscConfiguration...
验证是否已进行预期的更改
最后,我通过验证应该创建的两个文件是否存在来验证复合配置是否已运行。
PS C:\temp> ls c:\ -Filter *.txt
Directory: C:\
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a--- 2014-03-04 23:51 15 CompositeConfigurationCreatedTextFile1.txt
-a--- 2014-03-04 23:51 15 CompositeConfigurationCreatedTextFile2.txt