基本上,我发现自己每次都要做同样的长班宣言:
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",
必须有更好的方法 - Pocahontas(1995)1
根据https://docs.puppetlabs.com/puppet/latest/reference/lang_node_definitions.html#multiple-names,使用Puppet inherits
关键字是一个坏主意。
另外,对于我的沮丧,在https://docs.puppetlabs.com/puppet/latest/reference/lang_node_definitions.html#aside-best-practices中,他们描述了以下最佳做法:
旁白:最佳做法
尽管node语句几乎可以包含任何Puppet代码,但我们建议您仅使用它们来设置变量并声明类。避免使用资源声明,收集器,条件语句,链接关系和函数;所有这些都属于类或定义的类型。 这样可以更轻松地在节点定义和ENC之间切换。2
我可以定义自定义类型吗?
我通读了How to pass node specific information to class in puppet?,但我不确定他是否也在问同样的问题,虽然我非常愿意学习如何定义类型,但我和#39;我不熟悉他们足以决定是否走这条路。
如何为这个Redis集群避免重复使用像这样的每个Puppet Node定义?
我甚至欢迎一个非常通用的答案,我可以适用于我的具体案例,我也已将其概括为一般。
更新:对于这组环境,使用common.yaml文件使用Hiera应用通用配置似乎已经奏效。如果Dan Bowling没有自愿参加,我会在答案中进一步阐述。
答案 0 :(得分:2)
对于我最初提出的评论,这是一个更加清晰的答案:
每当您发现自己将设置重新声明为类参数时,都应考虑Hiera。来自文档:
Hiera是配置数据的键/值查找工具,旨在使Puppet更好,并允许您设置特定于节点的数据而无需重复自己。
您的第一步是识别层次结构,因为Hiera将使用该层次结构为请求的密钥查找适当的值。在您的示例中,只需要一个简单的层次结构。这是一个示例hiera.yaml
配置文件:
:backends:
- yaml
:hierarchy:
- "node/%{::hostname}"
- "common"
:yaml:
:datadir: '/your/hiera/data/directory'
:merge_behavior: deeper
关于上述配置:
/your/hiera/data/directory/node/nodehostname.yaml
中查找值。您可以在此处定义每个主机配置。common.yaml
/your/hiera/data/directory/node/common.yaml
醇>
因此,您的common.yaml
可能如下所示:
redis::package_ensure: '3.0.5'
redis::pid_file: '/var/run/redis.pid'
您将使用此/your/hiera/data/directory/node/node{1,2}.yaml
redis::slaveof: 'your redis master value'
节点{3,4}会有/your/hiera/data/directory/node/node{3,4}.yaml
:
redis::slaveof: 'your other redis master value'
如果要合并不同层次结构级别的设置或将复杂哈希值合并为单个值,:merge_behavior: deeper
中的hiera.yaml
非常有用。有关详细信息,请参阅Hiera Lookup Types。