基本上,我发现自己每次都在做同样的长类声明:
node 'gluster3redis097.myservice.com' {
class { 'redis' :
class {'invoke' : }
class {'users' : }
class {'redis' :
package_ensure => '3.0.5',
#extra_config_file => '/etc/redis.d/redis-gluster3-master.conf',
daemonize => 'yes',
pid_file => '/var/run/redis.pid',
log_level => 'notice',
log_file => '/var/log/redis/redis.log',
#save_db_to_disk => false,
workdir => './',
bind => $::ipaddress,
slaveof => "${$gluster3redis_master_ips[37]}:6379",
slave_serve_stale_data => true,
# 2015.12.01 nathan Do not allow inadvertent writes to the slave
slave_read_only => true,
repl-diskless-sync-delay => '5',
repl-ping-slave-period => '10',
... and so on ...
... and so forth ...
让我们假设,对于这个集群,每个 FIFTH 节点都有一个单独的主节点。
那么,猜猜唯一改变的部分是什么?
slaveof => "${$gluster3redis_master_ips[37]}:6379",
一定有更好的方法。
-- 风中奇缘 (1995) 1
根据https://docs.puppetlabs.com/puppet/latest/reference/lang_node_definitions.html#multiple-names,使用 Puppetinherits
关键字是个坏主意。
另外,令我沮丧的是,在https://docs.puppetlabs.com/puppet/latest/reference/lang_node_definitions.html#aside-best-practices中,他们描述了以下最佳实践:
旁白:最佳实践
虽然节点语句几乎可以包含任何 Puppet 代码,但我们建议您只使用它们来设置变量和声明类。避免在其中使用资源声明、收集器、条件语句、链接关系和函数;所有这些都属于类或定义的类型。这将更容易在节点定义和 ENC 之间切换。2
我可以定义自定义类型吗?
我通读了How to pass node specific information to class in puppet?,但我不确定他问的和我一样,虽然我非常愿意学习如何定义类型,但我对它们的熟悉程度不足以决定是否走那条路。
对于这个 Redis 集群,我如何避免在每个 Puppet Node 定义中重复自己?
我什至欢迎一个非常通用的答案,我可以将其应用于我的特定案例,我也已经概括了。
更新:通过 common.yaml 文件为这组环境应用 Hiera 的通用配置似乎已经奏效。如果 Dan Bowling 没有自愿回答,我将在回答中进一步详细说明。