使用 Puppet 仅创建一次资源

使用 Puppet 仅创建一次资源

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

相关内容