Puppet 需要函数在节点定义中没有执行我想要的操作

Puppet 需要函数在节点定义中没有执行我想要的操作

我正在使用 Puppet(版本 2.7.19)和 Vagrant 为项目设置开发框。我有所需的所有依赖项的 Puppet 类,但是对于我的 Vagrant 框,我需要先运行 apt-get update。我已将该逻辑包装在名为“vagrant::bootstrap”的类中。

因为我想让我的其他类尽可能保持“盒子中立”,所以我在 site.pp 中写了以下节点定义,以便我的 Vagrant 盒子特定需求不会污染其他机器的配置。

node default {
  require vagrant::bootstrap
  include base, puppet::agent, php::php54, apache2
}

class apache2 {
  include apache2::install, apache2::service
}

class apache2::install {
  package { [ "apache2", "apache2-doc", "apache2-mpm-worker", "apache2-utils", "libapache2-mod-fcgid" ]:
  ensure => present
}

}

据我所知,所有模块都已正确加载,但是我看到 Puppet 在 apt-get update 运行完成之前尝试安装 apache2

err: /Stage[main]/Apache2::Install/Package[apache2-utils]/ensure: change from purged to present failed: Execution of '/usr/bin/apt-get -q -y -o DPkg::Options::=--force-confold install apache2-utils' returned 100: Reading package lists...
Building dependency tree...
Reading state information...
E: Unable to locate package apache2-utils

通过 Puppet 文档查看,我看到的需要的示例是类而不是节点,例如:http://docs.puppetlabs.com/puppet/2.7/reference/lang_classes.html#declaring-a-class-with-require

我是不是对 Puppet 的期望错了?我想说的是,vagrant::bootstrap 需要先于其他程序运行;然后所有其他软件包才能正确安装。

答案1

好的,require这行不通,依赖关系构建行为适用于调用它的类(当它来自节点时不起作用)。一种方法是使用资源链:

node default {
  include vagrant::bootstrap, base, puppet::agent, php::php54, apache2
  Class["vagrant::bootstrap"] -> Class["apache2"]
}

或者,简单地将引导程序作为包安装的要求:

class apache2 {
  # ..like this..
  require vagrant::bootstrap
  include apache2::install, apache2::service
}
class apache2::install {
  package { [ "apache2", "apache2-doc", "apache2-mpm-worker", "apache2-utils", "libapache2-mod-fcgid" ]:
    ensure  => present,
    # ..or like this.
    require => Class["vagrant::bootstrap"],
  }
}

相关内容