2

基本上,我发现自己每次都在做同样的长类声明:

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 没有自愿回答,我将在回答中进一步详细说明。

4

1 回答 1

2

对于我最初发表的评论,这是一个更明确的答案:

每当您发现自己将设置重新声明为类参数时,都应该考虑Hiera 。从文档:

Hiera 是一个用于配置数据的键/值查找工具,旨在使 Puppet 变得更好,并让您设置特定于节点的数据而无需重复自己。

第一步是确定层次结构,因为 Hiera 将使用该层次结构来查找请求键的适当值。在您的示例中,只需要一个简单的层次结构。这是一个示例hiera.yaml配置文件:

:backends:
  - yaml

:hierarchy:
  - "node/%{::hostname}"
  - "common"

:yaml:
  :datadir: '/your/hiera/data/directory'

:merge_behavior: deeper    

关于上面的配置:

  1. Hiera 将/your/hiera/data/directory/node/nodehostname.yaml首先寻找价值。您可以在此处定义每个主机的配置。
  2. 对于所有其他值,Hiera 将恢复为默认common.yaml/your/hiera/data/directory/node/common.yaml

所以,你common.yaml可能看起来像这样:

redis::package_ensure: '3.0.5'
redis::pid_file: '/var/run/redis.pid'

您将拥有 node{1,2} /your/hiera/data/directory/node/node{1,2}.yaml

redis::slaveof: 'your redis master value'

并且 node{3,4} 会有这个/your/hiera/data/directory/node/node{3,4}.yaml

redis::slaveof: 'your other redis master value'

如果您想合并不同层次级别的设置或将复杂的哈希组合成单个值,则:merge_behavior: deeperinhiera.yaml很有用。有关详细信息,请参阅Hiera 查找类型

于 2016-01-15T22:58:20.663 回答