【问题标题】:How do I avoid repeating myself in class declarations for puppet nodes?如何避免在 puppet 节点的类声明中重复自己?
【发布时间】: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


【解决方案1】:

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

每当您发现自己将设置重新声明为类参数时,都应该考虑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 将在/your/hiera/data/directory/node/common.yaml 中恢复为默认的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'

hiera.yaml 中的 :merge_behavior: deeper 如果您想合并不同层次级别的设置或将复杂的散列组合成单个值,则非常有用。如需更多信息,请参阅Hiera Lookup Types

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-28
    相关资源
    最近更新 更多