人偶在循环中添加数组元素

puppet adding array elements in a loop

我想要这样的东西:

$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 的变量作用域。如何通过嵌套循环收集数组中的一些变量?

您的尝试接近成功,但您使用了错误类型的 lambda。为了避免 Puppet 变量在同一范围内不可变并且如果在 lambda 中定义也不能在 lambda 范围之外使用这两个事实导致的问题,您必须使用右值 lambda https://en.wikipedia.org/wiki/Value_(computer_science)#R-values_and_addresses. I solved your problem using the 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 有你想要的数组。