1

次の 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 を使用して、パペットに送信する前にファイルが正しいことを確認しようとしています。

私は何を間違っていますか?

ps: これは puppet で使用される erb テンプレートです: http://docs.puppetlabs.com/guides/templating.html

4

1 に答える 1

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
  } ]
}
于 2013-08-12T15:54:12.573 に答える