Puppet - Reinicie um serviço em uma classe diferente

6

Sou relativamente novo no Puppet, mas até agora percebi que ele é uma ferramenta muito poderosa.

Para um exemplo fácil, digamos que eu tenha um módulo "ntp" No módulo ntp eu tenho três classes:

  • class ntp - Instala o pacote do provedor do pacote distro, define as informações para iniciar o serviço, etc.
  • class ntp :: client - Cria o arquivo de configuração para usar meus servidores ntp locais, pára ntp, força um ntpupdate e inicia o serviço ntp
  • class ntp :: server - Cria o arquivo de configuração para fazer meus servidores ntp locais, pára ntp, força um ntpupdate (na configuração inicial) e inicia o serviço ntp

Não tenho certeza da maneira correta de disponibilizar as definições de serviço na classe ntp para as classes ntp :: client e ntp :: server.

Estou usando fatos para, basicamente, identificar os diferentes sistemas operacionais e os nomes de pacotes e serviços. Deixei isso fora dos meus exemplos para salvar a desordem.

Em vez de ter algo como o seguinte em cada aula:

service{ 'ntp':
  name      => $ntpservice,
  ensure    => running,
  subscribe => File['ntpconf'],
}
package{ 'ntp':
  (etc - I think the point has been communicated)

Eu acho que seria mais limpo e fácil definir o serviço na classe ntp e chamar esse serviço na classe ntp da classe ntp :: client e ntp :: server. Basicamente, por causa de múltiplas plataformas (baseadas em RHEL e Debian) os pacotes e serviços podem ser definições ligeiramente diferentes.

O que eu preferiria ter em ntp :: client e ntp :: server é algo assim:

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**],
}

Parece que lembro de ter lido na documentação há algum tempo que isso pode ser feito, mas não consigo encontrar de novo. De todas as coisas que eu marquei, falhei em marcar isso!

Todas as sugestões são muito apreciadas. Agradecemos antecipadamente.

EDIT Além disso, estou usando fatos e maiúsculas e minúsculas para definir os parâmetros para o nome do pacote e nomes de serviço pelo sistema operacional. Eu não incluí essa informação no código de exemplo porque está funcionando bem e parece uma bagunça desnecessária.

    
por JTWOOD 30.07.2012 / 14:56

2 respostas

1

Eu tropecei no que o próprio Puppet considera ser a solução adequada.

Eu li que a herança deve ser evitada, mas é com uma exceção, classes dentro de módulos - de acordo com a documentação encontrada em Guia de Estilo dos Fantoches - Herança de Classes

Como essas são as pessoas que escrevem o software, considero que esta é a MELHOR solução.

Basicamente, se eu tivesse as definições de pacote e serviço acima na classe ntp, quando eu definir a classe ntp :: server eu faria o seguinte:

class ntp::server inherits ntp {

Isso forneceria o que eu precisava e resolve o problema.

Obrigado a todos!

    
por 06.08.2012 / 16:43
1

Eu fiz assim. Pode ser um pouco mais limpo usar um ENC ou Hiera para fazer uma pesquisa com base no nome ou na função do servidor e decidir incluir ntp :: server ou outros, mas isso é bastante simples e não requer software ou configuração adicional.

Tenha em mente que o modelo de herança do Puppet não é normal. Você terá problemas a menos que seu uso seja muito simples. Eu não herdaria mais de uma vez em qualquer módulo.

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
}
    
por 01.08.2012 / 00:08

Tags