将参数从配置文件传递到模块的傀儡



我有一个模块"base",其中包含一个init.pp类,其中包含一些参数:

class base (
$listen_ip = "xx.xx.xx.xx",
$listen_port = 3306,
$admin_username = 'admin',
$admin_password = 'admin',
)
{
...
}

然后我创建了一个配置文件"base",我想在其中设置一些参数:

class profile::base {
class { 'base':
$listen_ip = "xxx.xxx.xx.xx",
$listen_port => 6033,
}
}

然后是我要设置用户名和密码的辅助配置文件:

class profile::department::sales::base {
class { '::profile::base':
$admin_username = "some_user",
$admin_password => "some_pw",
}
}

但是,无法从"销售"配置文件中设置参数。 这个想法是,对于基类,某些值将始终相同,而某些值因部门而异。

> 但是,无法从"销售"配置文件中设置参数。

不完全是。 不允许在构建一个清单时对同一类使用两个不同的类似资源的声明。 即使使用一个,则必须确保它是目录生成器评估的该类的第一个(或唯一(声明。

要理解这一点,您需要了解分配参数值不是您正在使用的声明的主要目的。 主要目的是指定所讨论的类应首先包含在目录中。 为了达到该目标,值在计算类的第一个声明时绑定到类的所有参数。 因此,您的两个类声明不会相互补充。 相反,它们相互冲突。

即使它为类base指定的参数值与类profile::base声明的参数值相同,Puppet仍然反对类profile::department::sales::base的所有使用。 为了简化求值并绝对确定避免不一致,它实现了比实际需要的更强的约束:只有任何给定类的首次求值声明可能是类似资源的声明。

注意:最新的文档实际上指定了一个比这更强大的约束:"类资源类声明要求您只声明一次给定的类。 然而,在实践中,这是一种简化(在引入参数化类以来发布的每个版本的 Puppet 中(。 这可能是受到这样一个事实的启发,即 Puppet 清单的评估顺序可能难以预测,因此,如果您在不同的清单中使用类似包含的声明以及同一类的类似资源的声明,那么可能很难确保始终首先评估类似资源的声明。

这个想法是,对于基数,某些值将始终相同 类,有些因部门而异。

对于大多数目的,最好完全避免类似资源的类声明,而是依靠外部数据(Hiera(将值绑定到类参数。 Hiera 识别数据源的层次结构(因此得名(,并支持在不同级别指定不同的参数,甚至覆盖更高优先级级别一个级别的数据。

那么,我的建议是利用Hiera为类base分配适当的参数值。 细节可以通过多种方式发挥作用。

最新更新