Как не повторяться в объявлениях классов для марионеточных узлов?

По сути, я каждый раз делаю одно и то же длинное объявление класса:

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 ...

Допустим, для этого кластера каждый ПЯТЫЙ узел имеет отдельный мастер.

Итак, угадайте единственную часть, которая меняется?

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

Можно ли определить собственный тип?

Я прочитал Как передать информацию об узле в класс в puppet? , но я не уверен, что он спрашивает о том же, что и я, и хотя я совершенно готов научиться определять типы, я недостаточно знаком с ними, чтобы решить, стоит ли идти на это. маршрут.

Как, черт возьми, мне не повторяться с каждым определением Puppet Node для этого кластера Redis?

Я приветствовал бы даже очень общий ответ, который я мог бы применить к моему конкретному случаю, который я также обобщил.

ОБНОВЛЕНИЕ: Применение общей конфигурации с использованием Hiera в файле common.yaml для этого набор сред, похоже, сработал. Я подробнее остановлюсь в ответе, если Дэн Боулинг не предложит его добровольно.


person Nathan Basanese    schedule 04.12.2015    source источник
comment
// , Дайте мне знать, даже если на этот вопрос можно ответить. Если Puppet Types обычно являются лучшим способом для повторяющихся объявлений класса node, тогда просто добавьте быстрый комментарий, и я могу отложить вопрос, пока я попробую это.   -  person Nathan Basanese    schedule 04.12.2015
comment
Вы изучали использование Hiera вместо того, чтобы объявлять это на узле? Затем вы можете просто установить разумные значения по умолчанию в common.yaml, а затем "node/%{::hostname}" установить одну строку, уникальную для каждого хоста.   -  person Dan Bowling    schedule 14.01.2016
comment
// , Отличная идея! Кто-то мудрее меня в нашей команде порекомендовал использовать Hiera. Я думаю, что использование Hiera сделало бы это намного более читабельным. На самом деле у нас есть 3 или 4 настройки, уникальные для каждого хоста. Я так понимаю, что тогда "node/%{::hostname}" установил одну строку, уникальную для каждого хоста. в вашем комментарии означает, что мы также будем использовать Hiera для установки этих элементов, уникальных для каждого хоста, верно?   -  person Nathan Basanese    schedule 14.01.2016
comment
Я попытался дать вам более полный ответ. Оставьте комментарий, если вам нужна дополнительная информация, и я обновлю ее.   -  person Dan Bowling    schedule 16.01.2016


Ответы (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 вернется к значению по умолчанию 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: deeper в hiera.yaml полезен, если вы хотите объединить настройки на разных уровнях иерархии или объединить сложные хэши в отдельные значения. Дополнительные сведения см. в разделе Типы поиска Hiera.

person Dan Bowling    schedule 15.01.2016