【问题标题】:Powershell DSC: Can someone please provide me an example on how to use a resource?Powershell DSC:有人可以提供一个关于如何使用资源的示例吗?
【发布时间】:2014-06-04 05:14:01
【问题描述】:

对于 DSC 专业人士来说,这似乎是一个非常简单的问题,但我在网络上找不到任何资源,或者我看到的任何错误消息。似乎很难挖掘​​出有关 DSC 的任何信息,所以也许我们可以从这里开始。

我正在尝试构建用于安装计划任务的 Powershell DSC 配置。我在 Steve Murawski 的 Github page for StackExchange resources 上找到了一个示例资源,并且我已将“StackExchangeResources”树复制到我的 DSC 存储库中。

我导入了 StackExchangeModule 并尝试使用 ScheduledTask 资源创建一个非常简单的配置:

Import-Module StackExchangeResources

Configuration TempCleaner
{
    param($NodeName)

    Node $NodeName
    {
        $filePath = "C:\Tasks\TempCleaner.ps1";

        ScheduledTask
        {
            Name = "Clear Temporary Files"
            FilePath = $filePath
            Daily = $true
            FilePath = ""
            Hours = 4
            Minutes = 0
        }
    }
}

但是,当我执行TempCleaner -Node TestNode 时,它实际上并没有做任何事情;没有写入 MOF 文件,也没有抛出任何错误。

现在,我看到的很多示例都涉及为资源调用命名,如下所示:

File TempCleaner
{
    DestinationPath = $filePath
    Contents = $(cat $tempCleanerScript | out-string)
    Checksum = "SHA-512"
}

但是当我尝试给它起这样的名字时,

ScheduledTask CleanerTask
{
    Name = "Clear Temporary Files"
    FilePath = $filePath
    Daily = $true
    FilePath = ""
    Hours = 4
    Minutes = 0
}

会抛出异常:

ScheduledTask:没有找到属性“TaskName”等于的 MSFT_ScheduledTask 对象 “清洁工任务”。验证属性的值并重试。 在 C:\Users\Steve\Documents\DevOps\DSC\TempCleaner.ps1:13 char:9 + ScheduledTask CleanerTask + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : ObjectNotFound: (CleanerTask:String) [Get-ScheduledTask] , CimJobException + FullyQualifiedErrorId : CmdletizationQuery_NotFound_TaskName,Get-ScheduledTask

如上图所示,当我将计划任务资源与文件资源结合使用时,文件资源被写入生成的 MOF 文件,但在其中看不到其他指令。

这里一定有我遗漏的东西。是否有某种我可以启用的详细模式?其他未记录的日志记录选项?那会很有帮助。

【问题讨论】:

标签: powershell dsc


【解决方案1】:

1) 要使用第三方资源,您需要使用 Import-DscResource 导入,而不是 Import-Module。

Import-DscResource -Name StackExchange_ScheduledTask -ModuleName StackExchangeResources

另外,请注意它必须在配置范围内

2) 确保您使用的资源模块已部署到 C:\Program Files\WindowsPowerShell\Modules\ 将整个 StackExchangeResources 文件夹及其内容(DSCResources 等)放在那里。

3) 资源名称为必填项

ScheduledTask task
{
#...
}

这是带有修复的配置:

Configuration TempCleaner
{
    param($NodeName)

    Import-DscResource -Name StackExchange_ScheduledTask -ModuleName StackExchangeResources
    Node $NodeName
    {
        $filePath = "C:\test\TempCleaner.ps1";

        ScheduledTask task
        {
            Name = "Clear Temporary Files"
            FilePath = $filePath
            Daily = $true
            Hours = 4
            Minutes = 0
        }
    }
}

希望对你有帮助。

【讨论】:

  • 非常感谢 - 我相信这会解决我的问题,所以我将其标记为答案。不幸的是,我们在 DSC 方面遇到了太多问题——这个问题描述了其中之一。这项技术看起来很有前景,但使用起来非常困难,而且没有很好的记录,所以我认为我们会等几年让它变得更好,然后再重新评估。
【解决方案2】:

如果您正在寻找 DSC 的介绍,那么我建议您从以下位置开始:

尚无法添加 cmets,因此请编辑我的回复。我认为您的资源中可能有重复的键。

Import-Module StackExchangeResources

Configuration TempCleaner
{
    param($NodeName)

    Node $NodeName
    {
        $filePath = "C:\Tasks\TempCleaner.ps1";

        ScheduledTask
        {
            Name = "Clear Temporary Files"
            FilePath = $filePath
            Daily = $true
            #FilePath = "" - Need unique keys. Also, FilePath is only a string not string[]
            Hours = 4
            Minutes = 0
        }
    }
}

【讨论】:

  • 感谢这两个资源——我以前没见过;他们非常有趣,有助于我理解 DSC。不幸的是,它没有回答我的具体问题,即为什么不能为某些资源指定资源名称。如果您对此有任何进一步的意见,我很想知道。
猜你喜欢
  • 1970-01-01
  • 2021-10-31
  • 2010-10-01
  • 1970-01-01
  • 2014-05-25
  • 1970-01-01
  • 2012-10-25
  • 1970-01-01
  • 2017-09-29
相关资源
最近更新 更多