Я относительно новичок в Puppet, но пока понимаю, что это очень мощный инструмент.
В качестве простого примера допустим, что у меня есть модуль "ntp". В модуле ntp у меня есть три класса:
Я не уверен, как правильно сделать определения служб в классе ntp доступными для классов ntp :: client и ntp :: server.
Я использую факты, чтобы описать различные операционные системы, а также имена пакетов и служб. Я оставил это в своих примерах, чтобы уберечь от лишнего.
Вместо того, чтобы иметь что-то вроде следующего в каждом классе:
service{ 'ntp':
name => $ntpservice,
ensure => running,
subscribe => File['ntpconf'],
}
package{ 'ntp':
(etc - I think the point has been communicated)
Я бы подумал, что было бы проще и чище определить службу в классе ntp и вызвать эту службу в классе ntp из классов ntp :: client и ntp :: server. По сути, из-за нескольких платформ (на основе RHEL и Debian) пакеты и службы могут иметь несколько разные определения.
Я бы предпочел иметь в ntp :: client и ntp :: server что-то вроде этого:
file{ 'ntpconf':
source => 'puppet:///modules/ntp/ntp.conf',
owner => 'root',
group => 'root',
mode => '0644',
notify => Service[**CALL TO class ntp SERVICE**],
require => Package[**CALL TO class ntp PACKAGE**],
}
Кажется, я помню, как некоторое время назад читал в документации, что это можно сделать, но, похоже, я НЕ МОГУ найти это снова. Из всего, что я добавил в закладки, мне не удалось добавить это в закладки!
Любые предложения приветствуются. Заранее спасибо.
РЕДАКТИРОВАТЬ Кроме того, я использую факты и регистр, чтобы установить параметры для имени пакета и имен служб в зависимости от операционной системы. Я не включил эту информацию в пример кода, потому что он работает нормально и кажется ненужным беспорядком.
Я так и сделал. Возможно, было бы немного проще использовать ENC или Hiera для поиска на основе имени или роли сервера и решения, включать ли ntp :: server или еще что-то, но это довольно просто и не требует дополнительного программного обеспечения или настройки.
Имейте в виду, что модель наследования Puppet ненормальна. У вас будут проблемы, если вы не будете использовать его очень-очень просто. Я бы не унаследовал более одного раза в любом модуле.
class ntp {
include ntp::install, ntp::config, ntp::sevice
Class['ntp::install'] -> Class['ntp::config'] ~> Class['ntp::service']
}
class ntp::config {
file { 'ntp.conf':
ensure => present,
content => template('ntp/ntp.erb'),
}
}
class ntp::config::server inherits ntp::config {
File['ntp.conf'] { content => template('ntp/ntp.conf.server.erb'), }
}
node basenode {
include ntp
}
node /^ntp\d+/ inherits basenode {
include ntp::config::server
}
Я наткнулся на то, что сами Puppet считают правильным решением.
Я читал, что следует избегать наследования, но это за одним исключением, классы в модулях - согласно документации, найденной на Руководство по стилям марионеток - наследование классов
Поскольку это люди, пишущие программное обеспечение, я считаю, что это ЛУЧШЕЕ решение.
По сути, если бы у меня были указанные выше определения пакета и службы в классе ntp, при определении класса ntp :: server я бы сделал следующее:
class ntp::server inherits ntp {
Это обеспечит то, что мне нужно, и решит проблему.
Спасибо всем!