Puppet 重复声明错误

Puppet 重复声明错误

我正在运行Error: Duplicate declaration我的 puppet 项目。我想部署 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

我本周才开始使用 puppet,所以我的经验为 0。我搜索了很多,找到了虚拟/实现的东西,但找不到任何可以解决我的问题的东西。

提前致谢!

答案1

这是因为您定义了两个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 问题更多细节。

相关内容