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

Ошибка дублирования объявления Puppet

я бегу в 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 Больше подробностей.