找不到课程,但在那里


31

当执行puppet agent从一个新的图像调用,我得到一个err: Could not find class custommod错误。该模块本身/etc/puppet/modules/custommod与我们要调用的所有其他模块相同,但是这个模块是固定的。

[site.pp]

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

我确实检查过拼写:}

含量init.pp在custommod目录是完全不值一提:

class custommod {
}

目的是为apps.pp文件创建一个空类,这是其中的肉。

class custommod::apps {

    [lots of stuff]
}

只是,它永远不会到达apps文件。如果我注释掉include custommod,则会class{ "custommod::apps": frontend => "false}在行上生成上述错误。

在寻找这种错误是如何产生的过程中,我缺少什么?我需要注意的是,如果此回购通过本地运行,则效果很好puppet apply


您是否在客户端yaml文件中达到峰值,以查看您的班级是否存在?
Zoredache

@Zoredache客户端上的/ var / lib / puppet / client_yaml /目录为空。客户端出现could not retrieve catalog from remote server:错误,这可能是原因。
sysadmin1138

Hrm ..重新创建了您的基本布局和导入结构,无法重现该问题(在2.7.1上)。应该安全地停止包含空格的操作custommod-甚至可以尝试init.pp将其完全删除,因为它不需要。
Shane Madden

@ShaneMadden我尝试了之后,下一步是扔给strace它,并试图弄清楚它试图以此方式读取哪些文件。
sysadmin1138

Answers:


32

所以...有点尴尬,但是...

环境。

在我的/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)。

删除该空目录,事情开始进行。

在不同的环境中运行人偶代理,事情开始起作用。

这个故事所讲的道德:

人偶环境路径的行为不像bash $ PATH。


8
如果有人没有在puppet.conf中显式定义其模块路径,并且他们想找出puppet的模块路径而不求助于strace,那么他们也可以运行puppet config print modulepath
艾莉森·R.

1
有报道给puppetlabs吗?
费利佩·阿尔瓦雷斯

3
现在,modulepath会触发弃用警告。
麦哲伦2015年

4

我遇到了同样的问题,但修复方法不同

如果您像这样生成一个人偶模块:

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

如果将Puppetfile与r10k或librarian-puppet一起使用,则可能还需要删除名称空间,以便在模块目录中放置不带'foo'前缀的文件。

之前:

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

后:

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


0

针对Fedora的puppet 3.7.1遇到类似的问题:找不到my.server的类puppet

解:

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

然后就可以了。


0

我有一个类似的问题。在我的情况下,类名称为“ onehost :: change_IoT_password_reminder”。使用strace之后,我发现木偶正在查找modules / onehost / manifests / change_iot_password_reminder.pp文件。在类名中使用大写字母似乎不是一个好主意,即使它不是该类的第一个字母也是如此。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.