puppet - 带有条件语句的 Puppet 重复声明错误
问题描述
我正在尝试为 Puppet postgresql 资源配置全局设置。我想有条件地去做。我正在使用if
语句来根据变量的内容对其进行配置。
define setup_postgresql_globals (
$datadir,
) {
if $datadir {
class { 'postgresql::globals':
datadir => "${datadir}",
needs_initdb => true,
version => '9.3',
}
}
else {
class { 'postgresql::globals':
needs_initdb => true,
version => '9.3',
}
}
}
我收到这个错误。
Error: Duplicate declaration: Class[Postgresql::Globals] is already declared
我只想将datadir
参数传递给postgresql::globals
它是否包含一个值。
如何使用条件语句,而不会出现重复声明错误?
解决方案
如何使用条件语句,而不会出现重复声明错误?
问题不在于条件语句,而在于您声明了多个setup_postgresql_globals
. 每次都声明同一个类,虽然类是幂等的并且可以多次声明,但只有给定类的声明的第一次求值才能使用类资源语法。所有其他人必须使用类包含语法的变体之一。
部分出于这个原因,将类似资源的类声明放入定义的类型是一种糟糕的形式。这样做是自找麻烦。如果您需要使用类似资源的类声明,请将其放在另一个类中。这可能完全解决问题,但最坏的情况是将其推向更高的水平。在您的情况下,这看起来可能是一种合理的方法,因为setup_postgresql_globals
肯定听起来像是本身应该是幂等的。
还要考虑类——但不是定义——可以使用自动数据绑定。依靠外部数据自动绑定到你的类参数通常是用类包含的类声明替换类资源类声明的好方法。当以适当的方式应用时,可以产生更清洁、更简单、更易于使用和维护的清单。
推荐阅读
- python - 如何让我的不和谐机器人从 .txt 文件(python)发送消息
- javascript - JS:提交表单并在同一页面上呈现结果
- html - 选择阴影根内的元素
- javascript - 为什么 JavaScript 在 else 之后没有给出条件块的任何错误?
- git - 无法连接到 GitHub API:org.kohsuke.github.HttpException
- dbus - 如何使用 busctl 设置属性来设置 D-Bus 对象?
- sql - 获取最大计数值
- java - 构建 GraalVM 原生镜像时出错。具有堆限制的 UnsupportedFeatureException
- javascript - 如何确保文件输入是视频而不是 Ajax 中的其他任何内容
- php - 调试 Facebook Pixel 微数据时出错