Techioz Blog

Rubyを使用してDNSレコードが存在するかどうかを確認するにはどうすればよいですか?

概要

指定されたホスト名が IPAM システムの A レコードですでに使用されているかどうかを確認しようとしています。たとえば、https://this-internal-url.net が DNS システムですでに「取得」されている場合は、true を返す必要があります。それ以外の場合は偽です。

私はさまざまなソリューションをたくさん試しましたが、そのほとんどは S.O. からのものでした。

これらのほとんどは、無効な URL が渡されたときに単にエラーが発生します。

require 'resolv'
ip_ad = Resolv.getaddress <url>
print ip_ad

URL が DNS に存在しない場合は、単にエラーが発生します。

require 'infoblox'
# create a connection
connection = Infoblox::Connection.new(
  username: <infoblox_user>,
  password: <infoblox_passwd>,
  host: <infoblox_grid_server>,
  ssl_opts: {verify: false},
  logger: Logger.new(STDOUT)
)

search = Infoblox::Arecord.find(connection, {"name~" => "#{url}"})
print search
# also tried: search = Infoblox::Search.find(connection, "search_string~" => "#{url}")

また:

require 'rubygems'
require 'dnsruby'
include Dnsruby
info = system("nslookup -q=txt #{url}")
print info

また:

require 'rubygems'
require 'dnsruby'
include Dnsruby
res = Dnsruby::Resolver.new
ret = res.query(url, Types.TXT)
print "#{ret.answer}"

また:

require 'resolv'
txt = Resolv::DNS.open do |dns|
  records = dns.getresources(url, Resolv::DNS::Resource::IN::TXT)
  records.empty? ? nil : records.map(&:data).join(" ")
end
print txt

また:

require "resolv"
Resolv::DNS.open do |dns|
  ress = dns.getresources "infoir.com", Resolv::DNS::Resource::IN::A
  log(ress.map { |r| [r.exchange.to_s, r.preference] })
end

これらのスニペットはどれも true/false に評価されないことはわかっています。既存の DNS レコードと存在しないレコードを間違いなく区別するソリューションにまだ到達していません。

解決策

解決しました。

name_taken = system("ping -c 1 -W 1 #{host_name}")

name_taken は、指定されたホスト名に DNS レコードがすでに存在するかどうかを判断するために使用できるブール値を返します。