木偶散列创build文件

所以我在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]}"; } }