Puppet在循环中添加数组元素

5

我希望得到类似这样的东西:

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


你的代码有一些语法错误。你可能需要先解决这些问题。 - Matt Schuchard
谢谢,我删除了分号。然而,问题 - 我认为 - 无论有没有分号都是可以理解的。我认为这是一段抽象的代码,问题在于循环中的 $ssl_domains << "$site.$developer.dev.mydomain.com" 行创建并销毁变量,而不是修改外部变量。 - AzHofi
另外,你真的应该考虑做${site}.${developer}.dev.mydomain.com。此外,该代码将创建一个包含十个元素的$ssl_domains数组。这是你想要的吗?还是你希望该数组只有四个元素? - Matt Schuchard
Matt,感谢你的建议!是的,我指的是十个元素。 - AzHofi
2个回答

14
你的尝试已经接近成功了,但是你使用了错误类型的lambda函数。为了避免在同一个作用域内Puppet变量是不可改变的并且如果在lambda函数中定义,则不能在lambda函数之外使用,你必须使用rvalue lambda函数 https://en.wikipedia.org/wiki/Value_(computer_science)#R-values_and_addresses。我使用rvalue lambda函数maphttps://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拥有你需要的数组。


2
很好的使用了 map()。在 Puppet 中,这种操作过去很难实现。 - John Bollinger
嘿,现在我第一次看到一个.map在一个.map中。这解决了我一类问题,我一直在Puppet文档中没有注意到。注意了,这很好! - Bill McGonigle

0
可能需要在使用Matt的解决方案处理哈希而不是字符串时使用flatten()函数,例如:
$site_developer_base = flatten(
  map(['admin', 'api', 'web']) |$site| {
    $developer_base = map(['tom', 'jeff', 'harry']) |$developer| {
      { hostname => "${site}.${developer}.dev.mydomain.com" }
    }
  }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接