puppet agent
从新图像进行调用时,我收到err: Could not find class custommod
错误。模块本身/etc/puppet/modules/custommod
与我们调用的所有其他模块相同,但这个模块很顽固。
[站点.页]
node /clunod-wk\d+\.sub\.example\.local/ {
include base
include curl
include custommod
class{ "custommod::apps": frontend => "false}
[...]
}
当使用调试输出运行 puppetmaster 时,它可以清楚地找到有关 base 和 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
第 84 行是include custommod
简要的目录和文件结构:
/etc/puppet
|- manifests
| |- site.pp
|
|- modules
|- base
| |- manifests
| |- init.pp
|
|- curl
| |- manifests
| |- init.pp
|
|- custommod
|- files
| |- apps
| |- [...]
|
|- manifests
|- init.pp
|- apps.pp
我确实检查了拼写:}
custommod 目录中的内容init.pp
完全没有什么特别之处:
class custommod {
}
目的是为 apps.pp 文件创建一个空类,这是文件的核心所在。
class custommod::apps {
[lots of stuff]
}
只是,它永远无法进入应用程序文件。如果我注释掉include custommod
,则上面的错误会在该class{ "custommod::apps": frontend => "false}
行上生成。
我在寻找这个错误是如何产生的过程中遗漏了什么?我需要注意的是,如果这个 repo 通过 本地运行,它就可以正常工作puppet apply
。
答案1
所以……这有点尴尬,但是……
环境。
我的文件中/etc/puppet.conf
有这样的内容:
[master]
manifest=$confdir/manifests/site.pp
modulepath=$confdir/environments/$environment/modules:$confdir/modules
在尝试strace
弄清楚它在哪里寻找文件之后,我注意到了一些东西。它在 下寻找 custommod /etc/puppet/environments/production/modules
,因为那里有一个目录(空的),然后它就没有去检查/etc/puppet/modules
。显然,在导入模块时,它会检查目录是否存在,而不是文件是否存在(init.pp)。
删除该空目录,一切开始正常工作。
使用不同的环境运行 Puppet 代理,一切开始正常工作。
故事的道德启示:
Puppet 环境路径不像 bash $PATH。
答案2
我遇到了同样的问题,但有一个不同的解决方法
如果你生成如下 puppet 模块:
puppet module generate foo-example_module
它将创建一个example_module
以foo
名称空间命名的模块。所有清单都将位于名为foo-example_module
init.pp中定义的类名需要与文件夹名相同。
简单修复:
mv foo-example_module example_module
如果您运行 puppet-lint,它将发出以下警告消息:
ERROR: example_module not in autoload module layout on line 42
如果使用带有 r10k 或 librarian-puppet 的 Puppetfile,您可能还需要删除名称空间,以便文件在模块目录中不带“foo”前缀。
前:
mod 'foo-example_module',
:git => [email protected]:foo/example_module'
后:
mod 'example_module',
:git => [email protected]:foo/example_module'
答案3
可能发生的另一个问题是当您的模块有一个无效metadata.json
文件时。
确保metadata.json
文件包含所有必填字段(请参阅https://docs.puppet.com/puppet/latest/reference/modules_metadata.html#allowed-keys-in-metadatajson)
答案4
我遇到了类似的问题。在我的例子中,类名是“onehost::change_IoT_password_reminder”。使用 strace 后,我发现 puppet 正在寻找 modules/onehost/manifests/change_iot_password_reminder.pp 文件。似乎在类名中使用大写字母不是一个好主意,即使它不是类的首字母。