Class 通过其他模块访问模块的参数
我正在尝试处理以下情况:Class 通过其他模块访问模块的参数,class,inheritance,puppet,encapsulation,devops,Class,Inheritance,Puppet,Encapsulation,Devops,我正在尝试处理以下情况: class profile:mq { include rabbitmq } class rabbitmq ( $user, $pass, $host ) { ...logic... } 我想使用hiera自动查找通过profile::mq类(例如profile::mq:rabbitmq::user:“value”,而不是rabbitmq::user:“value”)在rabbitmq中填充参数。我的猜测是封装rabbitmq,但不确定如何在puppet中完成。您只需
class profile:mq {
include rabbitmq
}
class rabbitmq (
$user, $pass, $host ) {
...logic...
}
我想使用hiera自动查找通过profile::mq类(例如profile::mq:rabbitmq::user:“value”,而不是rabbitmq::user:“value”)在rabbitmq中填充参数。我的猜测是封装rabbitmq,但不确定如何在puppet中完成。您只需定义:
rabbitmq::user: some_user
rabbitmq::pass: some_password
rabbitmq::host: some_host
在
hiera
层次结构的适当配置文件中。hiera
中的值将被强制接受。您还需要在profile::mq中声明您的参数:
class profile::mq($user, $pass, $host) {
class { 'profile::mq':
user => $user,
pass => $pass,
host => $host
}
...
..
}
class rabbitmq($user, $pass, $host) {
...
}
在这里,您可以使用class{rabbitmq:params}
而不是使用include
实例化rabbitmq
类,这样您就可以将profile::mq
参数传递给rabbitmq
类
希望这有助于自动化数据绑定:好计划 然而,它根本不符合你的提议。给定类用于查找其参数值的hiera键仅取决于类和参数名称。它们独立于该类的任何和所有声明的轨迹。否则就不可能了,因为同一个类的多个声明可能会对同一个目标节点求值,而且——因为类是单例——它们都声明了同一个类(实例)
通过将rabbitmq参数值放入Hiera层次结构中特定于概要文件的级别,您可能能够实现您所追求的目标。我觉得这不太合适,但它可能足以满足您的需要。类似于资源的类声明几乎总是一个坏主意。它们有意义的少数情况涉及模块的内部类。这是希拉的工作。作为奖励,使用Hiera意味着无需修改第三方模块。Hiera将用于设置
profile::mq
的参数@smaj询问如何为profile::mq
而不是rabbitmq
设置参数。但是,我同意最好的做法是使用hiera设置rabbitmq参数(以及配置文件中的任何其他参数),并且只包括定义rabbitmq类。我重复:类似资源的类声明几乎总是一个坏主意。这种情况也不例外。此外,在仔细重读这个问题后,OP特别希望使用基于Hiera的自动数据绑定,而这并不是这位回答者所描述的。是的,我昨天测试了这个概念,看起来还可以。主要的缺点是您必须在rabbitmq模块中重新定义参数,将它们指向类定义中的profile:rabbitmq参数。