【问题标题】:Chef Ruby loop over attributes in an .erb template fileChef Ruby 循环遍历 .erb 模板文件中的属性
【发布时间】:2014-04-09 17:26:52
【问题描述】:

所以这可能有点令人困惑,但请耐心等待。简而言之,我想遍历具有某个键值的所有属性,然后如果值不为空,则将它们插入到模板中。这是我的代码:

属性:

# === Default file Configurations
#
default['elasticsearch']['default']['ES_USER']              = ''
default['elasticsearch']['default']['ES_GROUP']             = ''
default['elasticsearch']['default']['ES_HEAP_SIZE']         = ''
default['elasticsearch']['default']['MAX_OPEN_FILES']       = ''
default['elasticsearch']['default']['MAX_LOCKED_MEMORY']    = 'unlimited'
default['elasticsearch']['default']['MAX_MAP_COUNT']        = ''
default['elasticsearch']['default']['LOG_DIR']              = '/var/log/elasticsearch'
default['elasticsearch']['default']['DATA_DIR']             = '/var/lib/elasticsearch'
default['elasticsearch']['default']['WORK_DIR']             = '/tmp/elasticsearch'
default['elasticsearch']['default']['CONF_DIR']             = '/etc/elasticsearch'
default['elasticsearch']['default']['CONF_FILE']            = '/etc/elasticsearch/elasticsearch.yml'
default['elasticsearch']['default']['RESTART_ON_UPGRADE']   = ''

模板:

<% node['elasticsearch']['default'].each do |host| -%>
    <% if node.elasticsearch.default.host not nil -%>
        <%= host %>=<%= node.elasticsearch.default.host %>
<% end %>

输出(希望如此):

MAX_LOCKED_MEMORY=unlimited
LOG_DIR=/var/log/elasticsearch
DATA_DIR=/var/lib/elasticsearch
WORK_DIR=/tmp/elasticsearch
CONF_DIR=/etc/elasticsearch
CONF_FILE=/etc/elasticsearch/elasticsearch.yml

我的 ruby​​ 不是最好的,因为我刚刚开始使用所有这些东西,但我找不到任何此类情况的示例。任何帮助都会很棒,谢谢。

【问题讨论】:

    标签: ruby elasticsearch chef-infra cookbook chef-template


    【解决方案1】:

    你的意思可能是:

    <% node['elasticsearch']['default'].each do |key, value| -%>
        <% unless value.empty? -%>
            <%= key %>=<%= value %>
        <% end %>
    <% end %>
    

    当迭代 Hash 时,你会检查它的键值对。所以对于第一次迭代,key 将是'ES_USER'value 将是''(不是nil...)。

    接下来检查该值是否不是blank?,并打印出key=value 行。

    【讨论】:

    • 谢谢...除了&lt;%= key %&gt;=&lt;%= value %&gt; 之后缺少&lt;% end %&gt; 之外,您的答案是正确的。
    • 哦,它实际上是unless value.empty?,因为由于某种原因它在函数中不接受blank
    • 当我使用这个循环时,厨师运行输出整个 json 而不是值和键本身的字符串。你能建议我如何强制它放置字符串吗?
    • @BenjaminGoodacre - 您使用的确切代码是什么?输入是什么?
    【解决方案2】:

    elasticsearch 食谱最近被重写为使用 LWRP/HWRP/自定义资源。您的实施将需要调整以使用新的说明书。

    回答您的问题;节点属性只是一个哈希node['elasticsearch']['default'],你可以像这样将整个东西传递到资源中

    elasticsearch_configure 'whatever' do
      configuration ( node['elasticsearch']['default'] )
      action :manage
      notifies :restart, 'elasticsearch_service[elasticsearch]'
    end
    

    可能有助于澄清一些事情,以了解以下是表示哈希的所有不同方式。

    在食谱中

    default['elasticsearch']['default']['LOG_DIR']  = '/var/log/elasticsearch'
    default['elasticsearch']['default']['DATA_DIR'] = '/var/lib/elasticsearch'
    ...
    

    配方中的替代语法

    default[:elasticsearch][:default][:LOG_DIR]  = '/var/log/elasticsearch'
    default[:elasticsearch][:default][:DATA_DIR] = '/var/lib/elasticsearch'
    

    配方中的另一种替代语法

    default.elasticsearch.default.LOG_DIR  = '/var/log/elasticsearch'
    default.elasticsearch.default.DATA_DIR = '/var/lib/elasticsearch'
    

    角色内部

    {
      "chef_type": "role",
      "default_attributes": {
        "elasticsearch": {
          "default": {
            "LOG_DIR": "/var/log/elasticsearch",
            "DATA_DIR": "/var/lib/elasticsearch"
          }
        }
      }
    }
    

    由于一切都是哈希,并且 config() 资源将哈希作为参数,因此只需按原样传递哈希即可。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-14
      相关资源
      最近更新 更多