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参数。