¿Por qué Puppet excluiría un recurso de archivo sin error?

¿Por qué Puppet excluiría un recurso de archivo sin error?

Lo más extraño está sucediendo durante esta ejecución de Puppet (usando Puppet Apply) y me tiene perplejo. He probado mis canales habituales para encontrar soluciones pero no encuentro nada sobre el tema. Pido disculpas por ser tan detallado, simplemente no quiero omitir nada :\

-

Mi clase

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

}

.. y miLa carrera de marionetas se está saltando ellogio_plugin_fileinstrucción (o, por cualquier motivo, no está copiando el archivo).

-

Registros, etc.

El registro de depuración es bastante grande y no quería pegarlo completo, por lo que aquí están todas las líneas de la ejecución de Puppet que mencionan 'logio_plugin_file', pero con gusto proporcionaré más si es necesario.

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

El término 'logio_plugin_file' solo se menciona como parte de dos Puppet::Util::Logentradas y no File[logio_plugin_file]existe ninguna entrada.

A continuación se muestra un breve fragmento de esas dos 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]"

-

Extrañeza

Este archivo está incluido dentro de un catálogo grande, con docenas o cientos de otras clases, pero lo extraño es que si incluyo esta clase directamente usando un manifiesto de prueba rápida (también usando puppet apply), funciona de maravilla. (Aunque tuve que eliminar el requisito de servicio)

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

.. y obtengo esto en mi salida ..

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

.. y esto en 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
  ...

-

Puntos, información y pruebas adicionales

  • Acabo de agregar el Notify => Service['logstash']y este comportamiento ocurría antes de hacerlo.
  • No se emiten errores
  • Agregué algunas notify{}llamadas en mi stage_supportclase para asegurarme de que se incluyeran correctamente en el catálogo, y así es.
  • Exec['create_codec_dir']está creando mi directorio
  • Intenté cambiar el pathparámetro para logio2.rbver si la clase
  • Intenté solicitarlo File['logio_plugin_file']de otro recurso. Se ejecutó el recurso requerido, pero no se creó el archivo.
  • Actualizar:Intenté reducir la llamada de mi tipo de archivo para incluir solo el titlesigno más ensure, pathy source, lo cual no tuvo ningún efecto.
  • Actualizar:Intenté cambiar el nombre del recurso (por ejemplo logio_plugin_file_x), lo que no ayudó.

    [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

Este problema surge al final de mi reestructuración del código, por lo que es casi seguro que sea el culpable, pero no puedo solucionarlo.

¡Cualquier ayuda es muy apreciada!

Respuesta1

Como era de esperar, el origen del problema resultó ser simple, aunque todavía no entiendo por qué Puppet no generó un error sobre esto:

perfil/logstash.pp:(en otra parte)

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

Tenga en cuenta la referencia circular en el requisito:File['logstash_plugin_sub'] -> File['logstash_plugin_sub']

El comportamiento resultante es muy extraño y encontré el problema usando esta prueba:

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',
}

La idea es, principalmente, intentar agregar mi archivo en ubicaciones cada vez más profundas del árbol. Esta idea se me ocurrió como resultado de poder cambiar pathmi ejemplo original y lograr el éxito.

Así, se creó lo siguiente:

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

Pero se omitieron los dos recursos más profundos, por lo que supe que mi problema se centraba en /etc/logstash/plugins/logstash. Tras una inspección minuciosa, encontré la referencia circular.

Espero que esto ayude a alguien y gracias a Shane Madden por su tiempo.

información relacionada