Could not find class, and yet it is there
Solution 1
So... this is a bit embarrassing, but...
Environments.
Right there in my /etc/puppet.conf
file is this:
[master]
manifest=$confdir/manifests/site.pp
modulepath=$confdir/environments/$environment/modules:$confdir/modules
After throwing strace
at it to figure out where it was hunting for files, I noticed something. It was looking for custommod under /etc/puppet/environments/production/modules
, and since there was a directory there (empty), it did not then go check /etc/puppet/modules
. Apparently when importing a module it checks for directory-presence, rather than file-presence (init.pp).
Remove that empty directory, things start working.
Run the puppet agent using a different environment, things start working.
Moral of the story:
Puppet Environment paths do not act like bash $PATH.
Solution 2
I ran into this same problem, but had a different fix
If you generate a puppet module like so:
puppet module generate foo-example_module
It will create a module named example_module
with the foo
name space. All the manifests will be inside a directory called foo-example_module
The name of the class defined in the init.pp needs to be the same as the folder name.
Simple fix:
mv foo-example_module example_module
If you run puppet-lint, it will warn with the following message:
ERROR: example_module not in autoload module layout on line 42
If using a Puppetfile with r10k or librarian-puppet, you also may need to remove the name space so that the files are placed without the 'foo' prefix in your modules directory.
before:
mod 'foo-example_module',
:git => [email protected]:foo/example_module'
after:
mod 'example_module',
:git => [email protected]:foo/example_module'
Solution 3
Another problem that might happen is when your module have an invalid metadata.json
file.
Make sure the metadata.json
file have all the required fields (see https://docs.puppet.com/puppet/latest/reference/modules_metadata.html#allowed-keys-in-metadatajson )
Related videos on Youtube
Deb
She/Her, DevOps & Systems Engineering. I do monitoring and telemetry. I read manuals. Also: author of Software Telemetry so I guess I write them too now.
Updated on September 18, 2022Comments
-
Deb almost 2 years
When doing a
puppet agent
call from a new image, I'm getting aerr: Could not find class custommod
error. The module itself is in/etc/puppet/modules/custommod
same as all of the other modules we're calling, but this one is obstinante.[site.pp]
node /clunod-wk\d+\.sub\.example\.local/ { include base include curl include custommod class{ "custommod::apps": frontend => "false} [...] }
When the puppetmaster is run with debug output, it clearly finding the information for base and 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
Line 84 is
include custommod
An abbreviated directory and file structure:
/etc/puppet |- manifests | |- site.pp | |- modules |- base | |- manifests | |- init.pp | |- curl | |- manifests | |- init.pp | |- custommod |- files | |- apps | |- [...] | |- manifests |- init.pp |- apps.pp
I did check spelling :}
The content of
init.pp
in the custommod directory is completely unremarkable:class custommod { }
The intent is to create an empty class for the apps.pp file, which is where the meat is.
class custommod::apps { [lots of stuff] }
Only, it's never getting to the apps file. If I comment out the
include custommod
, the above error is generated on theclass{ "custommod::apps": frontend => "false}
line instead.What am I missing in my hunt to find out how this error is being generated? I need to note that this repo works just fine if it is run locally via
puppet apply
.-
Admin over 12 yearsDid you take a peak in the client yaml file to see if your class is present?
-
Admin over 12 years@Zoredache The /var/lib/puppet/client_yaml/ directory is empty on the client. The client is getting a
could not retrieve catalog from remote server:
error which is probably why. -
Admin over 12 yearsHrm.. re-created your basic layout and import structure and couldn't reproduce the issue (on 2.7.1). Should be safe to stop including the empty
custommod
- maybe even try deletinginit.pp
altogether, as it shouldn't be needed. -
Admin over 12 years@ShaneMadden After I try that, my next step is to throw
strace
at it and attempt to figure out what files it's attempting to read that way.
-
-
Alison R. over 10 yearsAnd in case someone hasn't defined their modulepath explicitly in puppet.conf, and they want to find out puppet's modulepath without resorting to strace, they can also run
puppet config print modulepath
. -
Felipe Alvarez almost 9 yearshas this been reported to puppetlabs?
-
Magellan almost 9 yearsThe modulepath now triggers a deprecation warning.
-
gxx over 2 yearsThank you, still helpful after quite some time.
-
7yl4r over 2 years
modulepath
can no longer be set inpuppet.conf