Puppet requer que a função não faça o que eu quero na definição do nó

1

Estou usando o Puppet (versão 2.7.19) com o Vagrant para configurar uma caixa dev para um projeto. Eu tenho as classes Puppet para todas as dependências que eu preciso, no entanto, para minha caixa Vagrant eu preciso executar uma atualização do apt-get primeiro. Eu envolvi essa lógica em uma classe chamada "vagrant :: bootstrap".

Como eu quero manter minhas outras classes como "box neutral" quanto possível, eu escrevi a seguinte definição de nó no meu site.pp para que minhas necessidades específicas da caixa Vagrant não poluam a configuração de outras máquinas.

node default {
  require vagrant::bootstrap
  include base, puppet::agent, php::php54, apache2
}

class apache2 {
  include apache2::install, apache2::service
}

class apache2::install {
  package { [ "apache2", "apache2-doc", "apache2-mpm-worker", "apache2-utils", "libapache2-mod-fcgid" ]:
  ensure => present
}

}

Todos os módulos são carregados corretamente, até onde eu sei, mas vejo o Puppet tentando instalar o apache2 antes que a execução do update do apt-get seja concluída

err: /Stage[main]/Apache2::Install/Package[apache2-utils]/ensure: change from purged to present failed: Execution of '/usr/bin/apt-get -q -y -o DPkg::Options::=--force-confold install apache2-utils' returned 100: Reading package lists...
Building dependency tree...
Reading state information...
E: Unable to locate package apache2-utils

Examinando os documentos do Puppet, os exemplos que tenho visto são de classes não nós, por exemplo: link

Estou esperando a coisa errada de Puppet aqui? Eu quero afirmar que o bootstrap vagrant precisa ser a primeira coisa a ser executada antes de qualquer outra coisa; então todos os outros pacotes serão instalados corretamente.

    
por kierans 23.02.2013 / 09:23

1 resposta

2

Certo, require não funcionará para isso, o comportamento de construção de dependência se aplica à classe da qual ele é chamado (que não funciona quando é de um nó). Uma abordagem seria usar o encadeamento de recursos:

node default {
  include vagrant::bootstrap, base, puppet::agent, php::php54, apache2
  Class["vagrant::bootstrap"] -> Class["apache2"]
}

Ou, como alternativa, basta tornar o bootstrap um requisito para a instalação do pacote:

class apache2 {
  # ..like this..
  require vagrant::bootstrap
  include apache2::install, apache2::service
}
class apache2::install {
  package { [ "apache2", "apache2-doc", "apache2-mpm-worker", "apache2-utils", "libapache2-mod-fcgid" ]:
    ensure  => present,
    # ..or like this.
    require => Class["vagrant::bootstrap"],
  }
}
    
por 23.02.2013 / 09:57