如何测试将木偶模板应用于给定测试参数的结果

Dav*_*lla 4 ruby erb puppet

我有以下puppet模板文件solr.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
  } ]
}
Run Code Online (Sandbox Code Playgroud)

我想在puppet中执行此测试之前测试将模板应用于某些测试参数的结果.

我怎样才能做到这一点?

之前,我试过像这样的脚本,my_script.ruby

require 'erb'
require 'ostruct'
namespace = OpenStruct.new(:jmx_port => 9200, :markets=> ['CH', 'FR'])
template = File.open("solr.json.erb", "rb").read;
puts ERB.new(template).result(namespace.instance_eval { binding })
Run Code Online (Sandbox Code Playgroud)

但它没有成功,因为OpenStruct没有instance variables,所以我无法使用@markets.

文档提到您可以使用以下命令检查语法:http: //docs.puppetlabs.com/guides/templating.html

erb -P -x -T '-' mytemplate.erb | ruby -c
Run Code Online (Sandbox Code Playgroud)

但这不是我要问的.我要求获得将一些测试参数(jmx_port = 9200,markets = ['CH','FR'])应用于模板的结果.

我怎样才能做到这一点?

小智 6

我不认为你需要openstruct的东西.这对我有用:

require 'erb'
#Test Variables
jmx_port = 9200
@markets = ['CH', 'FR']

temp = File.open("testerb.erb", "rb").read;
renderer = ERB.new(temp)
puts output = renderer.result()
Run Code Online (Sandbox Code Playgroud)

虽然我确实需要改变你的模板一小部分:

我已经去除了--%>你在你的模板了.这些阻止它编译,因为它们应该与它们配对<%=

{
  "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
  } ]
}
Run Code Online (Sandbox Code Playgroud)


小智 5

如果打开ERB的修整模式,则不必从模板中删除“-%>”:

renderer = ERB.new(temp, nil, '-')
Run Code Online (Sandbox Code Playgroud)