Konnte keine Klasse finden, und doch ist es da

31

Bei einem puppet agentAnruf von einem neuen Bild erhalte ich eine err: Could not find class custommodFehlermeldung. Das Modul selbst ist /etc/puppet/modules/custommoddasselbe wie alle anderen Module, die wir aufrufen, aber dieses ist hartnäckig.

[site.pp]

node /clunod-wk\d+\.sub\.example\.local/ {
      include base
      include curl
      include custommod
      class{ "custommod::apps": frontend => "false}
      [...]
}

Wenn der Puppenmeister mit Debug-Ausgabe ausgeführt wird, werden die Informationen für Basis und Curl eindeutig gefunden:

debug: importing '/etc/puppet/modules/base/manifests/init.pp' in environment production
debug: Automatically imported base from base into production
debug: importing '/etc/puppet/modules/curl/manifests/init.pp' in environment production
debug: Automatically imported curl from curl into production
err: Could not find class custommod for clunod-wk0130.sub.example.local at /etc/puppet/manifests/site.pp:84 on node clunod-wk0130.sub.example.local

Linie 84 ist include custommod

Eine abgekürzte Verzeichnis- und Dateistruktur:

/etc/puppet
   |- manifests
   |     |- site.pp
   |
   |- modules
         |- base
         |    |- manifests
         |          |- init.pp
         |
         |- curl
         |    |- manifests
         |          |- init.pp
         |   
         |- custommod
              |- files 
              |     |- apps
              |         |- [...]
              |
              |- manifests
                    |- init.pp
                    |- apps.pp

Ich habe die Rechtschreibung überprüft:}

Der Inhalt von init.ppim custommod-Verzeichnis ist völlig unauffällig:

class custommod {
}

Die Absicht ist, eine leere Klasse für die Datei apps.pp zu erstellen, in der sich das Fleisch befindet.

class custommod::apps {

    [lots of stuff]
}

Nur, es kommt nie zur Apps-Datei. Wenn ich das auskommentiere, include custommodwird der obige Fehler class{ "custommod::apps": frontend => "false}stattdessen in der Zeile generiert .

Was fehlt mir bei meiner Suche, um herauszufinden, wie dieser Fehler erzeugt wird? Ich muss beachten, dass dieses Repo gut funktioniert, wenn es lokal über ausgeführt wird puppet apply.

sysadmin1138
quelle
Haben Sie einen Peak in der Client-Yaml-Datei genommen, um zu sehen, ob Ihre Klasse vorhanden ist?
Zoredache
@Zoredache Das Verzeichnis / var / lib / puppet / client_yaml / ist auf dem Client leer. Dem Client wird ein could not retrieve catalog from remote server:Fehler angezeigt. Dies ist wahrscheinlich der Grund.
sysadmin1138
Hrm .. hat Ihr grundlegendes Layout und Ihre Importstruktur neu erstellt und konnte das Problem nicht reproduzieren (auf 2.7.1). Es sollte sicher sein, das custommodLeerzeichen init.ppnicht mehr einzuschließen - vielleicht sollten Sie es sogar ganz löschen , da es nicht benötigt werden sollte.
Shane Madden
@ShaneMadden Nachdem ich das versucht habe, besteht mein nächster Schritt darin, darauf zu werfen straceund herauszufinden, welche Dateien auf diese Weise gelesen werden sollen.
sysadmin1138

Antworten:

32

Also ... das ist ein bisschen peinlich, aber ...

Umgebungen.

Genau dort in meiner /etc/puppet.confDatei ist dies:

[master]
  manifest=$confdir/manifests/site.pp
  modulepath=$confdir/environments/$environment/modules:$confdir/modules

Nachdem straceich darauf geworfen hatte , um herauszufinden, wo es nach Akten suchte, bemerkte ich etwas. Es wurde nach Unterbringung gesucht /etc/puppet/environments/production/modules, und da dort ein Verzeichnis (leer) war, ging es dann nicht zur Überprüfung/etc/puppet/modules . Offensichtlich wird beim Importieren eines Moduls nicht die Datei (init.pp), sondern die Verzeichnispräsenz überprüft.

Entfernen Sie das leere Verzeichnis, die Dinge beginnen zu funktionieren.

Führen Sie den Marionettenagenten in einer anderen Umgebung aus.

Moral der Geschichte:

Puppet Environment-Pfade verhalten sich nicht wie Bash $ PATH.

sysadmin1138
quelle
8
Und falls jemand seinen Modulpfad nicht explizit in puppet.conf definiert hat und den Modulpfad der Puppe herausfinden möchte, ohne auf eine Belastung zurückzugreifen, kann er auch laufen puppet config print modulepath.
Alison R.
1
Wurde Puppetlabs darüber berichtet?
Felipe Alvarez
3
Der Modulpfad löst jetzt eine Verfallswarnung aus.
Magellan
4

Ich bin auf dasselbe Problem gestoßen, hatte aber eine andere Lösung

Wenn Sie ein Marionettenmodul wie folgt generieren:

puppet module generate foo-example_module

Es wird ein Modul example_modulemit dem fooNamen des Namensraums erstellt. Alle Manifeste befinden sich in einem Verzeichnis namensfoo-example_module

Der Name der in der init.pp definierten Klasse muss mit dem Ordnernamen übereinstimmen.

Einfache Lösung:

mv foo-example_module example_module

Wenn Sie Puppet-Lint ausführen, wird die folgende Meldung angezeigt:

ERROR: example_module not in autoload module layout on line 42

Wenn Sie ein Puppetfile mit r10k oder Librarian-Puppet verwenden, müssen Sie möglicherweise auch den Namensraum entfernen, damit die Dateien ohne das Präfix 'foo' in Ihrem Modulverzeichnis abgelegt werden.

Vor:

mod 'foo-example_module',
    :git => [email protected]:foo/example_module'

nach:

mod 'example_module',
    :git => [email protected]:foo/example_module'
Spuder
quelle
0

Stieß auf ein ähnliches Problem mit Puppet 3.7.1 für Fedora: Class Puppet für my.server konnte nicht gefunden werden

Lösung:

sudo ln -s /my/local/copy/puppet/modules /etc/puppet/

Dann klappt es.

Haibo Liu
quelle
0

Ich hatte ein ähnliches Problem. In meinem Fall lautete der Klassenname "onehost :: change_IoT_password_reminder". Nachdem ich strace benutzt habe, habe ich festgestellt, dass Puppet nach einer Datei modules / onehost / manifests / change_iot_password_reminder.pp gesucht hat. Es scheint, dass die Verwendung von Großbuchstaben in Klassennamen keine gute Idee ist, auch wenn es nicht der erste Buchstabe der Klasse ist.

Geoff Crompton
quelle