Puppet 如何将数组传递给ruby中的erb模板,并对其进行迭代?

Puppet 如何将数组传递给ruby中的erb模板,并对其进行迭代?,puppet,ruby,templates,Puppet,Ruby,Templates,我需要一些关于erb模板的帮助,我似乎无法在传递数组然后迭代它时动脑。 我的问题是这个。 我想传递几个数组: ` 到迭代数组中每个项并将其打印出来的模板: auto <%= device %> inet static

我需要一些关于erb模板的帮助,我似乎无法在传递数组然后迭代它时动脑。 我的问题是这个。 我想传递几个数组: `

到迭代数组中每个项并将其打印出来的模板:

auto <%= device %> inet static                                                                                                                                        
address <%= ipaddr %>
netmask <%= netmask %>
broadcast <%= broadcast %>
gateway <%= gateway %>
auto-inet-static
地址
网络掩码
广播
网关
到目前为止,我所能做的就是找出我需要用
设备做些什么。每个|设备|放置设备
,但我不知道语法应该是什么样子。 我相信你可以从这些片段中看出我想做什么,然后你可能会明白条目需要分开,而不是插入。 如果您能提供任何帮助,我们将不胜感激。我知道我应该在irb里试一下,然后从那里弄明白,这就是我现在读到的


谢谢

在ruby中使用每个选项的基本语法如下:

array.each do |item_from_array| BLOCK
<% for idx in (0..1) %>
  auto <%= device[idx] %> inet static
  address <%= address[idx] %>
  netmask <%= netmask[idx] %>
  broadcast <%= broadcast[idx] %>
<% end %>
<%- devices.each do |d| %>
  auto <%= d %> inet static
<%- end %>
因此,如果只有一个数组,则可以执行如下操作: (为了清晰起见,我会在竖条内使用不同的名称)


自动inet静态
但是,这将首先在所有设备上进行迭代,然后再转移到ipaddr阵列。我猜您希望它们依次为自动、地址、网络掩码等。在这种情况下,最好使用更“传统”的索引并循环N次,如下所示:

array.each do |item_from_array| BLOCK
<% for idx in (0..1) %>
  auto <%= device[idx] %> inet static
  address <%= address[idx] %>
  netmask <%= netmask[idx] %>
  broadcast <%= broadcast[idx] %>
<% end %>
<%- devices.each do |d| %>
  auto <%= d %> inet static
<%- end %>

自动inet静态
地址
网络掩码
广播
当然,您需要考虑数组的最大大小,以及如果一个数组包含的条目少于其他数组,该怎么办。您可以通过如下操作找到所有数组的最大大小:
[device,address,netmask,broadcast].map{a | a.length}.max

您可以跳过这样的特定数组:
地址

用于假人的ERB模板 基本代码:

require 'erb'
ERB.new(template).result binding_for_template
什么是
模板
模板的绑定

模板 只是模板内容。只需使用
文件即可从文件中读取。读取(路径)

模板绑定 A

在代码中的某个特定位置封装执行上下文,并保留该上下文以备将来使用

你如何使用它?简单:

def binding_for_my_template
  devices      = ["eth0", "br0"]
  ipaddrs      = ["192.168.12.166", "192.168.12.199"]
  netmasks     = ["255.255.255.0", "255.255.255.0"]
  hwaddrs      = ['']
  networks     = ['']
  gateways     = ["192.168.12.254", "192.168.12.204"]
  binding
end
这将返回所有六个数组的绑定(为了一致性,我将
hwaddr
network
更改为数组)

在数组上迭代 通常的方法是使用
each
方法,如下所示:

array.each do |item_from_array| BLOCK
<% for idx in (0..1) %>
  auto <%= device[idx] %> inet static
  address <%= address[idx] %>
  netmask <%= netmask[idx] %>
  broadcast <%= broadcast[idx] %>
<% end %>
<%- devices.each do |d| %>
  auto <%= d %> inet static
<%- end %>

自动inet静态
但是,如果您想将所有字符串都放在一行中,还有其他方法,例如,
devices.join'
将在所有字符串之间加一个空格。

您应该阅读。引用:

# Managed by Class['ntp']
<% servers_real.each do |server| -%>
server <%= server %>
<% end -%>

# ...

这更适合堆栈溢出。版主会这样做的;我已经投票关闭/移动它。希望更多的人会加入进来。这很有效,正是我想要的。谢谢!行
上有语法错误,但除非我更改6个字符,否则我无法编辑它。第一个示例应该是:
auto inet static
@nocache这是一个非常古老的例子,但是感谢你加入了“.each”这个例子,虽然它不一定能回答OP的问题,但这正是我所需要的!如果你只使用一个变量,这是有效的,顺序也不重要。我正在尝试做一些更复杂的事情。