【发布时间】:2016-03-09 04:40:23
【问题描述】:
基本上,我发现自己每次都在做同样长的类声明:
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,使用Puppet inherits 关键字是个坏主意。
另外,令我沮丧,在 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 没有自愿回答,我将在回答中进一步详细说明。
【问题讨论】:
-
// ,让我知道这个问题是否可以回答,甚至。如果 Puppet 类型通常是重复
node类声明的最佳方式,那么只需添加一个快速评论,我可以在尝试时将问题搁置。 -
您是否考虑过使用 Hiera 而不是在节点上声明它?然后,您可以在 common.yaml 中设置合理的默认值,然后让
"node/%{::hostname}"设置每个主机唯一的一行。 -
// ,好主意!我们团队中比我更聪明的人推荐使用 Hiera。我认为使用 Hiera 会使它更具可读性。实际上,每个主机都有 3 或 4 个设置。我认为“然后让
"node/%{::hostname}"设置每个主机唯一的一行。”在您的评论中意味着我们还将使用 Hiera 为每个主机设置这些项目,对吗? -
我试图给你一个更全面的答案。如果您需要更多信息,请发表评论,我会更新它。
标签: configuration-files dry configuration-management puppet-enterprise redis-cluster