所以我在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(以及一个path)
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]}"; } }
这导致了
错误:无法从远程服务器检索目录:SERVER上的错误400:重复声明:Daemontools :: Envfile [SERVICE_IP]已经在文件daemontools / manifests / build.pp中声明:53; 不能在守护进程/清单/ build.pp:53上重新声明
我怎样才能让它不会得到重复的资源声明?
在创builddaemontools::envfile对象时,应该为对象的$name添加一个唯一的标识符。
daemontools::envfile { $something_unique$env_names: path => $path, value => $envvars }
默认情况下, $name是你的每个$env_names 。 当您使用同一组键创build第二个对象时,会导致多个重复项。 FQDN或者同样独特的东西可能对查找有用。
正确的,你使用$env_names (你也可能想看看下划线的一致使用)作为daemontools::envfile的$name来进行半哈希迭代 – 我假设你不想使用futureparsing器相当合理)。 请注意,您正在尝试使用value => $envvars可能无法正常工作。
所以,从puppetlabs/stdlib prefix是你的朋友重复的问题,确保你得到独特的$name s预构造的path:
define daemontools::build ( $envvars = {}, $path ) { $envnames = keys($envvars) $envfiles = prefix($envnames, "${path}/envdir/") daemontools::envfile { $envfiles: # Stuff } }
但是,这可能只是显示value => $envvars不起作用,似乎只会导致您现在需要 futureparsing器,而each()
看来这工作:)虽然凌乱的内联模板…
$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]}"; } }