我正在尝试迭代EVN Hash并将结果保存到文件中。以下是我的尝试:
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
文件已创建,但内容为空。我能得到一些提示吗?
答案 0 :(得分: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
答案 1 :(得分:4)
在这种情况下,您不需要创建临时变量。您可以将该方法直接传递到content
块中,如cassianoleal建议的那样。
但是,我强烈建议转移到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 %>
您可以在Chef Docs上阅读有关ERB模板语言和厨师模板的更多信息。
答案 2 :(得分:2)
ruby中的哈希(#)符号用于发表评论。第7行哈希(#)符号后的所有内容都被视为注释。
在each_pair块中,您不断地将tempVar重新分配给tempVar。由于tempVar最初是一个空String,因此在每次迭代时都将tempVar设置为emptyString。
答案 3 :(得分: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"