使用DNS条目来确定位置

我试图想一个干净的方式来确定机器的位置(主要是它们属于哪个数据中心)基于他们的networking设置。

我希望它是dynamic的,而且我正在考虑使用特定于每个数据中心的DNS服务器的特殊DNSlogging。

例如,你可以有:

root@machine1# dig TXT mysite ... mysite 3600 IN TXT "DC1" ... root@machine2# dig TXT mysite ... mysite 3600 IN TXT "DC2" ... 

等等

我知道DNS有一个特殊的LOC位置logging,但它需要坐标,所以它不会帮助我的情况。 有没有解决这个问题的标准方法,另一种特殊types的logging,或者TXTlogging中的一些标准条目?

(首先,请原谅我不同意你的问题。)恕我直言,显然是这样的主机configuration信息的正确的地方是DHCP。 DHCP 旨在为客户提供使用子网上可用的各种服务所需的所有信息。

你可以使用一些标准的DHCP选项,我发现domain-name最接近你的目的。 你可以在你的DHCP 服务器上使用这样的东西:

  option domain-name DC1; option domain-name dc1.example.org; 

或者(甚至可能更好),DHCP允许特定于站点的选项 ,您可以定义一个名为option选项的site-name (也需要一些数字选项代码),如下所示:

  option site-name code 222 = text; option site-name "DC1"; 

在DHCP客户机上定义这个选项代码,请求选项并在实际使用它的地方烘烤一些/etc/dhcp/dhclient-enter-hooks脚本。

编辑 :在最近的发行版中, dhclient-enter-hooks不再调用,而是将脚本放到/etc/NetwokManager/dispatcher.d/文件夹中,如下所示:

 #!/bin/sh # save me as /etc/NetwokManager/dispatcher.d/02test printenv >>/tmp/dhcp-env 

一旦DHCP获得租约,您将看到所有您的DHCPvariables转储到/ tmp / dhcp-env。

也许你最好在一个单独的DHCP选项中定义所有的打印机名称,apt服务器等,而不是仅仅标识数据中心,而是将所有相关的configuration存储在客户端。

如果你select使用DNS ,我发现你的TXT是一个不错的select,不知道为此目的定义的任何标准,除了这个: named.conf server-id选项:服务器在接收时应该报告的ID ….types为TXT的类ID为CHAOS的名称为ID.SERVER的查询。

即在你定义的named.conf中

 server-id DC1; //or DC2 etc. 

Sorta旨在确定我正在与哪个DNS服务器交谈,这与您所需的服务非常接近。

如果你想把它放到自由文本中,DNS是一个非常奇怪的位置。

从您的描述中我得出,有不同的数据中心到数据中心的自动设置程序(因为它们使用不同的主DNS服务器)。

我正在做的 – 这是我的build议 – 独立于操作系统:在自动安装期间设置SNMP-SysLocation并激活SNMPD。 如果你有多宿主服务器(即多个不同的networking连接),你也可以有一个单独的pipe理networking。 使用snmpd.conf中的“AgentAddress”指令设置snmpd以在该networking中侦听。

如果你想要更简单一些的东西,比如“US / IL / Chicago / 1060 W Addison St / floor 1 / rack 2”,则使用TXTlogging。 这就是他们的目的。 如有必要,使用dynamicDNS将其编写起来。 TXT它可以在转发DNS附加到主机名,或反向DNS附加到IP地址,甚至整个子网(这可能是最适合您的情况)。

你的networking的数字结构是什么样的? 只要不在位置之间共享子网,就可以grep一个将子网映射到数据中心的文本文件。 甚至可以使简单的脚本来查找名称,然后用查找的ip地址grep文件
10.11.0.0数据中心1
10.12.0.0数据中心1
10.13.0.0数据中心1
10.51.0.0 Datacenter2
10.52.0.0 Datacenter2
10.53.0.0 Datacenter2
现在你说“主要”位置….如果你想要行,机架,机箱,插槽…这是一个不同的野兽,关于SNMP-SysLocation的答案会更好。

我个人不会推荐使用DNS,因为它是一个集中pipe理的服务,这意味着如果服务器移动位置,您必须更新DNS服务器上的位置信息,并且不能在系统上简单地控制它被移动。

如果在你pipe理的所有系统上运行SNMP,并且你知道SNMPconfiguration允许你存储一个系统位置(我相信他们应该像Nils提到的那样),你可以运行SNMP并让系统存储一个位置进入那里。 这可能会稍微好一点,因为您可以控制服务器本身的服务器位置 – 如果它移动,您可以轻松更改位置,如果服务器closures,则不会获取过时的信息。 但是,如果SNMP处于closures状态,您将无法知道服务器在哪里,因为您无法查询SNMP。

我相信,pipe理这类信息的最佳select是使用直stream资产pipe理系统 – 至于哪一个,这将取决于你(有很多可供select的)。

如果我只需要使用DNS,我可能会考虑为每个DNS服务器创build一个srvlogging,以便logging您可以检索的位置,但是像Active Directory这样的解决scheme将是一个更好的解决scheme

这里只是一个理论,我不是一个Linux的人。 如果这是Windows,我只需在一个特定的网卡上设置dynamicDNS更新,我知道这个网卡总是被插入networking“x”,并禁用其他网卡上的dynamic更新。 然后,当服务器在其所在的位置移动时,我将知道IP。

但是,因为看起来你没有这个选项,所以有一件事你可以看看更新一个CSV / TXT文件或者甚至是DNS的珍珠剪辑(作为一个例子)。

基本的脚本将是:

  1. 你有一个数据中心到IP映射avaialbe所有服务器查找的集中列表。
  2. 您的服务器将configuration一个每天运行的本地脚本,并检查其NIC IP,并查看是否有任何IP匹配给定的子网。
  3. 如果匹配,则更新CSV / TXT / DNS及其名称和数据中心位置。

国际海事组织什么可能会更好,是实际上有一个中央服务器使用脚本按名称查找服务器,并找出其IP,然后将其匹配到数据中心,并将其存储在一个CSV。 让它每天运行一次,每天创build一个新的CSV。 因此,所有你必须做的DNS明智的,只是确保Alogging是正确的移动服务器。

编辑1:

另一件我不认为你已经覆盖的是,你计划如何处理服务器移动后清除logging? 你打算在logging上设置一个年龄限制,以便在“x”天内不更新它的删除吗? 这只是使用简单的中央CSV的另一个好处。 您甚至可以使用该集中的CSV来每天更新DNS。

我实际上是这样设置在我们的数据中心:

  1. 所有服务器都有一个标准的search列表,除了; 每个数据中心都分配有不同的数据中心特定域; 即www2.example,www3.example
  2. 那么该域名将首先放在search列表中

注意事项:

  1. DC特定领域和任何其他领域都不应该存在解决scheme; 故障排除问题成为一个真正的噩梦
  2. 使用这种方法你必须维护多个内部域

这已被certificate是一种非常有效的方法,允许开发人员创build相同的代码,然后根据调用位置(服务器)对其进行不同的处理。 例如, http:// someapp:someport / blah / foo.do可以被定向到一个完全不同的IP地址(在我们的例子中

有关于stackoverflow的实际和有趣的答案,它描述了如何做到这一点:

MaxMind Geolite城市是免费的。 如果不够好,你可以升级到一个更准确的付费版本。 我不能说付费版本的质量,因为我从来没有使用它。

如果你喜欢你的SQL,请下载CSV版本。 将其加载到您select的数据库中,然后查询。

更快,更节省空间的select是下载相同数据库的文件二进制blob版本,然后使用C#类进行查询。

另外,我发现ipinfodb.com是有用的。 查询是通过简单的HTTP GET。 例如,要geolocate stackoverflow.com尝试:

http://ipinfodb.com/ip_query.php?timezone=false&ip=69.59.196.211

https://stackoverflow.com/questions/2663371/longitude-and-latitude-value-from-ip-address

基本上你可以通过使用下面的命令获得这个信息:

 curl http://ipinfodb.com/ip_locator.php?ip=stackoverflow.com 

然后parsing响应的输出:

  <ul> <li>IP address : <strong>64.34.119.12</strong></li> <li>Country : US <img src="/img/flags/us.gif"/></li> <li>State/Province : CALIFORNIA</li> <li>City : SANTA CLARA</li> <li>Zip or postal code : 95050</li> <li>Latitude : 37.354108</li> <li>Longitude : -121.955236</li> <li>Timezone : -08:00</li> <li>Local time : April 6 13:23:41</li> <li>Hostname : stackoverflow.com</li> </ul> 

在这里,这个命令去掉细节:

 curl http://ipinfodb.com/ip_locator.php?ip=stackoverflow.com|grep "<li>.*: " 

看看LLDP 。 它应该能够告诉你一个特定的服务器在哪个交换机/路由器上。 从那里,你可以告诉它的数据中心(基于它的名字,或者你可以存储一些关于它的额外的元数据)

你可能会发现这个感兴趣的专利。 我相信它已经被允许到期。 https://www.google.com/patents/US20140051463在链接谷歌“Paul Brabban专利”的情况下。

摘要公开了一种用于跟踪提供服务的物理位置的设备和方法。 该装置包括可操作以发送和接收消息的通信模块,位置标识符和可操作以请求通信模块发送针对服务的位置请求消息的查询元素。 通信模块可操作以响应于所述位置请求消息而接收位置响应消息,所述位置响应消息包括用于所述服务的位置信息; 并将该业务的位置信息转发给位置标识。 位置标识符可操作以识别与服务的位置信息相关联的物理位置。