Warum würde Puppet eine Dateiressource ohne Fehler ausschließen?

Warum würde Puppet eine Dateiressource ohne Fehler ausschließen?

Während dieses Puppet-Laufs (mit ) passiert etwas höchst Merkwürdiges, Puppet Applyund das macht mich ratlos. Ich habe meine üblichen Kanäle ausprobiert, um Lösungen zu finden, aber ich kann nichts zu diesem Thema finden. Ich entschuldige mich für meine Ausführlichkeit, ich möchte einfach nichts auslassen :\

-

Meine Klasse

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

}

.. und meinPuppet Run überspringt dielogio_plugin_fileAnweisung (oder kopiert die Datei aus irgendeinem Grund nicht).

-

Protokolle usw.

Das Debug-Protokoll ist ziemlich groß und ich wollte nicht alles einfügen, daher hier jede Zeile im Puppet-Lauf, in der „logio_plugin_file“ erwähnt wird, aber ich stelle bei Bedarf gerne mehr zur Verfügung.

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

Der Begriff „logio_plugin_file“ wird nur als Teil von zwei Puppet::Util::LogEinträgen erwähnt und es File[logio_plugin_file]existiert kein Eintrag.

Nachfolgend ein kurzer Ausschnitt dieser beiden Einträge:

- !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]"

-

Fremdheit

Diese Datei ist in einem großen Katalog mit Dutzenden oder Hunderten anderer Klassen enthalten. Das Seltsame ist jedoch, dass diese Klasse puppet applywie am Schnürchen läuft, wenn ich sie direkt mithilfe eines schnellen Testmanifests (ebenfalls mithilfe von ) einbinde. (Obwohl ich die Serviceanforderung entfernen musste.)

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

.. und ich bekomme dies in meiner Ausgabe ..

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

.. und das in 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
  ...

-

Zusätzliche Punkte, Informationen und Tests

  • Ich habe das gerade erst hinzugefügt Notify => Service['logstash']und dieses Verhalten trat bereits vorher auf.
  • Es werden keine Fehler ausgegeben
  • notify{}Ich habe meiner Klasse einige Anrufe hinzugefügt, stage_supportum sicherzustellen, dass sie ordnungsgemäß in den Katalog aufgenommen werden, und das ist der Fall.
  • Exec['create_codec_dir']erstellt mein Verzeichnis
  • Ich habe versucht, den pathParameter zu ändern, um logio2.rbzu sehen, ob die Klasse
  • Ich habe versucht, File['logio_plugin_file']eine andere Ressource anzufordern. Die anfordernde Ressource wurde ausgeführt, aber die Datei wurde nicht erstellt.
  • Aktualisieren:Ich habe versucht, meinen Dateitypaufruf so zu reduzieren, dass er nur die titlePluszeichen ensure, path, und enthält source, was jedoch keine Wirkung hatte.
  • Aktualisieren:Ich habe versucht, die Ressource umzubenennen (z. B. logio_plugin_file_x), aber das hat nicht geholfen.

    [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)
    

-

Wichtiger Hinweis

Dieses Problem tritt auf, nachdem ich eine Umstrukturierung des Codes durchgeführt habe. Es ist also mit ziemlicher Sicherheit darauf zurückzuführen, aber ich kann das Problem nicht beheben.

Jede Hilfe wird sehr geschätzt!

Antwort1

Wie erwartet war die Ursache des Problems einfach, auch wenn ich immer noch nicht verstehe, warum Puppet diesbezüglich keinen Fehler ausgegeben hat:

Profil/logstash.pp:(anderswo)

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

Beachten Sie den zirkulären Verweis in der Anforderung:File['logstash_plugin_sub'] -> File['logstash_plugin_sub']

Das daraus resultierende Verhalten ist sehr seltsam und ich habe das Problem mit diesem Test gefunden:

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

Die Idee besteht hauptsächlich darin, meine Datei an immer tieferen Stellen im Baum hinzuzufügen. Auf diese Idee bin ich gekommen, weil ich pathin meinem ursprünglichen Beispiel erfolgreich Änderungen vornehmen konnte.

So wurde folgendes erstellt:

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

Aber die beiden tieferen Ressourcen wurden übersprungen, also wusste ich, dass mein Problem im Mittelpunkt stand /etc/logstash/plugins/logstash. Bei genauerem Hinsehen fand ich den Zirkelverweis.

Ich hoffe, das hilft jemandem, und danke an Shane Madden für seine Zeit.

verwandte Informationen