2017-06-19 3 views
1

Ich habe JSON-Datei, die als Umgebungsdatei importieren, um Koch,Chef Vorlage Schleife Rubin

{ 
    "mongodb": { 
     "replicaset": { 
     "nodes": [ 
      "test-mongo1:27017", 
      "test-mongo2:27017" 
     ] 
     } 
    } 
} 

I Koch Kochbuch-Vorlage wie unten hinzugefügt, um die Mongo Verbindungszeichenfolge zu bauen,

"mongo": { 
    "url" : "mongodb://<% node['mongodb']['replicaset']['nodes'].each do |replica| -%>admin:[email protected]<%= replica %>/user_db1", 
<% end %> 

Aber Ausgabe wie unten und nicht als JSON Validierung

"mongo": { 
"url" : "mongodb://admin:[email protected]:27017/user_db1", 
admin:[email protected]:27017/user_db1", 

Erwartetes Ergebnis:

"mongo": { 
"url" : "mongodb://admin:[email protected]:27017/user_db1,admin:[email protected]:27017/user_db1", 

Gefolgt How to Run for each loop in template chef, Aber mein Rubin ist nicht der beste, weil ich gerade mit all diesen Sachen anfange. Jede Hilfe wäre großartig, danke.

+0

Verwenden Sie 'map' nicht' each'. –

Antwort

3

Zunächst können wir versuchen, die Schleife zu fixieren, so dass nur die notwendigen Teile im inneren Block enthalten sind:

"mongo": { 
    "url" : "mongodb://<% node['mongodb']['replicaset']['nodes'].each do |replica| -%>admin:[email protected]<%= replica %>/user_db1,<% end %>", 

Dies ist jedoch nach wie vor in einem Problem ergibt sich: Es gibt ein Komma, da wir immer fügen Sie es nach jeder Iteration hinzu.

Ein besserer Ansatz wäre also, zuerst eine Liste von URLs zu erstellen und sie dann mit einem Komma zu einer einzigen Zeichenfolge zu verbinden. Auf diese Weise wird nur ein Komma zwischen Elementen hinzugefügt. Dies sollte stattdessen arbeiten:

"mongo": { 
    "url" : "mongodb://<%= node['mongodb']['replicaset']['nodes'].map { |replica| "admin:[email protected]#{replica}/user_db1" }.join(",") %>", 

Grundsätzlich dieser Code was tut, ist die folgende:

output = "" 

output << "\"mongo\": {\n" 
output << " \"url\" : \"mongodb://" 
urls = node['mongodb']['replicaset']['nodes'].map do |replica| 
    output << "admin:[email protected]" 
    output << replica 
    output << "/user_db1" 
end 
output << urls.join(", ") 
output << "\"," 

Hier output die Ausgabe der ERB-Vorlage darstellt. In der tatsächlichen ERB-Implementierung ist etwas mehr Logik beteiligt, aber die grundlegende Logik funktioniert ähnlich.

Wenn diese in einem tatsächlichen Kochbuch zu tun, in der Regel ein besserer Ansatz ist es, die URLs in Ihrem Rezepte bereits zu bauen und sie zu Ihrer Vorlage vorkompilierte passieren:

In recipes/default.rb:

urls = node['mongodb']['replicaset']['nodes'].map do |replica| 
    "admin:[email protected]#{replica}/user_db1" 
end 

template '/path/to/mongo.json' do 
    source 'my_template.json.erb' 
    variables mongo_urls: urls 
end 

In templates/default/my_template.json.erb:

"mongo": { 
    "url" : "mongodb://<%= @mongo_urls.join(",") %>", 
+0

danke für den Versuch, mir zu helfen. aber die Ausgabe immer noch nicht wie erwartet. '" url ":" mongodb: // admin: 123456 @ test-mongo1: 27017/benutzer_db1admin: 123456 @ test-mongo2: 27017/user_db1 ",' Es wird nicht durch Komma getrennt. –

+0

Ich habe meine Antwort bearbeitet. –

+0

behoben, danke für die Hilfe :), wird in prebuild schauen und es in die Vorlage aufnehmen. –

Verwandte Themen