Пожалуйста, помогите мне с решением проблемы, с которой я столкнулся. Я пытаюсь установить 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}": }
Вы должны использовать этот формат.