【问题标题】:PowerShell DSC Composite ResourcesPowerShell DSC 复合资源
【发布时间】:2014-03-03 20:57:09
【问题描述】:

我已成功创建 DSC 配置并将它们部署到服务器上。作为下一步,我尝试将服务器中常见的配置块的部分分解为可重用的部分,或者用 DSC 的说法“复合资源”。经过大量研究后,我仍然无法使用复合资源,运行“Get-DSCResource”时它们未列出。

查看“Get-DSCResource”功能后,似乎需要一个“DSCResources”子文件夹,PowerShell.org 电子书没有说明,但 PowerShell 博客有。 Get-DSCResources 函数使用资源名称(示例中的 SimpleConfig)调用 Get-Module。当根文件夹中没有 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"

【问题讨论】:

  • 我自己没看过,但是你看过the DSC Book吗?它仍处于早期草稿形式,但确实有一个关于复合 DSC 资源的部分。
  • 感谢您的建议,但我确实阅读并在我的问题中列出了它。本书中关于复合资源的部分,除了与 PowerShell 博客网站略有不同外,也不起作用
  • 只要我确保可以在Get-Command -CommandType Configuration 列表中看到配置(这是 DSC 运行以查找它的命令的一部分),它对我有用。我遵循了上述 DSC 书中的示例,但我尝试将复合配置放在系统范围的模块文件夹中(不是一个好方法,但可以很好地用于测试目的);在C:\windows\system32\windowspowershell\v1.0\modules\commonconfig 之后它工作得非常好。如果您想让我写一个答案,并附上我为使其正常工作所经历的步骤的完整指南,请告诉我。
  • 我将不胜感激。我已经完成了您之前描述的操作,但无济于事
  • 我已经写了一个非常详细的描述我执行的步骤来创建复合 DSC 配置并验证它是否有效。希望对您有所帮助!

标签: powershell


【解决方案1】:

2014 年 4 月 12 日更新

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

复合配置应作为普通 DSC 资源创建在容器模块的 DSCResources 子文件夹中。这在this StackOverflow question的回答中提到了,我还在creating composite DSC configurations which take parameters, which gives detailed instructions on the correct approach上写了一篇博文。

我保留了原来的答案,只是加上了一个删除线,因为我认为它仍然很有帮助。此外,鉴于以下信息,它也应该非常有用。

需要 Import-Module 调用的原因是只有普通的 DSC 资源能够自动加载。复合配置应在容器模块MyContainerModule\DSCResources\BaseConfig 的子文件夹中创建。容器模块的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(两种方式都可以确保模块未在当前会话中加载),则配置将正常工作。因此,出于某种原因,它似乎在我至少导入了一次模块之前找不到我新创建的复合配置。

测试复合配置

要测试复合配置,请在节点 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 文件

然后,要创建 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    

【讨论】:

  • 所以,这里的关键是在尝试运行“Get-DscResource”或将配置编译为 mof 之前的“Import-Module”命令,这是我缺少的部分。你有我永远的感谢,已经浪费了几个小时,我在任何地方都找不到这一步。如果您不介意,我将编辑您的答案以将其称为必需的“开发”步骤,一旦编译或导入就没有必要,但每次开始新会话时都是必需的(正如您所指出的) .
  • @JamesPogran 之所以需要Import-Module 调用,是因为只有普通的DSC 资源才能自动加载。复合配置应在容器模块MyContainerModule\DSCResources\BaseConfig 的子文件夹中创建。容器模块的 psm1 文件可以为空,复合配置可以与上面提到的答案完全相同(Ìmport-DscResource 命令必须更新为使用Name 而不是ModuleName 参数,如果你想保留那里的 BaseConfig 名称)。我已经更新了上面的答案来描述这一点。
  • 很棒的澄清。博客文章完美地澄清了事情。我使用您的步骤创建了一个 ps 函数来完成这项工作,并将其提交给 PowerShellOrg github 存储库以供包含,感谢您提供的信息
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-28
  • 1970-01-01
相关资源
最近更新 更多