在ERB中迭代灵活范围

时间:2015-06-22 23:20:08

标签: ruby puppet erb

我在版本3.8.1上有一个Puppet ERB模板,它会抛出错误并拒绝工作。

这是我的原始代码:

<%= (1..5).select{ |i| "elastic%d" %[i] != @hostname }.map{|x, i| "elastic%d" %[x]} %>

这将创建一个主机名数组,不包括当前主机的主机名。

我正在尝试参数化我的模板,以便根据我在群集中拥有的服务器数量,可以很好地扩展内容:

<%= (1..@(scope.lookupvar('mymodule::elastic_instances'))).select{ |i| "elastic%d" %[i] != @hostname }.map{|x, i| "elastic%d" %[x]} %>

这会引发以下异常:

Error: Could not run: /home/tk/puppet/modules/mymodule/templates/elasticsearch/elasticsearch-template.conf.erb:329: `@(' is not allowed as an instance variable name
/home/tk/puppet/modules/mymodule/templates/elasticsearch/elasticsearch-template.conf.erb:329: syntax error, unexpected end-of-input
; _erbout.concat(( (1..@(scope.lookupvar('mymodule...

我还尝试了以下替代方案:

<%= (1..@(scope.lookupvar('mymodule::elastic_instances'))).select{ |i| "elastic%d" %[i] != @hostname }.map{|x, i| "elastic%d" %[x]} %>
<%= (1..(scope.lookupvar('mymodule::elastic_instances'))).select{ |i| "elastic%d" %[i] != @hostname }.map{|x, i| "elastic%d" %[x]} %>
<%= (1..scope.lookupvar('mymodule::elastic_instances')).select{ |i| "elastic%d" %[i] != @hostname }.map{|x, i| "elastic%d" %[x]} %>

我是否可以使用手动方法来代替Ruby的语法糖?

2 个答案:

答案 0 :(得分:2)

事实证明,Puppet返回的变量是一个字符串而不是一个int,尽管我在Puppet中将它声明为一个int。

有了演员和一些手工的东西,我得到了它的工作:

<%= (Range.new(1, Integer(scope.lookupvar('mymodule::elastic_instances'))) ... %>

这让事情按预期发挥作用。

答案 1 :(得分:0)

如果您使用的是PuppetDB,可能需要查看puppetdb-query module

使用它,您可以从数据库中检索主机名列表,以便模板可以像

一样迭代它们
<% @elastic_search_hostnames.each do -%>
...
<% end -%>