首页 > 解决方案 > 带有条件语句的 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它是否包含一个值。

如何使用条件语句,而不会出现重复声明错误?

标签: puppetpuppet-enterprise

解决方案


如何使用条件语句,而不会出现重复声明错误?

问题不在于条件语句,而在于您声明了多个setup_postgresql_globals. 每次都声明同一个类,虽然类是幂等的并且可以多次声明,但只有给定类的声明的第一次求值才能使用类资源语法。所有其他人必须使用类包含语法的变体之一。

部分出于这个原因,将类似资源的类声明放入定义的类型是一种糟糕的形式。这样做是自找麻烦。如果您需要使用类似资源的类声明,请将其放在另一个类中。这可能完全解决问题,但最坏的情况是将其推向更高的水平。在您的情况下,这看起来可能是一种合理的方法,因为setup_postgresql_globals肯定听起来像是本身应该是幂等的。

还要考虑类——但不是定义——可以使用自动数据绑定。依靠外部数据自动绑定到你的类参数通常是用类包含的类声明替换类资源类声明的好方法。当以适当的方式应用时,可以产生更清洁、更简单、更易于使用和维护的清单。


推荐阅读