PowerShell DSC复合资源

Jam*_*ran 5 powershell

我已成功创建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"
Run Code Online (Sandbox Code Playgroud)

Rob*_*und 4

更新2014-04-12

\n\n

此答案中的原始说明可以正常工作,但它显示了创建复合资源的错误方法,这就是为什么需要显式导入模块才能在测试配置中使用复合配置的原因。

\n\n

DSCResources复合配置应作为普通 DSC 资源在容器模块的子文件夹中创建。StackOverflow 问题的答案中提到了这一点,我还写了一篇关于创建采用参数的复合 DSC 配置的博客文章,其中提供了有关正确方法的详细说明。

\n\n

我保留了原来的答案,只是删除了,因为我认为它仍然有帮助。另外,考虑到以下信息,它应该也非常有用。

\n\n

需要Import-Module调用的原因是只有普通的DSC资源能够自动加载。复合配置应在容器模块的子文件夹中创建MyContainerModule\\DSCResources\\BaseConfig。容器模块的文件psm1可以为空,复合配置可以与原始答案完全相同(该\xc3\x8cmport-DscResource命令使用Name参数而不是ModuleName如果您想保留 BaseConfig 名称,则

\n\n

\n\n

创建复合 DSC 配置的详细步骤

\n\n

以下是我在创建并验证名为的复合配置时执行的步骤BaseConfig。我希望这可以为您提供指导。

\n\n

对于以下所有步骤,我以管理员身份运行 PowerShell ISE。

\n\n

创建文件夹来保存模块

\n\n
PS C:\\WINDOWS\\system32> cd \'C:\\Program Files\\WindowsPowerShell\\Modules\'\nPS C:\\Program Files\\WindowsPowerShell\\Modules> md BaseConfig\n\n    Directory: C:\\Program Files\\WindowsPowerShell\\Modules\n\nMode                LastWriteTime     Length Name                                                                         \n----                -------------     ------ ----                                                                         \nd----        2014-03-04     23:45            BaseConfig                                                                   \n\nPS C:\\Program Files\\WindowsPowerShell\\Modules> cd .\\BaseConfig\nPS C:\\Program Files\\WindowsPowerShell\\Modules\\BaseConfig> \n
Run Code Online (Sandbox Code Playgroud)\n\n

创建复合配置文件

\n\n

该文件的命名必须以“.schema.psm1”结尾,因为它被硬编码到 PowerShell DSC 模块中,您可以在文件夹中找到该代码C:\\windows\\system32\\WindowsPowerShell\\v1.0\\Modules\\PSDesiredStateConfiguration。

\n\n
PS C:\\Program Files\\WindowsPowerShell\\Modules\\BaseConfig> notepad BaseConfig.schema.psm1\n
Run Code Online (Sandbox Code Playgroud)\n\n

在 BaseConfig.schema.psm1 文件中,我输入了以下配置:

\n\n
Configuration BaseConfig\n{\n    File TestFile1\n    {\n        DestinationPath = "C:\\CompositeConfigurationCreatedTextFile1.txt";\n        Contents = "File1Content";\n    }\n    File TestFile2\n    {\n        DestinationPath = "C:\\CompositeConfigurationCreatedTextFile2.txt";\n        Contents = "File2Content";\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

创建模块清单

\n\n

创建模块清单很简单,只需让 PowerShell 为您完成即可。

\n\n
PS C:\\Program Files\\WindowsPowerShell\\Modules\\BaseConfig> New-ModuleManifest -Path .\\BaseConfig.psd1 -RootModule BaseConfig.schema.psm1\n
Run Code Online (Sandbox Code Playgroud)\n\n

验证 PowerShell 是否找到复合配置

\n\n

完成此步骤后,我们应该完成复合配置。要验证是否可以找到它,请尝试运行以下命令并验证输出:

\n\n
PS C:\\Program Files\\WindowsPowerShell\\Modules\\BaseConfig> Import-Module BaseConfig\nPS C:\\Program Files\\WindowsPowerShell\\Modules\\BaseConfig> Get-Command -CommandType Configuration\n\nCommandType     Name                                               ModuleName                                             \n-----------     ----                                               ----------                                             \nConfiguration   BaseConfig                                         BaseConfig \n
Run Code Online (Sandbox Code Playgroud)\n\n

重要提示:我发现如果我尝试在不先导入模块的情况下执行测试配置(如下),则会失败;它无法识别 BaseConfig。导入模块后,测试配置工作得很好。但是,如果我稍后打开一个新的 PowerShell 会话或在当前的 PowerShell 会话中运行“Remove-Module”(这两种方法都确保该模块不会在当前会话中加载),则配置将正常工作。因此,出于某种原因,在我至少导入该模块一次之前,它似乎无法找到我新创建的复合配置。

\n\n

测试复合配置

\n\n

要测试复合配置,请创建一个在节点本地主机上配置配置的配置,执行它并验证是否已进行预期的更改。我在下面详细介绍了执行此操作的具体步骤。

\n\n

创建测试配置

\n\n

为了使用复合配置,我首先创建了一个配置定义文件,路径为 c:\\temp\\testconfiguration.ps1

\n\n
PS C:\\Program Files\\WindowsPowerShell\\Modules\\BaseConfig> md c:\\Temp\n\n    Directory: C:\\\n\nMode                LastWriteTime     Length Name                                                                         \n----                -------------     ------ ----                                                                         \nd----        2014-03-04     23:47            Temp                                                                         \n\nPS C:\\Program Files\\WindowsPowerShell\\Modules\\BaseConfig> cd \\temp\nPS C:\\temp> notepad testconfiguration.ps1\n
Run Code Online (Sandbox Code Playgroud)\n\n

我给了它以下内容:

\n\n
Configuration TestConfiguration\n{\n    Import-DscResource -ModuleName BaseConfig\n\n    node localhost \n    {\n        BaseConfig Common\n        {\n            # The created configuration did not have any parameters, thus no properties\n        }\n    }\n}\n\nTestConfiguration\n
Run Code Online (Sandbox Code Playgroud)\n\n

创建 mof 文件

\n\n

然后,要创建 mof 文件,只需执行 ps1 文件

\n\n
PS C:\\temp> .\\testconfiguration.ps1\n\n    Directory: C:\\temp\\TestConfiguration\n\nMode                LastWriteTime     Length Name                                                                         \n----                -------------     ------ ----                                                                         \n-a---        2014-03-04     23:49       2266 localhost.mof  \n
Run Code Online (Sandbox Code Playgroud)\n\n

执行 DSC 配置

\n\n

之后,我让 DSC 使用以下命令执行配置:

\n\n
PS C:\\temp> Start-DscConfiguration TestConfiguration\n\nId     Name            PSJobTypeName   State         HasMoreData     Location             Command                  \n--     ----            -------------   -----         -----------     --------             -------                  \n2      Job2            Configuratio... Running       True            localhost            Start-DscConfiguration...\n
Run Code Online (Sandbox Code Playgroud)\n\n

验证是否已进行预期的更改

\n\n

最后,我通过验证应该创建的两个文件是否存在来验证复合配置是否已运行。

\n\n
PS C:\\temp> ls c:\\ -Filter *.txt\n\n    Directory: C:\\\n\nMode                LastWriteTime     Length Name                                                                         \n----                -------------     ------ ----                                                                         \n-a---        2014-03-04     23:51         15 CompositeConfigurationCreatedTextFile1.txt                                   \n-a---        2014-03-04     23:51         15 CompositeConfigurationCreatedTextFile2.txt    \n
Run Code Online (Sandbox Code Playgroud)\n\n

\n