2012-02-16 86 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)到最後。