2012-02-16 97 views
0

所以我得到了一个脚本(A),它为新的虚拟服务器找到合适的IP地址。首先,它需要查看数据库,看看他选择的第一个IP是否已经被另一个服务器占用。如果IP尚未被使用,脚本会对其进行处理。如果ping没有响应,那么我们进入下一步,这是我遇到问题的地方。Ruby:使用脚本内部的外部脚本进行比较

在接下来的步骤中,我必须检查IP地址是否已经在netscaler(路由器)中注册过。为此,我必须在同一台机器上使用另一个脚本(B)。这个其他脚本返回netscaler中定义的所有ips的列表。当我运行它时,输出看起来像这样

x.x.x.x 
x.x.x.x 
x.x.x.x (and so on..). 

我发现很多方法可以从鳕脚本中执行脚本B,但没有什么,我发现让我做想什么,我要。

我的目标是比较我的脚本与所列出的所有列表,而不会在屏幕上打印最后一个脚本。

因此,使它更清楚一点,让我们说,纸条A中的IP:1.2.3.4

它将然后调用脚本B,将返回到一个脚本这名单

1.2。 3.5 1.2.4.5 1.2.5.1 等等。

然后A将比较1.2.3.4与脚本B返回的所有内容,而不实际在屏幕上显示它们。

非常感谢!

回答

2

我就从scriptB UI分开scriptB业务逻辑(CLI)的逻辑:

scriptA.rb 
scriptB.rb 
netscaler.rb # extract logic here 

提取您的list of all the ips defined in the netscaler逻辑放到单独的类/方法:

#netscaler.rb 
class Netscaler 
    def self.list_ips 
    # return array of ips here 
    end 
end 

#scriptB.rb 
require_relative 'netscaler' 

ips = Netscaler.list_ips 
puts ips # script B may show these ips on the screen 
...  

#scriptA.rb 
require_relative 'netscaler' 

ips = Netscaler.list_ips 
# script A will not show them. Instead it will operate on the returned result. 
... 
+0

非常感谢您的建议和解决方案。现在一切正常!我以前从未在ruby中使用过类,也没有做过require_relative。再次感谢! – Cocotton 2012-02-16 14:45:54

0

您可以使用反引号来执行脚本B并返回输出:

ip_list = `scriptB`.split("\n") 

这可以插入Alex的组织建议中。如果脚本B是您无法控制的非Ruby脚本,我会这样做。

请注意,如果有任何前导或尾随空白,您可以添加.map(&:strip)到最后。