我有一个类,准备在puppet文件夹内的configuration文件和密钥,以便他们可以由其他节点下载。 除了木偶主人以外,其他每个节点都会被调用一次。
我遇到的问题是我只需要创build一次根目录,例如:
file { '/etc/puppet/files/root': ensure => directory }
但是,当我开始多次调用该类时,会导致重复的资源。
我意识到,我可以通过使用这样的东西来简单地修复它,以提供一个独特的资源标题:
file { "create-parent-dir-for-${name}": path => '/etc/puppet/files/rootdir', ensure => directory }
但是创build许多额外的资源来做同样的事情感觉不对,所以我很想知道是否有其他解决scheme。
我不完全确定是否没有更好的方法来解决这个问题(比如将公共目录移动到一个只能调用一次的独立类中)。
但无论如何,有stdlib函数ensure_resource( https://github.com/puppetlabs/puppetlabs-stdlib#ensure_resource )正是这样做。
你会在这两个地方这样称呼它:
ensure_resource('file', '/etc/puppet/files/root', {'ensure' => 'directory' })
正如我所说,通常有更好的方法来解决这个问题。
很难说如果这是一个很好的解决scheme,而没有看到完整的代码。
谨慎使用。
这是虚拟资源的用途。
@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 }