所以我在 app1 的 puppet 清单中有这个哈希
$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 的 puppet 清单中
$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/manifests/build.pp:53 中声明;无法在 daemontools/manifests/build.pp:53 中重新声明
我怎样才能做到不获得重复的资源声明?
答案1
在创建对象时,您应该为对象daemontools::envfile
添加唯一标识符。$name
daemontools::envfile { $something_unique$env_names:
path => $path,
value => $envvars
}
默认情况下,$name
是您的每个$env_names
。当您使用同一组键创建第二个对象时,会导致许多重复。FQDN 或同样独特的内容可能对查找有用。
答案2
是的,您正在使用$env_names
(您可能还想看看那里下划线的一致使用)作为半黑客迭代的$name
for daemontools::envfile
- 我假设您不想使用解析器future
(相当合理)。请注意,您尝试做的事情value => $envvars
可能也不会奏效。
因此,prefix
frompuppetlabs/stdlib
是您解决重复问题的朋友,$name
通过预先构建路径确保您获得唯一的 s:
define daemontools::build (
$envvars = {},
$path
) {
$envnames = keys($envvars)
$envfiles = prefix($envnames, "${path}/envdir/")
daemontools::envfile {
$envfiles:
# Stuff
}
}
然而,这可能只会表明这是value => $envvars
行不通的,而且似乎只能得出这样的结论:需要future
现在的解析器,以及each()
答案3
看起来这有效:)虽然内联模板很混乱......
$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]}";
}
}