2014-03-06 8 views
5

Also könnte dies ein wenig verwirrend sein, aber ertragen Sie mit mir. Kurz gesagt möchte ich alle Attribute mit einem bestimmten Schlüsselwert durchlaufen und sie dann in eine Vorlage einfügen, wenn die Werte nicht leer sind. Hier ist mein Code:Chef Ruby Schleife über Attribute in einer Vorlage .ERB-Vorlage

Attributes:

# === 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'] = '' 

TEMPLATE:

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

OUTPUT (hoffentlich):

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 

Mein Rubin ist nicht die beste, weil ich bin Ich fing einfach mit all dem Zeug an, aber ich konnte keine Beispiele für diese Art von Situation finden. Jede Hilfe wäre großartig, danke.

Antwort

8

Was Sie wohl gemeint war:

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

Wenn über einen Hash laufen, Sie gehen über seine Schlüssel-Wert-Paaren. Also für die erste Iteration wird key'ES_USER', und value wird '' (was nicht nil ist ...).

Als nächstes prüfen Sie, ob der Wert blank? ist, und drucken Sie die key=value Zeile aus.

+0

Danke ... Ihre Antwort war genau richtig, außer für eine fehlende '<% end %>' nach '<%= key %> = <%= value %>'. – jarsever

+0

Oh, und es ist eigentlich 'außer value.empty?', Weil aus irgendeinem Grund es 'blank' in der Funktion nicht akzeptierte. – jarsever

+0

Wenn ich diese Schleife benutze, gibt der chef run den gesamten JSON aus und nicht die Zeichenfolge des Werts und die Taste selbst. Können Sie mir vorschlagen, wie ich es zwingen kann, die Saite einzuspinnen? –

0

Das Elasticsearch Kochbuch wurde vor kurzem neu geschrieben LWRP/HWRP/Custom-Ressourcen zu verwenden. Ihre Implementierung muss angepasst werden, um mit dem neuen Kochbuch zu arbeiten.

Um Ihre Frage zu beantworten; Knotenattribute sind nur ein Hash node['elasticsearch']['default'], können Sie die ganze Sache in die Ressource wie passieren so

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

helfen könnten Dinge zu klären, um zu sehen, dass die folgenden Kreditkarten werden verschiedene Möglichkeiten, einen Hash zu repräsentieren.

In einem Rezept

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

Alternative Syntax innerhalb Rezept

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

Und eine andere alternative Syntax innerhalb Rezept

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

Innerhalb einer Rolle

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

Da alles ein Hash ist und die Ressource config() einen Hash als Parameter verwendet, übergeben Sie den Hash einfach so, wie er ist.