2017-02-17 92 views
2

我有一個存儲主機名的Ruby數組,server_names。如果我打印出來,它看起來像這樣:從Ruby中的主機名獲取IP地址

["hostname.abc.com", "hostname2.abc.com", "hostname3.abc.com"] 

漂亮的標準。我想要做的是獲得這些服務器的IP(可能將它們存儲在另一個變量中)。

它看起來像IPSocket類可能會這樣做,但我不知道如何使用IPSocket類來遍歷它。如果它只是試圖打印出如下IP:

server_names.each do |name| 
      IPSocket::getaddress(name) 
      p name 
      end 

它抱怨說我沒有提供服務器名稱。這是一個語法問題還是我只是沒有正確使用類?

輸出:

getaddrinfo: nodename nor servname provided, or not known 
+0

您可以包括你看到的錯誤的完整堆棧跟蹤? –

+0

嗨@StevenSchobert,謝謝你的回覆。沒有太多要包括,但我編輯了原始帖子以包含輸出。 nslookup確實可以解析IP。 – mxmxx

+0

你確定你的主機名是有效的嗎?你有沒有嘗試過使用'wget'或'curl'來查看它們是否可以真正解決? – Coolness

回答

1

這僅僅是getaddrinfo方法是如何工作的。如果可以解析名稱,則會獲得以字符串形式表示的IP地址。如果沒有,你會得到一個SocketError異常。這意味着,爲了處理這些,你需要預見到:

server_names.map do |name| 
    begin 
    IPSocket.getaddress(name) 
    rescue SocketError 
    false # Can return anything you want here 
    end 
end 

注意,呼籲對事物的方法時,它的約定使用.,而不是命名空間分隔::。分隔符可以工作,但是很麻煩,因爲通常保留用於引用像MyClass::MY_CONST這樣的常量。

+1

謝謝@tadman。對於這個特定的環境來說,AWS主機名不可解析(已經在相似的環境中進行過測試)。首先檢查基本知識... – mxmxx

4

您可能會更好使用Resolv,它是Ruby標準庫的一部分,專門用於處理解析DNS條目。

從Ruby的文檔:

RESOLV是用Ruby編寫的一個線程感知的DNS解析庫。 Resolv可以同時處理多個DNS請求,而不會阻塞整個Ruby解釋器。

例子:

require "resolv" 

server_names.each do |name| 
    address = Resolv.getaddress(name) 
    puts address 
end