6

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

属性:

# === 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​​ 不是最好的,因为我刚刚开始使用所有这些东西,但我找不到这种情况的任何例子。任何帮助都会很棒,谢谢。

4

2 回答 2

10

你的意思可能是:

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

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

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

于 2014-03-06T20:48:39.397 回答
0

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() 资源将哈希作为参数,因此只需按原样传递哈希即可。

于 2015-12-10T16:42:26.527 回答