Puppet 可以在模块中进行Hiera查找吗?
我有一个用Java实现的服务,它依赖于3个属性文件。我已经为公共属性模块中的每个属性文件定义了“define”,并从特定于服务的模块中使用它们。其中一个属性文件的“定义”如下所示: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
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()
是很好的。