7

我有以下木偶示例模板:

{
  "servers" : [ {
    "port" : 9200,
    "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
  } ],
}

将其与 market=['UK','FR','IT'] 一起应用,我得到以下信息:

{
  "servers" : [ {
    "port" : 9200,
    "host" : "localhost",

    "queries" : [
            {
      "outputWriters" : [ { "@class" : "com.googlecode.jmxtrans.model.output.StdOutWriter" } ],
      "obj" : "solr/market_UK:type=queryResultCache,id=org.apache.solr.search.LRUCache",
      "attr" : [ "hits","hitratio" ]
    },
          {
      "outputWriters" : [ { "@class" : "com.googlecode.jmxtrans.model.output.StdOutWriter" } ],
      "obj" : "solr/market_FR:type=queryResultCache,id=org.apache.solr.search.LRUCache",
      "attr" : [ "hits","hitratio" ]
    },
          {
      "outputWriters" : [ { "@class" : "com.googlecode.jmxtrans.model.output.StdOutWriter" } ],
      "obj" : "solr/market_IT:type=queryResultCache,id=org.apache.solr.search.LRUCache",
      "attr" : [ "hits","hitratio" ]
    },
        ],
    "numQueryThreads" : 2
  } ],
}

问题是最后一个逗号,这使它成为无效的 solr 配置。

我可以使用market.map 和join(','),而不是应用markets.each。但是在这种情况下如何使用地图?

我可以按如下方式使用地图:

<%= @markets.map{ |market| "hello_"+market }.join(',') -%>

这将打印hello_UK,hello_FR,hello_IT(请注意,我们在 hello_IT 之后没有逗号),但我需要这样的东西:

{
  "servers" : [ {
    "port" : 9200,
    "host" : "localhost",

    "queries" : [
      <% @markets.map |market| -%>
      {
      "outputWriters" : [ { "@class" : "com.googlecode.jmxtrans.model.output.StdOutWriter" } ],
      "obj" : "solr/market_<%= market %>:type=queryResultCache,id=org.apache.solr.search.LRUCache",
      "attr" : [ "hits","hitratio" ]
    },
    <% }.join(',') -%>
    ],
    "numQueryThreads" : 2
  } ],
}

这不起作用。

那么,如何让它工作呢?或者如何修改我的人偶模板以删除最后一个逗号?

4

4 回答 4

21

这实际上是一个 Ruby 问题而不是 Puppet 问题。由于这是一个数组,只需将 更改.each.each_with_index。然后您可以将最后的逗号包裹在检查中,以查看当前索引值是否比索引的大小小一。例如,以下代码仅在当前market不是数组中的最后一个时才添加逗号:

<% @markets.each_with_index do |market, i| -%>

进而

}<%= ',' if i < (@markets.size - 1) %>
于 2013-08-16T10:23:40.933 回答
3

我在 puppet 实验室网站 ( https://ask.puppetlabs.com/question/4195/joining-array-from-hieraconcat-other-value-in-erb/ )上看到了这种形式的解决方案。

<%= quorum.map{ |srv| "#{srv}:#{portNum}" }.join(',') %>

此代码允许您获取一个数组并创建每个元素的变体,然后使用适当的连接文本将它们全部连接在一起(不包括末尾的虚假逗号)。

于 2014-10-23T20:49:48.363 回答
0

对于 Puppet 4.10.12 Ben 的回答对我不起作用,但以下类似的语法可以。

server=<%= $servers.map |$server| { "${server['hostname']}:${server['port']}" }.join(',') %>
于 2019-03-20T17:03:12.410 回答
0

如果你倒着做,这会更容易。除了最后一个部分之外的所有部分都使用逗号作为后缀,您可以使用逗号作为除第一部分之外的所有部分的前缀。使用在第一部分之后更改状态的变量来实现这一点要容易一些:

<%- comma = ""; @markets.map |market| -%><%= comma -%>

...

<%- comma = "," -%>
<%- } -%>
于 2020-07-24T12:58:07.327 回答