Марионетка: Как использовать ряд общих пакетов, но позволить исключения?

У меня есть приблизительно 200 более или менее идентичных Linux VMs. Существует класс для всей общей конфигурации:

class my_packages {

    class { "::ntp":
        servers     => [ "de.pool.ntp.org" ],
    }
    ....
}

который я включаю в каждый узел в site.pp.

Теперь я хочу выполнить свой собственный сервер местного времени, который является тривиальным использованием puppetlabs/ntp пакета. Я просто должен заменить запись серверов в my_packages с IP-адресом нового сервера времени VM, и что VM теперь имеет ту же запись класса ntp, которая ранее использовалась в my_packages.

node 'mytime' {

#    include my_packages

    class { '::ntp':
        servers => [
            'de.pool.ntp.org',
            'ptbtime1.ptb.de',
            'ptbtime2.ptb.de',
            'ptbtime3.ptb.de',
        ],
    }
    ...
}

Однако начиная с класса ":: ntp" запись теперь определяются в узле, я не могу включать my_packages в запись узла для моего нового сервера времени VM, потому что я получаю ошибку "Двойного объявления" в этом случае.

Подобная проблема произошла при использовании локального сервера имен. Каждый VM имеет/etc/resolv.conf файл, указывающий на локальный сервер имен, таким образом, существует ресурс файла для этого в my_packages. Но сам локальный сервер имен должен иметь другой/etc/resolv.conf файл - он не может указать на себя, пока его установка не полна, который не имеет место во время установки.

Какова наиболее успешная практика для использования единого набора ресурсов, но обеспечения случайных исключений?

2
задан 14 May 2015 в 22:42
1 ответ

Если вы используете Puppet 3 или новее, лучший способ приблизиться к этому - использовать hiera для выполнения автоматического поиска параметров . Вкратце, он позволяет вам объявлять классы, используя синтаксис include, а не синтаксис в стиле ресурсов, что означает, что вы можете иметь несколько объявлений для класса. Обратите внимание, что вы не можете смешивать для класса объявления стиля включения и стиля ресурса.

Обычно, если вы использовали синтаксис включения для объявления класса, он завершился бы ошибкой, если бы он имел какие-либо обязательные параметры. Когда вы используете автоматический поиск параметров, puppet попытается найти значения для параметров через hiera.

Hiera назван так потому, что он пытается искать значения в иерархии источников данных. Вы можете указать эту иерархию в hiera.yaml, и она может сопоставляться с различными фактами (имя хоста, пользовательские факты и т. Д.) Или проверять жестко запрограммированные файлы.

Вот краткий пример, который может работать в вашем случае:

Класс определение:

class my_packages {
  include ::ntp
  ...
}

mytime.yaml:

----
ntp::servers:
  - 'de.pool.ntp.org'
  - 'ptbtime1.ptb.de'
  - 'ptbtime2.ptb.de'
  - 'ptbtime3.ptb.de'

common.yaml:

---
ntp::servers: ['de.pool.ntp.org']

hiera.yaml:

...
:hierarchy:
 - "${::fqdn}"
 - common
...

В этом случае hiera попытается найти значение параметра сервера в классе ntp, используя ключ ntp :: серверы. Сначала он будет искать этот ключ в любых файлах yaml, соответствующих имени хоста, а затем искать в common.yaml.

В большинстве случаев он будет использовать ключ в common.yaml, но в случае mytime узел найдет значение выше по иерархии и перестанет там искать.

Вот ссылка на полный пример , который, кстати, охватывает модуль ntp.

2
ответ дан 3 December 2019 в 11:37

Теги

Похожие вопросы