我有以下my_script.ruby
require 'erb'
require 'ostruct'
namespace = OpenStruct.new(:jmx_port => 9200, :markets=> ['CH', 'FR'])
template = File.open("my.json.erb", "rb").read;
puts ERB.new(template).result(namespace.instance_eval { binding })
和my.json.erb:
{
"servers" : [ {
"port" : "<%= jmx_port %>",
"host" : "localhost",
"queries" : [
<% @markets.each do |market| -%>
{
"outputWriters" : [ {
"@class" : "com.googlecode.jmxtrans.model.output.StdOutWriter",
} ],
"obj" : "solr/market_<%= market %>:type=queryResultCache,id=org.apache.solr.search.LRUCache",
"attr" : [ "hits","hitratio"]
},
<% end -%>
],
"numQueryThreads" : 2
} ]
}
但是irb my_script.ruby
执行脚本我收到此错误:
?> puts ERB.new(template).result(namespace.instance_eval { binding })
SyntaxError: compile error
(erb):10: syntax error, unexpected ';'
; @markets.each do |market| -; _erbout.concat "\n "
^
对于上下文,my.json.erb文件是一个木偶文件, 并使用my_script.ruby我试图验证文件是否正确,然后再发送给puppet。
我做错了什么?
ps:这是木偶使用的erb模板: http://docs.puppetlabs.com/guides/templating.html
答案 0 :(得分:2)
你的erb有几个问题:
<% %>
代替<% -%>
。OpenStruct
,因此应使用markets
代替@markets
以下是my.json.erb
文件的最终版本:
{
"servers" : [ {
"port" : "<%= jmx_port %>",
"host" : "localhost",
"queries" : [
<% markets.each do |market| %>
{
"outputWriters" : [ {
"@class" : "com.googlecode.jmxtrans.model.output.StdOutWriter",
} ],
"obj" : "solr/market_<%= market %>:type=queryResultCache,id=org.apache.solr.search.LRUCache",
"attr" : [ "hits","hitratio"]
},
<% end %>
],
"numQueryThreads" : 2
} ]
}