厨师Ruby - 可以在模板的变量中循环吗?

时间:2013-10-01 16:48:26

标签: ruby chef

我已经花了很多时间试图弄清楚如何做到这一点,我也调查了但是我找不到合适的方法......?

基本上我正在尝试做以下事情:

types = ['type1','type2']
classes = ['class1','class2']

classes.each do |class|
    types.each do |type|

        template "/files/filename.txt" do
          source "source_file.erb"
          owner "root"
          group "root"
          mode "0440"
          variables({
            :pri_areas => node['area']['#{type}']['#{class}'],
            :rev_areas => node['area']['#{type}']['#{class}']
        })
        end

    end
end

显然我已经定义了所有属性,所以从那个方面看起来一切都很好.. 我仍然无法通过变量获得带有数组的循环? 也许是另一种不同的方法?

任何想法/帮助?

非常感谢。

1 个答案:

答案 0 :(得分:2)

您的代码在正常运行之前需要解决一些问题。

首先,class是Ruby中的保留关键字,因此不能用作变量名。你应该使用另一个,例如klass

其次,class(或klass)以及type已经是循环中的字符串。因此,您不需要尝试字符串插值。你可以直接使用它:

variables({
  :pri_areas => node['area'][type][klass],
  :rev_areas => node['area'][type][klass]
})

你的字符串插值不起作用的原因是ruby知道两种不同的字符串文字:一些"和一些'。区别在于用'分隔的那些不允许字符串插值,并且通常不会将其中任何内容解释为除了文字书写字符串之外的其他内容。只有在"分隔的字符串中,您才能执行"#{foo}"之类的字符串插值,并使用\n之类的转义序列。