2014-06-10 38 views
1

我正在嘗試遍歷EVN哈希並將結果保存到文件中。下面是我的嘗試:通過ENV迭代並將結果寫入廚師的文件

file "/srv/www/shared/test-create-file.txt" do 
    owner "root" 
    group "root" 
    mode "0755" 
    tempVar = "" 
    ENV.each_pair do |k, v| 
    tempVar = tempVar#{k}#{" = "}#{v} 
    end 
    content tempVar 
    action "create" 
end 

的文件被創建,但有一個空的內容。我可以得到一些提示嗎?

回答

5

你並不真的需要創建一個變量:

file "/srv/www/shared/test-create-file.txt" do 
    owner "root" 
    group "root" 
    mode "0755" 
    content ENV.map { |k,v| "#{k} = #{v}" }.join("\n") 
    action "create" 
end 

如果你只是想修復你的迭代,試試這個:

ENV.each_pair do |k, v| 
    tempVar = "#{tempVar}#{k} = #{v}\n" 
end 
0

如果你希望tempVar積累從each_pair塊的返回值,你應該考慮使用inject

tempVar = {key1: :value1, key2: :value2}.inject('') do |memo, member| 
    memo += "#{member[0]} = #{member[1]}\n" 
end 

# tempVar => "key1 = value1\nkey2 = value2\n" 
2

ruby​​中的散列(#)符號用於發表評論。第7行上的散列(#)符號之後的所有內容都被視爲評論。

在each_pair塊中,您不斷地將tempVar重新分配給tempVar。由於tempVar最初是一個空字符串,因此它在每次迭代中將tempVar設置爲emptyString。

+0

這是完全正確的,但不是OP中的錯誤主要來源。然而+1,因爲你是正確的:) – sethvargo

+0

OP要求提供關於爲什麼沒有內容創建文件的提示。我仍然看到我的回答是正確的。除非我錯過了某些東西(完全可能)? – punkle

+0

當然,但OP的答案只會創建一個ENV對,很明顯他真的需要他們。 – sethvargo

4

在這種情況下,您不需要創建臨時變量。您可以按照cassianoleal的建議直接將該方法傳遞給content塊。

但是,我強烈建議移動到template資源。您正在執行的數據操作,這確實應該離開了模板:

template "/srv/www/shared/test-create-file.txt" do 
    source "my-template.erb" 
    owner "root" 
    group "root" 
    mode "0755" 
    action "create" 
end 

然後在模板:

<% ENV.each do |key, value| %> 
<%= key %>=<%= value %> 
<% end %> 

你可以閱讀更多關於ERB模板語言和廚師模板上Chef Docs

+0

最後有一個錯字<% end %>,只是爲了更確切。 – whileone

+0

修正了,謝謝! – sethvargo