我在版本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的语法糖?
答案 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 -%>