为什么PowerShell DSC说我在不同的节点中有重复的资源标识符?

时间:2018-02-23 21:44:31

标签: powershell dsc

我试图在PowerShell DSC中做一些相对简单的事情。我想确保两个服务器上有相同的文件:

configuration.ps1:

Configuration MyConfig {
    # I want this block to be common to both nodes
    Node $AllNodes {
        File DirectoryCopy {
            Ensure = "Present"
            Type = "File"
            Recurse = $true
            SourcePath = ".\example.txt"
            DestinationPath = "%userprofile%\example.txt"
            PsDscRunAsCredential = Get-Credential
        }
    }
}

Agents -ConfigurationData .\data.psd1

data.psd1:

@{
    AllNodes = @(
        @{
            NodeName = "server1"
            Role = "ExampleRole1NotUsedYet"
        },
        @{
            NodeName = "server2"
            Role = "ExampleRole2NotUsedYet"
        }
    )
}

这不起作用,并产生错误:

  

PSDesiredStateConfiguration \ File:重复的资源标识符   ' [文件] DirectoryCopy'在处理规范时被发现   node' System.Collections.Hashtable'。更改此资源的名称   这样它在节点规范中是唯一的。

我认为有一些关于PowerShell DSC的基本概念,我错过了。我有办法将此文件应用于两个节点吗?理想情况下,我想在全球范围内应用一些资源,然后将其应用于dev / prod系统。

1 个答案:

答案 0 :(得分:2)

$AllNodes是一个包含[hashtable]的数组,因此当您直接使用它时,它会被枚举,然后在引用为每个元素([hashtable])时节点名称正在转换为字符串,这只是为了显示类名;这就是错误导致您的节点被称为System.Collections.Hashtable而不是您期望的名称的原因。

由于两个哈希表最终都是相同的字符串(无论其内容如何),因此您尝试为同一节点创建两个具有相同名称的File资源,但这些资源无法正常工作。< / p>

你想要的是引用每个哈希表的元素,在这种情况下是NodeName

Configuration MyConfig {
    # I want this block to be common to both nodes
    Node $AllNodes.NodeName {
        File DirectoryCopy {
            Ensure = "Present"
            Type = "File"
            Recurse = $true
            SourcePath = ".\example.txt"
            DestinationPath = "%userprofile%\example.txt"
            PsDscRunAsCredential = Get-Credential
        }
    }
}