每次模块发生变化时,Puppet 都会生成错误

每次模块发生变化时,Puppet 都会生成错误

我有一个简单的 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 直到每个模块都正确重新编译。这显然是不可持续的。

我注意到的其他一些事情:

  1. 这看起来类似于https://stackoverflow.com/questions/15289988/puppet-could-not-find-class-hiccups-often-once-after-manifest-module-change,但其中一个似乎是针对 3.0 版的,并且它引用的 bug 票明确指出它不会影响 2.7。无论如何,切换到乘客设置没有帮助。
  2. 如果我更改模块布局,将整个模块定义放入 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 中。

相关内容