Erro de declaração de duplicata do fantoche

3

Estou correndo em um Error: Duplicate declaration com meu projeto de marionetes. Eu quero implantar instâncias do jboss, e parte deles são alguns arquivos de configuração especiais.

Assim que eu criar uma segunda instância, que deve conter os mesmos arquivos de configuração especiais da primeira instância, recebo o erro mencionado.

Eu criei uma instância assim:

jbossas::instance { 'node01':
         ...
         propfiles => [ "kupo.properties", "web.properties" ],
}

em jboss :: instance é esse código:

if ($propfiles != {}) {

            jbossas::makepropies { $propfiles:
                version         => $version,
                instancedir     => $instancedir,
                jboss_name      => $name,
            }
    }

e finalmente o código 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],
    }
}

Assim que eu criar um segundo nó e quiser aplicar o manifesto, o erro que recebo é:

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

Eu comecei com fantoche esta semana, então minha experiência é como 0. Eu procurei muito, achei virtual / percebi coisas, mas não consegui encontrar nada que resolvesse meu problema.

Obrigado antecipadamente!

    
por kaklakariata 01.08.2013 / 11:22

1 resposta

3

Isso porque você está definindo dois recursos jbossas:makepropies com o mesmo nome, independentemente do nome do recurso jbossas::instance de nível superior, portanto, 'node01' e 'node02' estão tentando criar jbossas:makepropies com um título de 'kupo.properties'.

Isso é causado pela falta de capacidade de loop completo do Puppet dentro dos manifestos. Se você declarar uma variável como uma matriz, não há nenhuma maneira (que eu saiba) de percorrer essa matriz dentro de seus manifestos.

Você pode contornar isso diferenciando os nomes dos recursos:

jbossas::instance { 'node01':
     ...
    propfiles => [ "${name)_kupo.properties", "${name}_web.properties" ],
}

Em seguida, tire isso em 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],
  }

}

Não é de forma alguma a solução mais eloqüente, mas sem o suporte de loop completo no Puppet, é o melhor que eu conheço - a solução mais programática seria escrever algo assim em jbossas::instance (estou usando o pseudocódigo abaixo) ):

foreach ($propfiles as $propfile) {
  jbossas::makepropies { $propfile:
    version         => $version,
    instancedir     => $instancedir,
    jboss_name      => $name,
  }
}

Veja esta pergunta do StackOverflow para mais detalhes.

    
por 01.08.2013 / 12:13

Tags