我使用的是 Ubuntu,并使用 Puppet 管理我的主机。直到一两台机器之前,我的主机解析为 hostname.backend.example.com。最后两台机器解析为 hostname.staging.internal。我有点困惑这些名字是怎么来的。
# /etc/resolv.conf
nameserver 173.203.4.8
nameserver 173.203.4.9
domain backend.example.com
和
# /etc/hosts
10.182.230.38 web01.staging.internal web01
127.0.0.1 localhost localhost.localdomain
/bin/hostname 回复如下:
# hostname -a
web01
# hostname -A
108-166-97-91.static.cloud-ips.com web01.staging.internal
# hostname -I
108.166.97.91 10.182.230.38
存在将 108.166.97.91 映射到 web01.backend.example.com 的 DNS 记录。主机名为何、在何处以及如何选择 web01.staging.internal 而不是公共 DNS 记录?
答案1
该hostname
命令返回 DNS 和的结果/etc/hosts
。
hostname
等同于uname -n
并且是框的实际“主机名”或“节点名”。
所有其他hostname
参数都使用此节点名来查找信息。
因此,在进一步讨论之前,我应该先解释一下/etc/hosts
文件格式。
第一个字段相当明显,它是线路上所有主机名应解析的 IP 地址。第二个字段是该 IP 的主主机名。其余字段是别名。
因此,如果您运行hostname -f
它,它将首先尝试解析您的节点名称的 IP。根据您hosts:
在/etc/nsswitch.conf
此方法中配置条目的方式,它将有所不同。
- 如果您已将其配置为使用 dns,它将使用配置的搜索域,
/etc/resolv.conf
直到从 DNS 获取 IP。 - 如果您已将其配置为使用文件,它将查找
/etc/hosts
主主机名或别名是您当前节点名(uname -n
)的行,然后在该行中返回主主机名。
一旦获得 IP,它就会尝试对该 IP 进行反向查找。同样,它将使用 DNS 并根据您的 hosts 文件执行此操作nsswitch.conf
。如果使用 hosts 文件,它将返回主条目(即文件中 IP 后面的第一个字段)。
hostname -a
仅适用于 hosts 文件,因为在 DNS 中进行反向查找只会得到 1 个结果。使用 hosts 文件,它会返回匹配行中的别名(即第一个条目(主主机名)之后的所有内容)。
例子
如果你的节点名是“foobar”,并且你有一个/etc/hosts
如下条目:
127.0.0.1 foobar.example.com foobar localhost.localdomain localhost
然后你会得到如下的命令结果:
# hostname
foobar
# uname -n
foobar
# hostname -f
foobar.example.com
# hostname -a
foobar localhost.localdomain localhost