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

4

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

-

Minha aula

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 minha execução de Puppet está ignorando a instrução logio_plugin_file (ou, por qualquer motivo, não está copiando o arquivo).

-

Registros, Etc

O log de depuração é bastante grande e não queria colar a coisa toda, então aqui está cada linha na execução do Puppet que menciona 'logio_plugin_file', mas eu de bom grado vou 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 entradas Puppet::Util::Log , e não há entrada File[logio_plugin_file] .

Abaixo, um breve snippet 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

Este arquivo está incluído em um grande catálogo, com dezenas ou centenas de outras classes, mas o que é estranho é se eu incluir esta classe diretamente usando um manifesto de teste rápido (também usando puppet apply ), funciona como um encanto. (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 ocorreu antes de eu fazer isso.
  • Nenhum erro é emitido
  • Eu adicionei algumas notify{} chamadas na minha stage_support classe para garantir que ela estivesse sendo incluída corretamente no catálogo, e é.
  • Exec['create_codec_dir'] está criando meu diretório
  • Tentei alterar o path param para logio2.rb para 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.
  • Atualização: Tentei reduzir a minha chamada do tipo de arquivo para incluir apenas title plus ensure , path e source , o que não teve efeito.
  • Atualização: 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 vem do finalzinho de mim fazendo uma reestruturação de código, então isso é quase certamente a culpa, mas eu não sou capaz de solucionar isso.

Qualquer ajuda é muito apreciada!

    
por LukeChavers 06.12.2013 / 02:32

1 resposta

1

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

profile / 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 require: File['logstash_plugin_sub'] -> File['logstash_plugin_sub']

O comportamento resultante é muito estranho, e achei 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 na árvore. Essa ideia surgiu como resultado de poder alterar o path no meu exemplo original e alcançar o sucesso.

Então, o seguinte foi criado:

/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.

    
por 06.12.2013 / 21:37