When doing a puppet agent
call from a new image, I'm getting a err: 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 the class{ "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
.
So... this is a bit embarrassing, but...
Environments.
Right there in my
/etc/puppet.conf
file is this: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:
I ran into this same problem, but had a different fix
If you generate a puppet module like so:
It will create a module named
example_module
with thefoo
name space. All the manifests will be inside a directory calledfoo-example_module
The name of the class defined in the init.pp needs to be the same as the folder name.
Simple fix:
If you run puppet-lint, it will warn with the following message:
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:
after:
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 )Ran into similar problem with puppet 3.7.1 for Fedora: Could not find class puppet for my.server
Solution:
Then it works.
I had a similar problem. In my case the class name was "onehost::change_IoT_password_reminder". After using strace I found that puppet was looking for a modules/onehost/manifests/change_iot_password_reminder.pp file. It seems using upper case letters in class names is not a good idea, even if it's not the first letter of the class.