【问题标题】:Iterating over an array of hashes in a Chef ERB template迭代 Chef ERB 模板中的哈希数组
【发布时间】:2012-12-04 22:20:11
【问题描述】:

我正在尝试为具有以下属性的厨师制作食谱:

default['web-server']['hosts'] = [ { host: "some-ip", server: "some-server", port: "9000" } ]

我们的想法是对其进行迭代以创建配置文件(在本例中为 lighttpd),如下所示:

<% if node['web-server']['hosts'].length > 0 -%>
<%   node['web-server']['hosts'].each do |host| -%>

  $HTTP["host"] =~ "<%= host.host %>" {
    proxy.balance = "round-robin" proxy.server = (
      "" => (
          "play" => (
             "host" => "<%= host.server %>",
             "port" => <%= host.port %>
           )
         )
     )
  }
<%   end -%>
<% else -%>
<% end -%>

但是,在测试节点上运行 chef-client 时,我收到了以下信息:

FATAL: Chef::Mixin::Template::TemplateError: undefined method `host' for #<Mash:0x00000002b9a878>

在散列数组上循环的正确方法是什么?

【问题讨论】:

  • 您可能不需要检查array.length &gt; 0 是否是因为array.each 的方法会自动循环遍历所有内容。如果数组中没有任何内容,array.each 方法将立即结束。

标签: ruby chef-infra


【解决方案1】:

好的,我想通了。正确的语法是通过hash[:key]访问哈希键,即

$HTTP["host"] =~ "<%= host[:host] %>" {
    proxy.balance = "round-robin" proxy.server = (
         "" => (
             "play" => (
               "host" => "<%= host[:server] %>",
               "port" => <%= host[:port] %>
             )
         )
       )
  }
  <%   end -%>
  <% else -%>
  <% end -%>

【讨论】:

    猜你喜欢
    • 2012-01-02
    • 2014-12-15
    • 1970-01-01
    • 1970-01-01
    • 2012-02-15
    • 2015-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多