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

Повторяющееся объявление: Exec [] уже объявлен в определенном типе

Пожалуйста, помогите мне с решением проблемы, с которой я столкнулся. Я пытаюсь установить Adobe CQ5 (режимы автора / публикации) с помощью сценария марионетки. Я определил instance.pp как определенный тип и передав параметры (автор, публикация) в файле манифеста. Но я получаю указанную ниже ошибку

"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"

Вот мой марионеточный скрипт для instance.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":

Это устанавливает имя переменной $name_move_jar.
Это не то, что вам нужно.
Вы хотите ${name}_move_jar.
Вам действительно стоит использовать ${name} переменные стиля.

Использование фигурных скобок дает понять, какая часть по-прежнему является частью имени переменной, а какая нет.
Функционально разницы нет, он просто сообщает парсеру более конкретное имя переменной.
Возьмем, к примеру:

notify { "$foo-bar": }

Трудно сказать, что это за переменная. Это $foo-bar? Или просто $foo?
Этот пример был бы $foo (тире не допускаются в именах переменных).
Во избежание путаницы лучше написать ${foo}-bar вместо.
Все это знают ${foo} это переменная.

Если вам нужно объединить переменные в строку, например:

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

Вы должны использовать этот формат.