mat*_*att 15 ruby templates puppet
我需要一些关于erb模板的帮助,我似乎无法理解传递数组然后迭代它.我的问题是这个.我想传递几个数组:`
device => ["eth0", "br0"],
ipaddr => ["192.168.12.166", "192.168.12.199"],
netmask => ["255.255.255.0", "255.255.255.0"],
hwaddr => '',
network => '',
gateway => ["192.168.12.254", "192.168.12.204"],
Run Code Online (Sandbox Code Playgroud)
对于迭代数组中每个项目并将其打印出来的模板:
auto <%= device %> inet static
address <%= ipaddr %>
netmask <%= netmask %>
broadcast <%= broadcast %>
gateway <%= gateway %>
Run Code Online (Sandbox Code Playgroud)
到目前为止,我已经知道我需要做些什么device.each |device| puts device,但我不知道语法应该是什么样子.我相信你可以从这些片段中分辨出我想要做什么,然后你可能会理解这些条目需要分开,而不是插入.您可以提供的任何帮助将不胜感激.我知道我应该用irb来解决问题并从那里搞清楚,这就是我现在正在阅读的内容.
谢谢!
noc*_*che 30
在ruby中使用每个的基本语法是这样的:
array.each do |item_from_array| BLOCK
Run Code Online (Sandbox Code Playgroud)
所以如果你只有一个数组那么你可以做这样的事情:(为了清楚起见,我会在竖条内使用不同的名字)
<% device.each do |dev| %>
auto <%= dev %> inet static
<% end %>
Run Code Online (Sandbox Code Playgroud)
然而,在继续使用ipaddr阵列之前,这将首先遍历所有设备.我猜你想要他们每个轮流自动,地址,网络掩码等.在这种情况下,你最好使用更"传统"的索引并循环N次,如下所示:
<% for idx in (0..1) %>
auto <%= device[idx] %> inet static
address <%= address[idx] %>
netmask <%= netmask[idx] %>
broadcast <%= broadcast[idx] %>
<% end %>
Run Code Online (Sandbox Code Playgroud)
当然,您需要考虑数组的最大大小,以及如果数组包含的条目少于其他数组,该怎么办.您可以通过执行以下操作找到所有阵列的最大大小:[device,address,netmask,broadcast].map{|a| a.length}.max
你可以跳过这样的特定数组: <% if idx < address.length %> address <%= address[idx] %><% end %>
基本代码:
require 'erb'
ERB.new(template).result binding_for_template
Run Code Online (Sandbox Code Playgroud)
template和是什么binding_for_template?
只是模板内容。您只需从文件中读取它即可File.read(path)。
一个绑定
将执行上下文封装在代码中的某个特定位置,并保留该上下文以供将来使用。
你如何使用它?简单的:
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
Run Code Online (Sandbox Code Playgroud)
这将返回与所有六个数组的绑定(为了保持一致性,我将hwaddr和更改network为数组。
通常的方法是使用该each方法,就像这样:
<%- devices.each do |d| %>
auto <%= d %> inet static
<%- end %>
Run Code Online (Sandbox Code Playgroud)
但是如果您想将所有内容放在一行中,还有其他方法,例如devices.join ' '将所有字符串连接起来,中间用空格连接。