Ruby 遍历ENV并将结果写入Chef中的文件

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

我正在尝试迭代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

文件已创建,但内容为空。我可以得到一些提示吗?

< 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的答案只会创建一个环境对,很明显,他真的想要所有环境对。准确地说,结尾有一个拼写错误。准确地说,结尾有一个拼写错误。