Chef/Ruby:遍历哈希数组

Chef/Ruby: Iterating through a Hash Array

我正在尝试遍历我的 Chef 属性文件中定义的散列并将其写入配置模板:

default['disk'] = node['block_device'].select { |i,j| j['state'] == 'running' && i != 'cdrom' }.select { |r| puts "Disk #{r}"}

在我的 Chef 模板中,我使用 <%= @disk %> 调用变量,因此所有工作都在属性文件变量中完成。

上面的属性会在编译食谱时显示我想要的结果,但是使用 puts 方法不会写入配置模板,我想出了一个空字符串来代替(见下文)。

Compiling Cookbooks...
Disk sda
Disk sdb
Converging 7 resources
....
+    Disk "{}"

如果我删除 puts 方法(不需要它来写入配置模板),那么我将整个 ['block_device'] 结构(而不​​仅仅是设备名称)作为磁盘值写入配置模板。

我也试过在配置模板中使用 puts 方法,但没有成功。在 chef-client 运行 期间,如何在模板中为数组中的每个键值写入一个新行?我想在编译期间将其写入配置模板而不是 STDOUT??

Chef 模板使用 Erb 格式,你想实际使用它吗:

# recipe
template '/asdf' do
  # ...
  variables disks: node['block_device'].select { |i,j| j['state'] == 'running' && i != 'cdrom' }
end

# template
<%- @disk.each do |i, j| -%>
<%= i %>
<%- end -%>