Назад | Перейти на главную страницу

Puppet - перезапустите службу в другом классе.

Я относительно новичок в 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 {

Это обеспечит то, что мне нужно, и решит проблему.

Спасибо всем!