Марионетка «требует» работает не так, как ожидалось

#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 «марионетка требует не работает»