У меня есть этот хэш в манифесте марионетки app1
$applicaton = 'app1'
daemontools::build {
$application:
path => "/opt/supervise/${application}"
envvars => {
'ENVIRONMENT' => $location,
'SERVICE_USER' => $application_user,
'SERVICE_PORT' => $gunicorn_port,
'SERVICE_IP' => $gunicorn_ip,
'ADDITIONAL_PARAMS' => "--workers $processorcount",
'DJANGO_SETTINGS_MODULE' => "${application}.settings",
}
}
и этот хеш в моем марионеточном манифесте app2
$applicaton = 'app2'
daemontools::build {
$application:
path => "/opt/supervise/${application}"
envvars => {
'ENVIRONMENT' => $location,
'SERVICE_USER' => $application_user,
'SERVICE_PORT' => $gunicorn_port,
'SERVICE_IP' => $gunicorn_ip,
'ADDITIONAL_PARAMS' => "--workers $processorcount",
'DJANGO_SETTINGS_MODULE' => "${application}.settings",
}
}
которые оба передаются в daemontools :: build (вместе с путем)
define daemontools::build (
$envvars = {},
$path
){
$env_names = keys($envvars)
daemontools::envfile { $env_names:
path => $path,
value => $envvars
}
}
define daemontools::envfile($path, $value) {
file { "/${path}/envdir/${name}" :
mode => 0644,
content => "${value[$name]}";
}
}
что приводит к
Ошибка: не удалось получить каталог с удаленного сервера: ошибка 400 на СЕРВЕРЕ: повторяющееся объявление: Daemontools :: Envfile [SERVICE_IP] уже объявлен в файле daemontools / manifest / build.pp: 53; невозможно повторно объявить в daemontools / manifest / build.pp: 53
Как сделать так, чтобы объявления ресурсов не повторялись?
Правильно, вы используете $env_names
(вы также можете посмотреть на последовательное использование подчеркивания там) в качестве $name
для daemontools::envfile
для полу-хакерской итерации - я полагаю, вы не хотите использовать future
парсер (вполне разумно). Обратите внимание, что также то, что вы пытаетесь сделать с value => $envvars
наверное, тоже не сработает.
Так, prefix
из puppetlabs/stdlib
ваш друг по проблеме дублирования, гарантирующий, что вы получите уникальный $name
s, предварительно построив путь:
define daemontools::build (
$envvars = {},
$path
) {
$envnames = keys($envvars)
$envfiles = prefix($envnames, "${path}/envdir/")
daemontools::envfile {
$envfiles:
# Stuff
}
}
Однако это, вероятно, просто покажет, что value => $envvars
не работает и, кажется, приводит только к выводу, что вы необходимость то future
парсер на данный момент и each()
В создании вашего daemontools::envfile
объект, вы должны добавить уникальный идентификатор в $name
объекта.
daemontools::envfile { $something_unique$env_names:
path => $path,
value => $envvars
}
По умолчанию, $name
каждый из ваших $env_names
. Когда вы создаете второй объект с тем же набором ключей, он вызывает множество дубликатов. Полное доменное имя или что-то столь же уникальное может быть полезно для поиска.
Кажется, это сработало :) Хотя этот встроенный шаблон запутался ...
$env_names = keys($envvars)
$prefixedenvnames = prefix($env_names, "${path}/envdir/")
daemontools::envfile { $prefixedenvnames:
value => $envvars
}
}
define daemontools::envfile($value) {
$tmp = inline_template('<%= name.split("/").last %>')
file { $name :
mode => 0644,
content => "${value[$tmp]}";
}
}