我正在尝试为 Hashicorp Consul DCS 构建两个 Puppet 配置文件。Consul 可以作为客户端或服务器代理运行,服务器模式是客户端模式的超集。这直接反映在配置中:
Consul 服务器代理通常需要 Consul 客户端代理所需的配置超集。
我的 Puppet 设计方法基于此模式: https ://puppet.com/docs/pe/2018.1/the_roles_and_profiles_method.html
根据 Puppet 文档,应该可以(并且最可能需要)在consul_client
配置文件中包含配置consul_server
文件以避免代码重复:
配置文件可以包括其他配置文件。
为了实现这一点,我在两个配置文件上都使用了一些强制参数,并在执行自动 rspec 单元测试期间遇到了问题。
在consul_client
单元测试文件consul_client_spec.rb
中,我只是提供了所需的参数,如下所示:
let(:params) { {
'datacenter' => 'unit-test',
'encrypt' => 'DUMMY',
'server_agent_nodes' => [ '1.2.3.4' ]
} }
尝试运行consul_server_spec.rb
单元测试时出现问题。天真地,我只是传递了consul_server
配置文件的一个附加必需参数:
let(:params) { {
'bootstrap_expect' => 3,
} }
由于consul_client
配置文件由配置文件include
编辑/require
编辑consul_server
,因此测试失败,缺少consul_client
配置文件类的参数。这似乎表明这种方法存在一些普遍的结构性问题。
现在,我不确定是否应该在consul_client
配置文件类中重新声明配置文件类的所有参数consul_server
——在我看来,这会违反 DRY 原则。profile::consul_client::*
此外,当将来使用 Hiera 数据时,这将导致其中profile::consul_server::*
包含一些相同的重复数据,因为必须为两个配置文件重复数据的客户端相关部分。
补充说明:并且在类中复制参数consul_server
甚至可能不起作用,因为参数不能显式传递,而只能通过数据传递到类似包含的资源定义 - 所以那些重复的参数不能传递给consul_client
类。
相反,文档说明了以下内容,但我不确定这是否也适用于包含的配置文件类(因为它们可能不是组件类?):
配置文件拥有其组件类的所有类参数。如果配置文件省略了一个,那意味着你肯定想要默认值;组件类不应使用 Hiera 数据中的值。如果您需要设置之前省略的类参数,请重构配置文件。
除了这些想法之外,人们还可以看到两个配置文件类被重构为单独模块的普通类,这可能有助于了解不同设计方法的含义。
总之,出现以下问题:
- 嵌套配置文件中的参数应该如何处理,应该由分层数据单独为每个配置文件类单独设置?
- 如何在单元测试期间将参数传递给嵌套配置文件?以某种方式提供模拟 hiera 数据作为测试夹具的一部分是否是正确的方法?
- 模拟
consul_client
配置文件类会是更好的选择吗?