Я использую 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"],
}
}