Frage Konnte Klasse nicht finden, und doch ist es da


Wenn du a puppet agent Anruf von einem neuen Bild, ich bekomme ein err: Could not find class custommod Error. Das Modul selbst ist in /etc/puppet/modules/custommod wie alle anderen Module, die wir anrufen, aber diese 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 Puppetmaster mit Debug-Ausgabe ausgeführt wird, findet er eindeutig die Informationen für Base und Curl:

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 verkü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.pp im custommod-Verzeichnis ist völlig unauffällig:

class custommod {
}

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

class custommod::apps {

    [lots of stuff]
}

Nur, es wird nie in die apps-Datei gelangen. Wenn ich das auskommentiere include custommod, der obige Fehler wird auf dem generiert class{ "custommod::apps": frontend => "false} Linie stattdessen.

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


29
2018-01-11 22:13


Ursprung


Haben Sie einen Höhepunkt in der Client-YAML-Datei gezogen, um zu sehen, ob Ihre Klasse vorhanden ist? - Zoredache
@Zoredache Das Verzeichnis / var / lib / puppet / client_yaml / ist auf dem Client leer. Der Client erhält ein could not retrieve catalog from remote server: Fehler, der wahrscheinlich der Grund ist. - sysadmin1138♦
Hrm .. hat das grundlegende Layout und die Importstruktur neu erstellt und konnte das Problem nicht reproduzieren (unter 2.7.1). Sollte sicher sein, aufzuhören, einschließlich der leeren custommod - Vielleicht sogar versuchen zu löschen init.pp insgesamt, wie es nicht nötig sein sollte. - Shane Madden♦
@ShaneMadden Nachdem ich das versucht habe, ist mein nächster Schritt zu werfen strace und versuchen herauszufinden, welche Dateien es auf diese Weise zu lesen versucht. - sysadmin1138♦


Antworten:


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

Umgebungen.

Genau dort in meinem /etc/puppet.conf Datei ist das:

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

Nach dem Werfen strace Um herauszufinden, wo es nach Akten suchte, fiel mir etwas auf. Es suchte nach custommod unter /etc/puppet/environments/production/modulesund da war dort ein Verzeichnis (leer), es ging dann nicht nachsehen /etc/puppet/modules. Beim Importieren eines Moduls wird offensichtlich nach dem Vorhandensein eines Verzeichnisses und nicht nach dem Vorhandensein einer Datei gesucht (init.pp).

Entferne das leere Verzeichnis, die Dinge beginnen zu arbeiten.

Führen Sie den Puppet-Agenten mit einer anderen Umgebung aus, die Dinge beginnen zu arbeiten.

Moral der Geschichte:

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


31
2018-01-12 03:22



Und falls jemand seinen Modulpfad nicht explizit in puppet.conf definiert hat und sie den Modulpfad der Puppe ohne Strace suchen wollen, können sie auch laufen puppet config print modulepath. - Alison R.
Ist das Puppentlak berichtet worden? - Felipe Alvarez
Der Modulpfad löst jetzt eine Verwarnungswarnung aus. - Magellan


Ich stieß auf dasselbe Problem, hatte aber eine andere Lösung

Wenn Sie ein Puppenmodul wie folgt erzeugen:

puppet module generate foo-example_module

Es wird ein Modul namens erstellt example_module mit dem foo Namensraum. Alle Manifeste befinden sich in einem Verzeichnis namens foo-example_module

Der Name der in init.pp definierten Klasse muss mit dem Namen des Ordners übereinstimmen.

Einfache Lösung:

mv foo-example_module example_module

Wenn Sie Puppet-Lint ausführen, wird es mit der folgenden Meldung warnen:

ERROR: example_module not in autoload module layout on line 42

Wenn Sie eine 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 => git@github.com:foo/example_module'

nach dem:

mod 'example_module',
    :git => git@github.com:foo/example_module'

3
2017-09-16 21:22





Ein anderes Problem, das auftreten kann, ist, wenn Ihr Modul einen ungültigen hat metadata.json Datei.

Stellen Sie sicher, dass metadata.json Datei haben alle erforderlichen Felder (siehe https://docs.puppet.com/puppet/latest/reference/modules_metadata.html#allowed-keys-in-metadatajson )


1
2018-04-15 18:37





Ran in ähnliches Problem mit Marionette 3.7.1 für Fedora: Die Klassenpuppe für meinen Server konnte nicht gefunden werden

Lösung:

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

Dann funktioniert es.


0
2017-09-11 20:59





Ich hatte ein ähnliches Problem. In meinem Fall war der Klassenname "onehost :: change_IoT_password_reminder". Nach der Verwendung von strace fand ich, dass die Puppe nach einer modules / onehost / manifests / change_iot_password_reminder.pp Datei suchte. Es scheint, dass die Verwendung von Großbuchstaben in Klassennamen keine gute Idee ist, auch wenn es nicht der erste Buchstabe der Klasse ist.


0
2017-08-15 04:51