Puppet 如何将数组传递给ruby中的erb模板,并对其进行迭代?
我需要一些关于erb模板的帮助,我似乎无法在传递数组然后迭代它时动脑。 我的问题是这个。 我想传递几个数组: ` 到迭代数组中每个项并将其打印出来的模板:Puppet 如何将数组传递给ruby中的erb模板,并对其进行迭代?,puppet,ruby,templates,Puppet,Ruby,Templates,我需要一些关于erb模板的帮助,我似乎无法在传递数组然后迭代它时动脑。 我的问题是这个。 我想传递几个数组: ` 到迭代数组中每个项并将其打印出来的模板: auto <%= device %> inet static
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的问题,但这正是我所需要的!如果你只使用一个变量,这是有效的,顺序也不重要。我正在尝试做一些更复杂的事情。