Por que o Puppet excluiria um recurso de arquivo sem erros?

Por que o Puppet excluiria um recurso de arquivo sem erros?

A coisa mais estranha está acontecendo durante a execução do Puppet (usando Puppet Apply) e isso me deixou perplexo. Tentei meus canais habituais para encontrar soluções, mas não consigo encontrar nada sobre o assunto. Peço desculpas por ser tão prolixo, só não quero deixar nada de fora :\

-

Minha classe

class c2c::profile::app::logio::stage_support {

  # Log.io plugin
  # Create plugin directories
  exec { "create_codec_dir":
    command => "/bin/mkdir --parents /etc/logstash/plugins/logstash/codecs --mode=0775",
    creates => '/etc/logstash/plugins/logstash/codecs',
  }

  # Install plugin
  file { "logio_plugin_file":

    # update: added in response to a serverfault comment
    ensure  => file,

    path    => '/etc/logstash/plugins/logstash/codecs/logio.rb',
    mode    => '0775',
    owner   => 'root',
    group   => 'root',
    source  => 'puppet:///modules/c2c/logstash/logio_codec.rb',
    require => Exec['create_codec_dir'],
    notify  => Service['logstash'],
  }

}

.. e meuA corrida de marionetes é pular ologio_plugin_fileinstrução (ou, por qualquer motivo, não está copiando o arquivo).

-

Registros, etc.

O log de depuração é bastante grande e não queria colar tudo, então aqui estão todas as linhas da execução do Puppet que mencionam 'logio_plugin_file', mas terei prazer em fornecer mais, se necessário.

Debug: /File[logio_plugin_file]/seluser: Found seluser default 'system_u' for /etc/logstash/plugins/logstash/codecs/logio.rb
Debug: /File[logio_plugin_file]/selrole: Found selrole default 'object_r' for /etc/logstash/plugins/logstash/codecs/logio.rb
Debug: /File[logio_plugin_file]/seltype: Found seltype default 'etc_t' for /etc/logstash/plugins/logstash/codecs/logio.rb
Debug: /File[logio_plugin_file]/selrange: Found selrange default 's0' for /etc/logstash/plugins/logstash/codecs/logio.rb
..
Debug: /File[logio_plugin_file]/require: requires Exec[create_codec_dir]
Debug: /File[logio_plugin_file]/notify: subscribes to Service[logstash]
..
Debug: /File[logio_plugin_file]: Autorequiring File[logstash_codec_plugins]

/var/lib/puppet/state/last_run_report.yaml

O termo 'logio_plugin_file' é mencionado apenas como parte de duas Puppet::Util::Logentradas e não File[logio_plugin_file]existe nenhuma entrada.

Abaixo está um trecho rápido dessas duas entradas:

- !ruby/object:Puppet::Util::Log
  level: !ruby/sym debug
  time: 2013-12-06 17:30:38.009095 +00:00
  tags: 
    - debug
    - file
    - logio_plugin_file
    - class
    ... (25 more ) ...
  line: 41
  source: /File[logio_plugin_file]/require
  file: /tmp/vagrant-puppet/modules-0/c2c/manifests/profile/app/logio/stage_support.pp
  message: "requires Exec[create_codec_dir]"

  .. further down, mostly the same except ..

  message: "subscribes to Service[logstash]"

-

Estranheza

Esse arquivo está incluído em um grande catálogo, com dezenas ou centenas de outras classes, mas o estranho é que se eu incluir essa classe diretamente usando um manifesto de teste rápido (também usando puppet apply), ele funciona perfeitamente. (Embora eu tenha que remover o requisito de serviço)

node default {
  class { 'c2c::profile::app::logio::stage_support': }
}

.. e eu recebo isso na minha saída ..

Notice: /File[logio_plugin_file]/ensure: defined content as '{md5}41d00952843b8159b95ce4fcd8015cda'

.. e isso em last_run_report.yaml..

File[logio_plugin_file]: !ruby/object:Puppet::Resource::Status
  resource: File[logio_plugin_file]
  file: /tmp/vagrant-puppet/modules-0/c2c/manifests/profile/app/logio/stage_support.pp
  line: 40
  evaluation_time: 0.023071
  change_count: 1
  out_of_sync_count: 1
  ...

-

Pontos, informações e testes adicionais

  • Acabei de adicionar o Notify => Service['logstash'], e esse comportamento estava ocorrendo antes de fazer isso.
  • Nenhum erro é emitido
  • Adicionei algumas notify{}chamadas na minha stage_supportturma para garantir que ela estava sendo incluída corretamente no catálogo, e está.
  • Exec['create_codec_dir']está criando meu diretório
  • Tentei mudar o pathparâmetro para logio2.rbpara ver se a classe
  • Tentei exigir File['logio_plugin_file']de outro recurso. O recurso necessário foi executado, mas o arquivo não foi criado.
  • Atualizar:Tentei reduzir minha chamada de tipo de arquivo para incluir apenas titleplus ensure, pathe source, o que não teve efeito.
  • Atualizar:Tentei renomear o recurso (por exemplo logio_plugin_file_x), o que não ajudou.

    [root@dev ~]# puppet --version
    3.2.3
    
    [root@dev ~]# facter --version
    1.7.2
    
    [root@dev ~]# cat /etc/redhat-release
    CentOS release 6.4 (Final)
    

-

Nota importante

Esse problema surge depois de eu fazer uma reestruturação de código, então é quase certo que a culpa é disso, mas não consigo solucionar isso.

Qualquer ajuda é muito apreciada!

Responder1

Como esperado, a origem do problema acabou sendo simples, embora eu ainda não entenda por que o Puppet não disparou um erro sobre isso:

perfil/logstash.pp:(em outro lugar)

file { 'logstash_plugin_sub':
  path      => '/etc/logstash/plugins/logstash',
  ensure    => 'directory',
  owner     => 'root',
  group     => 'root',
  mode      => '0775',
  require   => [ File['logstash_plugin_sub'] ]
}

Observe a referência circular no requerimento:File['logstash_plugin_sub'] -> File['logstash_plugin_sub']

O comportamento resultante é muito estranho e descobri o problema usando este teste:

file { "logio_plugin_file_a":
  path    => '/etc/logstash/logio.rb',
  source  => 'puppet:///modules/c2c/logstash/logio_codec.rb',
}
file { "logio_plugin_file_b":
  path    => '/etc/logstash/plugins/logio.rb',
  source  => 'puppet:///modules/c2c/logstash/logio_codec.rb',
}
file { "logio_plugin_file_c":
  path    => '/etc/logstash/plugins/logstash/logio.rb',
  source  => 'puppet:///modules/c2c/logstash/logio_codec.rb',
}
file { "logio_plugin_file_d":
  path    => '/etc/logstash/plugins/logstash/codecs/logio.rb',
  source  => 'puppet:///modules/c2c/logstash/logio_codec.rb',
}

A ideia é, principalmente, tentar adicionar meu arquivo em locais cada vez mais profundos da árvore. Essa ideia surgiu como resultado de poder mudar o pathmeu exemplo original e alcançar o sucesso.

Assim, foi criado o seguinte:

/etc/logstash/logio.rb
/etc/logstash/plugins/logio.rb

Mas os dois recursos mais profundos foram ignorados, então eu sabia que meu problema estava centrado em /etc/logstash/plugins/logstash. Após uma inspeção minuciosa, encontrei a referência circular.

Espero que isso ajude alguém e obrigado a Shane Madden pelo seu tempo.

informação relacionada