я бегу в Error: Duplicate declaration
с моим марионеточным проектом. Я хочу развернуть экземпляры jboss, и часть из них - это специальные файлы конфигурации.
Как только я создаю второй экземпляр, который должен содержать те же специальные файлы конфигурации, что и первый экземпляр, я получаю указанную ошибку.
Я создаю такой экземпляр:
jbossas::instance { 'node01':
...
propfiles => [ "kupo.properties", "web.properties" ],
}
в jboss :: instance это код:
if ($propfiles != {}) {
jbossas::makepropies { $propfiles:
version => $version,
instancedir => $instancedir,
jboss_name => $name,
}
}
и, наконец, код makepropies:
define jbossas::makepropies (
$file = $title,
$version = 7,
$instancedir = '',
$jboss_name = "jboss",
){
file { "$instancedir_$jboss_name_$file" :
ensure => file,
path => $instancedir/configuration/$file,
content => template("jbossas/jboss${version}/${file}.erb"),
require => Jbossas::Profile[$jboss_name],
}
}
Как только я создаю второй узел и хочу применить манифест, я получаю следующую ошибку:
Error: Duplicate declaration: Jbossas::Makepropies[kupo.properties] is already declared in file /etc/puppet/modules/jbossas/manifests/instance.pp:111; cannot redeclare at /etc/puppet/modules/jbossas/manifests/instance.pp:111 on node jb7-dev.localdomain
Я только начал с марионетки на этой неделе, так что мой опыт равен нулю. Я много искал, находил виртуальные / реализуемые вещи, но не смог найти ничего, что решило бы мою проблему.
Заранее спасибо!
Это потому, что вы определяете два jbossas:makepropies
ресурсы с одинаковым именем, независимо от имени верхнего уровня jbossas::instance
ресурс, поэтому оба 'node01' и 'node02' пытаются создать jbossas:makepropies
с названием «kupo.properties».
Это вызвано отсутствием у Puppet возможности полного цикла внутри манифестов. Если вы объявляете переменную как массив, я не могу (насколько я знаю) перебирать этот массив в ваших манифестах.
Вы можете обойти это, различая имена ресурсов:
jbossas::instance { 'node01':
...
propfiles => [ "${name)_kupo.properties", "${name}_web.properties" ],
}
Затем удалите это jbossass:makepropies
define jbossas:makepropies (
$version = 7,
$instancedir = '',
$jboss_name = "jboss",
) {
$title_array = split($title,'_')
$file_name = $title_array[1]
file { "${instancedir}_${jboss_name}_${file_name}" :
ensure => file,
path => "${instancedir}/configuration/${file_name}",
content => template("jbossas/jboss${version}/${file}.erb"),
require => Jbossas::Profile[$jboss_name],
}
}
Это ни в коем случае не самое красноречивое решение, но без полной поддержки цикла в Puppet это лучшее, что я знаю - наиболее программным решением было бы написать что-то подобное в jbossas::instance
(Ниже я использую псевдокод):
foreach ($propfiles as $propfile) {
jbossas::makepropies { $propfile:
version => $version,
instancedir => $instancedir,
jboss_name => $name,
}
}
Видеть этот вопрос StackOverflow Больше подробностей.