У меня есть приблизительно 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 файл - он не может указать на себя, пока его установка не полна, который не имеет место во время установки.
Какова наиболее успешная практика для использования единого набора ресурсов, но обеспечения случайных исключений?
Если вы используете 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.