我已成功创建DSC配置并将其部署到服务器上。作为下一步,我尝试将服务器中常见的配置块部分拆分为可重用部分,或者用DSC说法“复合资源”。经过大量研究后,我仍无法使用复合资源,在运行“Get-DSCResource”时未列出它们。
查看“Get-DSCResource”函数后,似乎需要一个'DSCResources'子文件夹,PowerShell.org电子书没有说明,但PowerShell博客却说明了这一点。 Get-DSCResources函数使用资源名称调用Get-Module(示例中为SimpleConfig)。当根文件夹中没有psd1时(例子中的BaseConfiguration),两者都没有考虑Get-Module没有“看到”子文件夹。我调整了这些方法,得到了下面的例子,但是也没有成功。
我看过:
示例配置:
# $env:ProgramFiles\WindowsPowerShell\BaseConfiguration\BaseConfiguration.psd1
@{
ModuleVersion = '1.0'
GUID = '84f449fd-8f26-4bb9-908f-eb675c56b5d8'
Author = 'James Pogran'
}
# $env:ProgramFiles\WindowsPowerShell\BaseConfiguration\DSCResoures\SimpleConfig\SimpleConfig.schema.psm1
Configuration SimpleConfig
{
Log LogThis
{
Message = "Foo"
}
}
# $env:ProgramFiles\WindowsPowerShell\BaseConfiguration\DSCResoures\SimpleConfig\SimpleConfig.psd1
RootModule = "SimpleConfig.schema.psm1"
答案 0 :(得分:4)
此答案中的原始说明正常工作,但它显示了创建复合资源的错误方法,这就是为什么在能够在测试配置中使用复合配置之前需要显式导入模块的原因。
复合配置应该作为容器模块的DSCResources
子文件夹中的普通DSC资源创建。这在this StackOverflow question的答案中提到,我还在creating composite DSC configurations which take parameters, which gives detailed instructions on the correct approach上写了一篇博文。
我保留了最初的答案,只有通过一次删除,因为我认为它仍然有用。另外,鉴于以下信息,它也应该是非常可用的。
需要进口模块调用的原因是只能自动加载普通的DSC资源。应在容器模块MyContainerModule\DSCResources\BaseConfig
的子文件夹中创建复合配置。容器模块的psm1
文件可以为空,复合配置可以与原始答案状态完全相同(Ìmport-DscResource
命令使用Name
参数而不是ModuleName
参数虽然,如果你想保持BaseConfig名称那里)。
<击> 撞击>
<击>以下是我创建和验证名为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
完成此步骤后,我们应该完成复合配置。要验证是否可以找到它,请尝试运行以下命令并验证输出:
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(两种方式都确保模块未在当前会话中加载),配置将正常工作。因此,出于某种原因,在我至少导入模块一次之前,它似乎找不到我新创建的复合配置。
要测试组合配置,请创建一个配置,该配置在节点localhost上配置配置,执行它并验证是否已进行了预期的更改。我在下面详细说明了我的确切步骤。
要使用复合配置,我首先使用路径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文件,只需执行ps1文件
PS C:\temp> .\testconfiguration.ps1
Directory: C:\temp\TestConfiguration
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a--- 2014-03-04 23:49 2266 localhost.mof
在此之后,我让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
击> <击> 撞击>