我的 puppet 清单中有一个名为 postgresql::user 的定义
我已输入以下内容,以确保 Puppet 不会尝试做某事两次:
if !defined (Postgresql::User["dbuser"]) {
postgresql::user { "dbuser":
ensure => present
}
}
但是我仍然在 puppetd --test 中收到错误
err: Could not retrieve catalog: Duplicate definition: Postgresql::User[dbuser] is already defined in file /etc/puppet/modules/dbserver/manifests/postgresql8-3.pp at line 22; cannot redefine at /etc/puppet/modules/dbserver/manifests/postgresql8-3.pp:7 on node mynode
我感觉它在检查是否已定义时不喜欢大写字母和“::”。有办法避免这种情况吗?
答案1
问题不在于大小写,而在于 /etc/puppet/modules/dbserver/manifests/postgresql8-3.pp 中资源的定义重复。这里有一个简单的清单来演示这一点:
define foo::bar {
notify { $name: }
}
foo::bar { "hello": }
if !defined (Foo::Bar['hello']) {
foo::bar { "hello": }
}
如果将 !defined 更改为 defined,您将看到与您的错误类似的重复资源错误。我会发布您的完整清单,而不是片段。
如果两个模块需要实现相同的资源,也可以尝试虚拟资源(@type)。