Puppet gera erros toda vez que um módulo muda

1

Eu tenho uma instalação trivial de fantoches 2.7.18 da seguinte forma:

=== manifests/site.pp ===
node build-1 {
  include mod1
  include mod2
  include mod3
}

=== modules/mod1/manifests/init.pp ===
import "*"

=== modules/mod1/manifests/mod1.pp ===
class mod1 {
  file { "/tmp/mod1.file": ensure => present }
}

=== modules/mod2/manifests/init.pp ===
import "*"

=== modules/mod2/manifests/mod2.pp ===
class mod2 {
  file { "/tmp/mod2.file": ensure => present }
}

=== modules/mod3/manifests/init.pp ===
import "*"

=== modules/mod3/manifests/mod3.pp ===
class mod3 {
  file { "/tmp/mod3.file": ensure => present }
}

Quando tento executar o agente fantoche no host do build-1, recebo a seguinte mensagem:

: 0 build-1; sudo puppet agent --noop --test
err: Could not retrieve catalog from remote server: Error 400 on SERVER: Could not find class mod1 for build-1 at /etc/puppet/manifests/site.pp:2 on node build-1
warning: Not using cache on failed catalog
err: Could not retrieve catalog; skipping run

Se eu executar de novo, recebo a mesma mensagem, mas para a classe mod2. Executá-lo pela terceira vez me dá a mensagem para a classe mod3. Finalmente, executá-lo pela quarta vez funciona. Mas, se eu não fizer nada além de tocar em um dos arquivos do módulo (por exemplo, mod1.pp), então eu tenho que passar por tudo novamente; executando o agente fantoche até que cada módulo recompile corretamente. Isso obviamente não é sustentável.

Algumas outras coisas que notei:

  1. Isso parece semelhante a link , exceto pelo fato de que um parece ser para a versão 3.0 e o bug ticket ao qual ele se refere especificamente diz que ele não afeta 2.7. Em qualquer caso, mudar para uma configuração de passageiros não ajudou.
  2. Se eu alterar o layout do módulo para apenas colocar toda a definição do módulo no init.pp em vez de importar a definição real do módulo, não obtenho o problema. Mas isso não vai escalar bem para módulos complicados.
por Rudedog 16.05.2013 / 01:48

1 resposta

2

Existe algum motivo para você não ter a definição da classe principal no arquivo init.pp ?

Meu entendimento da descoberta de classes é rudimentar, mas o arquivo modules/mod1/mod1.pp seria automaticamente verificado para a classe mod1::mod1 , não para a classe mod1 .

Tanto quanto eu saiba, a classe mod1 deve sempre ser definida em init.pp , mas isso não significa que a configuração do seu módulo inteiro esteja lá - as subclasses são úteis!

O design do módulo que, acredito, é recomendado hoje em dia é o seguinte:

mod1/init.pp :

class mod1 {
  include mod1::install
  include mod1::config
  include mod1::service
}

mod1/install.pp :

class mod1::install {
  package { "somepackage":
    ensure => installed,
  }
}

mod1/config.pp :

class mod1::config {
  file { "/etc/someapp.conf":
    content => "foo",
    require => Class["mod1::install"],
    notify  => Class["mod1::service"],
  }
}

mod1/service.pp :

class mod1::service {
  service { "someapp":
    ensure => running,
  }
}

Editar: além disso, você não deve usar import dentro dos módulos:

link

The behavior of import within autoloaded manifests is undefined, and may vary randomly between minor versions of Puppet. You should never place import statements in modules; they should only exist in site.pp.

    
por 16.05.2013 / 04:27