用Puppet只创build一次资源

我有一个类,准备在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 }