通过ENV迭代并将结果写入Chef中的文件

时间:2014-06-10 01:03:50

标签: ruby chef

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

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

4 个答案:

答案 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"