重复声明:Exec 已经在定义的types中声明

请帮我解决一个我正面临的问题,我试图用puppet脚本安装adobe CQ5(作者/发布模式)。 我已经定义了instance.pp作为定义的types和传递(作者,发布)清单文件中的参数。 但是我得到下面提到的错误

"Duplicate declaration: Exec[] is already declared in file /tmp/vagrant-puppet/modules-0/cq/manifests/instance.pp:55; cannot redeclare at /tmp/vagrant-puppet/modules-0/cq/manifests/instance.pp:62 on node localhost.123.176.37.38" 

这是我的傀儡脚本example.pp

 define cq::instance ( $installation_type, $servername = $name, $sling_run_modes = "author,dev", $data_dir = "/home/vagrant/$name", $install_path = "/home/vagrant/{$name}/cq5", $min_heap = '256', $max_heap = '1024', $perm_gen = '300', $cq_jar = "cq-author-4502.jar", $port_author = "4502", $port_publish = "4503",) { $cq_port = $installation_type ? { "author" => $port_author, "publish" => $port_publish, default => "4502", } if $installation_type in [ author, publish ] { $type_real = $installation_type } else { fail('installation_type parameter must be author or publish') } file { "/tmp/$servername .${cq_jar}" : ensure => "present", source => "puppet:///modules/cq/${cq_jar}", owner => vagrant, mode => 755 } file { [ "$data_dir", "$install_path", "$install_path/$type_real" ]: ensure => "directory", mode => 0755, before => Exec ["$name_move_jar"], } exec {"$name_move_jar": require => File["/tmp/${cq_jar}"], cwd => "/tmp", command => "cp ${cq_jar} $install_path/$type_real", creates => "$install_path/$type_real/$cq_jar" } exec {"$name_unpack_CQ_jar": command => "java -jar $cq_jar -unpack", cwd => "$install_path/$type_real", creates => "$install_path/$type_real/crx-quickstart", require => Exec["$name_move_jar"], } file {"$install_path/$type_real/crx-quickstart/bin": ensure => directory, require => Exec["$name_unpack_CQ_jar"], } file {"$name_start_script": path => "$install_path/$type_real/crx-quickstart/bin/start", content => template('cq/cq_5_6_start.erb'), mode => 0777, require => File["$install_path/$type_real/crx-quickstart/bin"], before => File["initd_script_$type_real"], } file {"$name_initd_script_$type_real": path => "/etc/init.d/cq-$type_real", content => template('cq/cq_init_d_5_6.erb'), mode => 0777, } service {"cq-$type_real": ensure => running, enable=>true, hasrestart => true, hasstatus => true, require => File["initd_script_$type_real"], } } 

和清单文件site.pp是

 cq::instance {myauthor: installation_type => author, } cq::instance {mypublish: installation_type => publish, } 

哦,那很难读!
你真的应该这样做,用puppet-lint

关键问题是:

 Duplicate declaration: Exec[] is already declared in file 

注意那说Exec[]
它应该包含exec的名字,但是不包含。

 exec {"$name_move_jar": 

这将名称设置为variables$name_move_jar
那不是你想要的。
你想${name}_move_jar
你真的应该使用${name}样式variables。

使用大括号可以很清楚地知道哪个部分仍然是variables名称的一部分,哪些不是。
在function上没有区别,它只是告诉parsing器更具体的variables名称。
以此为例:

 notify { "$foo-bar": } 

很难说这里的variables是什么。 是$foo-bar吗? 或者只是$foo
那个例子就是$foo (破折号在variables名中是不允许的)。
为避免混淆,最好编写${foo}-bar
大家都知道${foo}是variables。

如果您需要将variables连接到string,如:

 notify { "${var1}${var2}": } 

您必须使用该格式。