Puppet 可以在模块中进行Hiera查找吗?

Puppet 可以在模块中进行Hiera查找吗?,puppet,code-duplication,code-maintainability,Puppet,Code Duplication,Code Maintainability,我有一个用Java实现的服务,它依赖于3个属性文件。我已经为公共属性模块中的每个属性文件定义了“define”,并从特定于服务的模块中使用它们。其中一个属性文件的“定义”如下所示: define properties::rabbitmq ( $property_file, $service_name, $rabbitmq_host, $rabbitmq_username, $rabbitmq_password, $rabbitmq_port, $rabbitmq_vh

我有一个用Java实现的服务,它依赖于3个属性文件。我已经为公共属性模块中的每个属性文件定义了“define”,并从特定于服务的模块中使用它们。其中一个属性文件的“定义”如下所示:

define properties::rabbitmq (
  $property_file,
  $service_name,
  $rabbitmq_host,
  $rabbitmq_username,
  $rabbitmq_password,
  $rabbitmq_port,
  $rabbitmq_vhost) {
  file { $property_file:
    ensure  => file,
    content => template('config/rabbitmq.properties.erb'),
    mode    => '0644',
    notify  => Service[$service_name],
  }
}
我在我的puppet代码中遵循角色和配置文件模式,并在特定于服务的配置文件中执行所有hiera查找。因此,每当属性文件发生更改时,我都需要对使用该属性文件的所有puppet模块进行级联更改。在profile(hiera查找)、module init.pp(从构造函数中添加/删除参数)和config.pp(调用属性文件的“define”时进行参数调整)中需要进行更改

我认为,通过将hiera查找合并到属性文件的“定义”中,可以解决上述问题,如下所示:

define properties::rabbitmq ($property_file, $service_name,) {

  $rabbitmq_host = hiera('rabbitmq_host')
  $rabbitmq_username = hiera('rabbitmq_username')
  $rabbitmq_password = hiera('rabbitmq_password')
  $rabbitmq_port = hiera('rabbitmq_port')
  $rabbitmq_vhost = hiera('rabbitmq_vhost')

  file { $property_file:
    ensure  => file,
    content => template('config/rabbitmq.properties.erb'),
    mode    => '0644',
    notify  => Service[$service_name],
  }
}
但是,以上内容违反了角色和配置文件模式。上面是在模块中执行hiera查找,而不是在概要文件中执行。现在,模块对hiera有着紧密的依赖性。它是一个内部模块(不是为puppet forge设计的),我想,为了代码的可维护性,违反指南应该是可以的


我在上述问题上征求其他人的意见。

考虑混合上述代码。使用“定义”中的hiera查找作为默认参数值,例如
define properties::rabbitmq($rabbitmq\u host=hiera('rabbitmq\u host'),…)
我将完全按照您的方式执行,不会担心惯例。这是你为拥有一个通用模块式属性所付出的代价。如果你不介意的话,这个设计模式看起来有点像霍奇·波奇(hodge podge)。我不清楚
属性
模块的性质,它使用了
配置
模块中的模板,这使事情更加复杂。我认为,如果每个模块都是独立的,那么角色/配置文件的工作效果最好。RabbitMQ属性应该由
RabbitMQ
模块定义,而不是由其他模块使用。如果不对您的代码库进行更广泛的研究,我无法评论这种方法对您来说是否可行。除此之外,在私有模块中自由地使用
hiera()
是很好的。