如何避免在木偶节点的类声明中重复自己?

时间:2015-12-04 09:39:13

标签: configuration-files dry configuration-management puppet-enterprise redis-cluster

基本上,我发现自己每次都要做同样的长班宣言:

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没有自愿参加,我会在答案中进一步阐述。

1 个答案:

答案 0 :(得分: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
  3. 中的默认/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

    获得节点{1,2}
    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