#java #maven #puppet
#java #maven #марионетка
Вопрос:
У меня есть следующие два манифеста:
class profile::maven inherits profile::base {
# Hiera
$version = hiera('profile::maven::version', '3.2.1')
$settings = hiera_hash('profile::maven::settings', undef)
$environments = hiera_hash('profile::maven::environments', undef)
# Dependencies
require '::profile::java'
# Modules
class { '::maven::maven':
version => $version,
}
if ($settings) {
create_resources('::maven::settings', $settings)
}
if ($environments) {
create_resources('::maven::environments', $environments)
}
}
и
class profile::java inherits profile::base {
# Hiera
$distribution = hiera('profile::java::distribution', 'jdk')
$version = hiera('profile::java::version', 'present')
# Modules
class { '::java':
distribution => $distribution,
version => $version,
}
# Parameters
$java_home = $::java::java_home
file { 'profile-script:java.sh':
ensure => present,
path => '/etc/profile.d/java.sh',
content => template('profile/java.sh.erb'),
}
}
Я хочу, чтобы это profile::java
было полностью завершено до profile::maven
выполнения.
site.pp
Выглядит следующим образом и не должен быть изменен, чтобы позже соответствовать подходу с профилем роли puppet (работа продолжается):
node 'gamma.localdomain' {
include 'profile::java'
include 'profile::maven'
}
После компиляции скрипты начинаются с загрузки архива maven. Почему
require '::profile::java'
не обеспечить порядок выполнения? Есть ли у кого-нибудь идея, как добиться желаемого поведения?
Ответ №1:
Я считаю, что проблема здесь в том, что require profile::java
область profile::maven
действия ограничена классом, поэтому все ресурсы, объявленные в последнем классе, зависят от profile::java
. Однако это не будет распространяться на классы, которые profile::maven
объявляют, например maven::maven
.
Для достижения этого вы можете установить зависимость между этими классами
include profile::java
include maven::maven
Class[profile::java] -> Class[maven::maven]
Это может привести к существенной сложности в графе зависимостей, поэтому будьте осторожны с этим. Этого можно избежать, используя шаблон привязки.
Обратите внимание, что использование функции require не рекомендуется из-за возможных проблем с циклом зависимостей.
Ответ №2:
Начиная как минимум с Puppet 3.5, вы можете использовать «contain«, чтобы убедиться, что все внутри profile:: java завершается до profile:: maven. Потребуется следующее дополнение к profile::java:
class profile::java inherits profile::base {
...
contain '::maven::maven'
...
}
Отвечая на этот старый, отвеченный вопрос, который появляется первым при поиске в Google «марионетка требует не работает»