我有一个类,用于在 puppet 文件夹中准备配置文件和密钥,以便其他节点可以下载它们。除了 puppet master 之外,每个其他节点都会调用该类一次。
我遇到的问题是我只需要创建一次根目录,例如:
file { '/etc/puppet/files/root':
ensure => directory
}
但是,当我开始多次调用该类时,这会导致资源重复。
我知道我可以很简单地修复它,通过使用类似这样的方法来提供一个唯一的资源标题:
file { "create-parent-dir-for-${name}":
path => '/etc/puppet/files/rootdir',
ensure => directory
}
但创建许多额外资源来做同样的事情感觉不对,所以我很想知道是否有替代解决方案。
答案1
我不完全确定是否有更好的方法来解决这个问题(比如将那个公共目录移动到一个只被调用一次的单独类中)。
但无论如何,有一个 stdlib 函数 Ensure_resource (https://github.com/puppetlabs/puppetlabs-stdlib#ensure_resource) 就是这么做的。
你可以在两个地方这样调用它:
ensure_resource('file', '/etc/puppet/files/root', {'ensure' => 'directory' })
就像我说的,通常有更好的方法可以解决这个问题。
如果没有看到完整的代码,很难说这是否是一个好的解决方案。
请谨慎使用。
答案2
这是什么虚拟资源是给。
@file { "/etc/puppet/files/rootdir": ensure => directory }
在需要的地方,使用
realize(File["/etc/puppet/files/rootdir"])
或者
File<| title == "/etc/puppet/files/rootdir" |>
另外,类永远不会产生重复声明错误。您显然在 中声明了文件defined type
。您确实可以按照 Petter H 在其评论中所建议的方式解决此特定问题。
class files {
file { "/etc/puppet/files/rootdir": ensure => directory }
}
define my_cool_type($param...) {
include files
... # <- only stuff that is unique to this instance of my_cool_type
}