Назад | Перейти на главную страницу

Puppet требует, чтобы функция не выполняла то, что я хочу, в определении узла

Я использую Puppet (версия 2.7.19) с Vagrant для настройки окна разработчика для проекта. У меня есть классы Puppet для всех необходимых мне зависимостей, однако для моего ящика Vagrant мне нужно сначала запустить обновление apt-get. Я заключил эту логику в класс под названием «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 пытается установить apache2 до завершения запуска обновления apt-get.

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, я видел примеры require с классами, а не узлами, например: http://docs.puppetlabs.com/puppet/2.7/reference/lang_classes.html#declaring-a-class-with-require

Неужели я ожидаю от Марионетки не того? Я хочу заявить, что vagrant :: bootstrap должен быть запущен первым, прежде чем что-либо еще; тогда все остальные пакеты будут установлены правильно.

Правильно, 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"],
  }
}