找不到类,但它就在那里

找不到类,但它就在那里

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_modulefoo名称空间命名的模块。所有清单都将位于名为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 文件。似乎在类名中使用大写字母不是一个好主意,即使它不是类的首字母。

相关内容