我有一个简单的 puppet 2.7.18 安装,如下所示:
=== manifests/site.pp ===
node build-1 {
include mod1
include mod2
include mod3
}
=== modules/mod1/manifests/init.pp ===
import "*"
=== modules/mod1/manifests/mod1.pp ===
class mod1 {
file { "/tmp/mod1.file": ensure => present }
}
=== modules/mod2/manifests/init.pp ===
import "*"
=== modules/mod2/manifests/mod2.pp ===
class mod2 {
file { "/tmp/mod2.file": ensure => present }
}
=== modules/mod3/manifests/init.pp ===
import "*"
=== modules/mod3/manifests/mod3.pp ===
class mod3 {
file { "/tmp/mod3.file": ensure => present }
}
当我尝试在 build-1 主机上运行 Puppet 代理时,收到以下消息:
: 0 build-1; sudo puppet agent --noop --test
err: Could not retrieve catalog from remote server: Error 400 on SERVER: Could not find class mod1 for build-1 at /etc/puppet/manifests/site.pp:2 on node build-1
warning: Not using cache on failed catalog
err: Could not retrieve catalog; skipping run
如果我再次运行它,我会得到相同的消息,但针对的是类 mod2。第三次运行它会给我类 mod3 的消息。最后,第四次运行它会成功。但是,如果我只触碰其中一个模块文件(例如 mod1.pp),那么我必须再次经历整个过程;运行 puppet agent 直到每个模块都正确重新编译。这显然是不可持续的。
我注意到的其他一些事情:
- 这看起来类似于https://stackoverflow.com/questions/15289988/puppet-could-not-find-class-hiccups-often-once-after-manifest-module-change,但其中一个似乎是针对 3.0 版的,并且它引用的 bug 票明确指出它不会影响 2.7。无论如何,切换到乘客设置没有帮助。
- 如果我更改模块布局,将整个模块定义放入 init.pp,而不是导入实际模块定义,就不会出现问题。但对于复杂的模块,这样做的扩展性并不好。
答案1
有什么原因导致您无法在init.pp
文件中拥有主类的定义?
我对类别发现的理解还很初级,但是文件modules/mod1/mod1.pp
会自动检查类别mod1::mod1
,而不是mod1
类别。
据我所知,mod1
类应该始终在中定义init.pp
,但这并不意味着整个模块的配置都必须在其中 - 子类很有帮助!
我认为目前推荐的模块设计如下:
mod1/init.pp
:
class mod1 {
include mod1::install
include mod1::config
include mod1::service
}
mod1/install.pp
:
class mod1::install {
package { "somepackage":
ensure => installed,
}
}
mod1/config.pp
:
class mod1::config {
file { "/etc/someapp.conf":
content => "foo",
require => Class["mod1::install"],
notify => Class["mod1::service"],
}
}
mod1/service.pp
:
class mod1::service {
service { "someapp":
ensure => running,
}
}
编辑:此外,您不应该import
在模块内部使用:
http://docs.puppetlabs.com/puppet/2.7/reference/lang_import.html
自动加载清单中的导入行为未定义,并且可能在 Puppet 的不同小版本之间随机变化。您永远不应将导入语句放在模块中;它们应该只存在于 site.pp 中。