2017-06-19 53 views
1

我有進口的環境文件的廚師長JSON文件,廚師模板環紅寶石

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

我的廚師烹飪書模板添加如下打造蒙戈連接字符串,

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

但輸出像下面,而不是驗證爲JSON

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

預期結果:

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

跟着How to Run for each loop in template chef,但我的紅寶石不是最好的,因爲我剛剛開始與所有這些東西。任何幫助將是偉大的,謝謝。

+0

使用'map' not'each'。 –

回答

3

起初,我們可以嘗試解決循環,使得只有必要的部分都包含在內部塊:

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

然而,這仍然導致一個問題:有一個結尾逗號,因爲我們總是在每次迭代後添加它。

因此,更好的方法是首先構建一個URL列表,然後用逗號將它們連接到單個字符串。這樣,元素之間只有一個逗號。這應該工作,而不是:

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

基本上,這個代碼如下:

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 << "\"," 

這裏,output代表ERB模板的輸出。在實際的ERB實現中,涉及到更多的邏輯,但基本邏輯與此類似。

當在實際的食譜這樣做,通常是一個更好的方法是在你的食譜建立的網址已經並將它們傳遞給你的模板預生成:

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 

templates/default/my_template.json.erb

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

感謝您試圖幫助我。但產量仍不如預期。 '「url」:「mongodb:// admin:123456 @ test-mongo1:27017/user_db1admin:123456 @ test-mongo2:27017/user_db1」,' 它不會以逗號分隔。 –

+0

我編輯了我的答案。 –

+0

解決了,感謝您的幫助:),將查看prebuild並將其包含到模板中。 –