puppet在循环中添加数组元素

时间:2016-12-08 14:13:52

标签: arrays loops puppet

我想要这样的事情:

$ssl_domains = ['dev.mydomain.com']

['admin', 'api', 'web'].each |$site| {
  ['tom', 'jeff', 'harry'].each |$developer| {
    $ssl_domains << "$site.$developer.dev.mydomain.com"
  }
}

letsencrypt::certonly { 'dev-cert':
  domains     => $ssl_domains,
  plugin      => 'apache',
  manage_cron => true,
}

现在因为Puppet的变量范围而不可能。如何通过嵌套循环收集数组中的某些变量?

1 个答案:

答案 0 :(得分:9)

你接近你的尝试,但是你使用了错误的lambda类型。为了避免Puppet变量在同一范围内不可变的两个事实导致的问题,并且如果在lambda中定义,也不能在lambda范围之外使用,则必须使用rvalue lambda https://en.wikipedia.org/wiki/Value_(computer_science)#R-values_and_addresses。我使用rvalue lambda map https://docs.puppet.com/puppet/latest/function.html#map解决了您的问题。

$site_developer_base = ['admin', 'api', 'web'].map |$site| {
  $developer_base = ['tom', 'jeff', 'harry'].map |$developer| {
    "${site}.${developer}.dev.mydomain.com"
  }
}

如果我执行notify { $site_developer_base: }此输出:

Notice: admin.tom.dev.mydomain.com
Notice: admin.jeff.dev.mydomain.com
Notice: admin.harry.dev.mydomain.com
Notice: api.tom.dev.mydomain.com
Notice: api.jeff.dev.mydomain.com
Notice: api.harry.dev.mydomain.com
Notice: web.tom.dev.mydomain.com
Notice: web.jeff.dev.mydomain.com
Notice: web.harry.dev.mydomain.com

证明$site_developer_base具有您想要的数组。