Ruby 遍历ENV并将结果写入Chef中的文件
我正在尝试迭代EVN哈希并将结果保存到文件中。以下是我的尝试:Ruby 遍历ENV并将结果写入Chef中的文件,ruby,chef-infra,Ruby,Chef Infra,我正在尝试迭代EVN哈希并将结果保存到文件中。以下是我的尝试: 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
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
文件已创建,但内容为空。我可以得到一些提示吗? < P>如果您希望代码> TunVaA/COD>从<代码> EACHYBION<代码>块中累积返回值,您应该考虑使用<代码>注销< /代码>:
tempVar = {key1: :value1, key2: :value2}.inject('') do |memo, member|
memo += "#{member[0]} = #{member[1]}\n"
end
# tempVar => "key1 = value1\nkey2 = value2\n"
如果您希望<代码> TEVAVA/COD>从<代码> EACHYBION<代码>块中积累返回值,您应该考虑使用<代码>注销< /代码>:
tempVar = {key1: :value1, key2: :value2}.inject('') do |memo, member|
memo += "#{member[0]} = #{member[1]}\n"
end
# tempVar => "key1 = value1\nkey2 = value2\n"
您实际上不需要为此创建变量:
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
您实际上不需要为此创建变量:
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
ruby中的散列(#)符号用于进行注释。第7行的hash(#)符号后面的每一个东西都被视为注释
在each_pair块中,您不断地将tempVar重新指定给tempVar。由于tempVar最初是一个空字符串,它在每次迭代中将tempVar设置为一个空字符串。ruby中的hash(#)符号用于进行注释。第7行的hash(#)符号后面的每一个东西都被视为注释
在each_pair块中,您不断地将tempVar重新指定给tempVar。由于tempVar最初是一个空字符串,因此在每次迭代中将tempVar设置为一个emptyString。在这种情况下,您不需要创建临时变量。您可以按照cassianoleal的建议,将该方法直接传递到
内容
块中
但是,我强烈建议使用模板
资源。您正在执行数据操作,这实际上应该留给模板:
<% ENV.each do |key, value| %>
<%= key %>=<%= value %>
<% end %>
template”/srv/www/shared/test create file.txt“do
来源“my template.erb”
所有者“根”
组“根”
模式“0755”
“创建”操作
终止
然后在模板中:
<% ENV.each do |key, value| %>
<%= key %>=<%= value %>
<% end %>
=
您可以在上阅读有关ERB模板语言和Chef模板的更多信息。在这种情况下,您不需要创建临时变量。您可以按照cassianoleal的建议,将该方法直接传递到
内容
块中
但是,我强烈建议使用模板
资源。您正在执行数据操作,这实际上应该留给模板:
<% ENV.each do |key, value| %>
<%= key %>=<%= value %>
<% end %>
template”/srv/www/shared/test create file.txt“do
来源“my template.erb”
所有者“根”
组“根”
模式“0755”
“创建”操作
终止
然后在模板中:
<% ENV.each do |key, value| %>
<%= key %>=<%= value %>
<% end %>
=
您可以在上阅读有关ERB模板语言和Chef模板的更多信息。这是完全正确的,但不是OPs帖子中错误的主要来源。尽管如此,+1,因为您是正确的:)OP询问有关为什么创建文件时没有内容的提示。我仍然看到我的答案是正确的。除非我遗漏了什么(这是完全可能的)?当然,但OPs的答案只会创建一个环境对,很明显,他真的想要所有环境对。这是完全正确的,但不是OPs帖子中错误的主要来源。尽管如此,+1,因为您是正确的:)OP询问有关为什么创建文件时没有内容的提示。我仍然看到我的答案是正确的。除非我遗漏了什么(这是完全可能的)?当然,但OPs的答案只会创建一个环境对,很明显,他真的想要所有环境对。准确地说,结尾有一个拼写错误。准确地说,结尾有一个拼写错误。