Impossibile trovare la classe, eppure è lì


31

Quando si effettua una puppet agentchiamata da una nuova immagine, viene visualizzato un err: Could not find class custommoderrore. Il modulo stesso è /etc/puppet/modules/custommoduguale a tutti gli altri moduli che stiamo chiamando, ma questo è ostinato.

[Site.pp]

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

Quando il burattinaio viene eseguito con l'output di debug, trova chiaramente le informazioni per base e 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

La linea 84 è include custommod

Una directory e una struttura di file abbreviate:

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

Ho controllato l'ortografia:}

Il contenuto di init.ppnella directory custommod è completamente irrilevante:

class custommod {
}

L'intento è quello di creare una classe vuota per il file apps.pp, che è dove si trova la carne.

class custommod::apps {

    [lots of stuff]
}

Solo, non arriva mai al file delle app. Se commento il include custommod, l'errore sopra riportato viene generato sulla class{ "custommod::apps": frontend => "false}riga.

Cosa mi manca nella mia caccia per scoprire come viene generato questo errore? Devo notare che questo repository funziona perfettamente se viene eseguito localmente tramite puppet apply.


Hai preso un picco nel file client yaml per vedere se la tua classe è presente?
Zoredache,

@Zoredache La directory / var / lib / puppet / client_yaml / è vuota sul client. Il client sta ricevendo un could not retrieve catalog from remote server:errore, probabilmente per questo.
sysadmin1138

Hrm .. ha ricreato il layout di base e la struttura di importazione e non è stato possibile riprodurre il problema (al 2.7.1). Dovrebbe essere sicuro di smettere di includere i vuoti custommod- forse anche provare a eliminare del init.pptutto, poiché non dovrebbe essere necessario.
Shane Madden

@ShaneMadden Dopo averlo provato, il mio prossimo passo è quello di lanciarlo stracee provare a capire quali file sta tentando di leggere in quel modo.
sysadmin1138

Risposte:


32

Quindi ... questo è un po 'imbarazzante, ma ...

Ambienti.

Proprio lì nel mio /etc/puppet.conffile è questo:

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

Dopo straceaverlo lanciato per capire dove cercava i file, ho notato qualcosa. Stava cercando Custommod sotto /etc/puppet/environments/production/modules, e dato che lì c'era una directory (vuota), non andava poi a controllare/etc/puppet/modules . Apparentemente durante l'importazione di un modulo controlla la presenza di directory, piuttosto che la presenza di file (init.pp).

Rimuovi quella directory vuota, le cose iniziano a funzionare.

Esegui l'agente fantoccio usando un ambiente diverso, le cose iniziano a funzionare.

Morale della storia:

I percorsi di Puppet Environment non si comportano come bash $ PATH.


8
E nel caso in cui qualcuno non abbia definito esplicitamente il proprio modulepath in puppet.conf, e desidera scoprire il modulepath del burattino senza ricorrere allo strace, possono anche correre puppet config print modulepath.
Alison R.

1
è stato segnalato a marionette?
Felipe Alvarez,

3
Il modulepath ora attiva un avviso di deprecazione.
Magellan,

4

Ho riscontrato questo stesso problema, ma ho avuto una soluzione diversa

Se generi un modulo fantoccio in questo modo:

puppet module generate foo-example_module

Creerà un modulo denominato example_modulecon lo foospazio dei nomi. Tutti i manifest saranno all'interno di una directory chiamatafoo-example_module

Il nome della classe definita in init.pp deve essere uguale al nome della cartella.

Correzione semplice:

mv foo-example_module example_module

Se esegui un burattino-lanugine, avviserà con il seguente messaggio:

ERROR: example_module not in autoload module layout on line 42

Se si utilizza un Puppetfile con r10k o librarian-puppet, potrebbe anche essere necessario rimuovere lo spazio dei nomi in modo che i file vengano posizionati senza il prefisso "pippo" nella directory dei moduli.

prima:

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

dopo:

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


0

Si è verificato un problema simile con Puppet 3.7.1 per Fedora: Impossibile trovare il pupazzo di classe per my.server

Soluzione:

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

Quindi funziona.


0

Ho avuto un problema simile. Nel mio caso il nome della classe era "onehost :: change_IoT_password_reminder". Dopo aver usato strace ho scoperto che Puppet stava cercando un file modules / onehost / manifest / change_iot_password_reminder.pp. Sembra che usare lettere maiuscole nei nomi delle classi non sia una buona idea, anche se non è la prima lettera della classe.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.