我试图在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系统。
答案 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
}
}
}