it-swarm.com.de

Konnte keine Klasse finden, und doch ist es da

Wenn ich einen puppet agent - Aufruf von einem neuen Image aus durchführe, wird der Fehler err: Could not find class custommod Angezeigt. Das Modul selbst befindet sich in /etc/puppet/modules/custommod 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 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

Zeile 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.pp Im 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 kommt es nie zur Apps-Datei. Wenn ich include custommod Auskommentiere, wird der obige Fehler stattdessen in der Zeile class{ "custommod::apps": frontend => "false} Generiert.

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

31
sysadmin1138

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

Umgebungen.

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

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

Nachdem ich strace darauf geworfen hatte, um herauszufinden, wo nach Dateien gesucht wurde, bemerkte ich etwas. Es suchte nach Unterkünften unter /etc/puppet/environments/production/modules, und da es dort ein Verzeichnis gab (leer), es ging dann nicht zu überprüfen /etc/puppet/modules. Anscheinend prüft es beim Importieren eines Moduls eher auf Verzeichnispräsenz als auf Dateipräsenz (init.pp).

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

Führen Sie den Puppenagenten in einer anderen Umgebung aus, die Dinge beginnen zu funktionieren.

Moral der Geschichte:

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

32
sysadmin1138

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

Wenn Sie ein Puppenmodul wie folgt generieren:

puppet module generate foo-example_module

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

Der Name der in der Datei 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 mit der folgenden Meldung gewarnt:

ERROR: example_module not in autoload module layout on line 42

Wenn Sie eine Puppendatei 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'
4
spuder

Ein weiteres Problem, das auftreten kann, ist, wenn Ihr Modul eine ungültige metadata.json - Datei hat.

Stellen Sie sicher, dass die Datei metadata.json Alle erforderlichen Felder enthält (siehe https://docs.puppet.com/puppet/latest/reference/modules_metadata.html#allowed-keys-in-metadatajson =)

2
Nico

Ich hatte ein ähnliches Problem. In meinem Fall war der Klassenname "onehost :: change_IoT_password_reminder". Nachdem ich strace verwendet hatte, stellte ich fest, dass Puppet nach einer Datei modules/onehost/manifestests/change_iot_password_reminder.pp suchte. Es scheint keine gute Idee zu sein, Großbuchstaben in Klassennamen zu verwenden, auch wenn es nicht der erste Buchstabe der Klasse ist.

0
Geoff Crompton

Ähnliches Problem mit Puppet 3.7.1 für Fedora: Klassenpuppe für my.server konnte nicht gefunden werden

Lösung:

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

Dann funktioniert es.

0
Haibo Liu