我们能为EC2实例设置易记的主机名吗?

51

我在EC2上运行了几个标准的Fedora实例。我感觉亚马逊分配给实例的公共主机名太奇怪了,很难记。我想把它们改成一些简短的名称(例如红色/蓝色/绿色等)。

这样做有什么缺点吗?如何设置使其在重新启动后保持不变?

谢谢。


要设置它,您可能需要指定正在运行的系统。另外相关的是:设置主机名有什么后果? - cwd
10个回答

89

在开始之前,尝试运行hostnamehostname --fqdn并记录响应结果。

您可以编辑/etc/hostname并设置主机名,在重新启动后将保留该名称。您可以使用hostname -F /etc/hostname强制重新加载主机名,以将该值读入主机名中。注销并登录后,bash提示符将更改。

警告/注意事项:
是的,在bash提示符中将主机名设置为比ip-123-123-123-123更有用的内容是很好的,但我决定暂时保留我的主机名,因为许多事情似乎都依赖于以标准方式设置ec2实例上的主机名。在编辑了/etc/hostname并将主机名更改为webserver后,许多服务似乎会失败,因为无法解析主机名,apache也无法启动。接下来,我编辑了/etc/hosts并添加了

127.0.0.1 webserver

作为第二行。然后Apache就启动了,但是抱怨找不到FQDN。我确认运行hostname --fqdn不再起作用。

接下来,我咨询了man hostname,并了解到虽然可以设置hostname,但似乎通过DNS查找返回的是FQDN

FQDN

你不能使用这个命令更改FQDN(由hostname --fqdn返回)或DNS域名(由dnsdomainname返回)。系统的FQDN是解析器(3)为主机名返回的名称。

技术上:FQDN是gethostname(2)返回的主机名的getaddrinfo(3)返回的名称。DNS域名是第一个点之后的部分。

因此,它取决于配置(通常在/etc/host.conf中),您如何更改它。通常情况下(如果在DNS或NIS之前解析主机文件),您可以在/etc/hosts中更改它。

我认为可能有可能设置系统/欺骗系统返回FQDN,例如ip-123-123-123-123.ec2.internal,即使主机名为webserver,但在这一点上,这似乎更麻烦,不值得这样做,而且为了让我的bash提示符更好看,可能会在未来导致许多软件和配置问题,所以我放弃了。

我还了解到很多Amazon EC2实例使用名为cloud-init的东西:

cloud-init是处理云实例的早期初始化的Ubuntu包。它安装在Ubuntu Cloud映像中,也安装在EC2上提供的官方Ubuntu映像中。

它配置的一些内容包括:

  • 设置默认语言环境
  • 设置主机名
  • 生成SSH私钥
  • 将SSH密钥添加到用户的.ssh/authorized_keys中,以便他们登录
  • 设置临时挂载点

可以通过用户数据配置cloud-init的行为。用户数据可以在实例启动时由用户提供。这是通过ec2-run-instances的--user-data或--user-data-file参数完成的。

我还发现了这个,它讨论了如何使用cloud-init配置主机名:

在EBS实例中,关闭和稍后启动将导致不同的IP地址。

在用户未将/etc/hostname从其原始值(由元数据的'local-hostname'生成)修改的情况下,cloud-init将再次设置主机名并更新/etc/hostname。

如果用户已修改了/etc/hostname,则它将保持由用户管理。

此外,如果/etc/cloud/cloud.cfg包含设置为真值的“preserve_hostname”值,则永远不会触摸/etc/hostname。

有趣的是,如果您不更改主机名,cloud-init软件包将为您更新它。

如果其他人有解决方法或可以解决提到的一些问题,并帮助确定更改主机名不会破坏EC2实例上的任何内容,我会很高兴听到。


3
你需要欺骗机器才能修复“hostname --fqdn”。如果你在/etc/hosts中添加类似于“127.0.0.1 webserver.example.com webserver”的内容,它就会起作用。hosts文件的预期语法是“ip hostname alias”。 - SaltwaterC
4
文档链接:http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/set-hostname.html (注意:文档是以亚马逊 Linux 为前提编写的;我使用的是 Ubuntu,因此我需要编辑 /etc/hostname 而不是 /etc/sysconfig/networking。) - odigity
请查看您之前问题的最佳答案(https://unix.stackexchange.com/questions/50485/what-are-the-ramifications-of-setting-the-hostname),它会告诉您如何使 hostname --fqdn 正常工作:您只需要一个解析的域名,无论是因为您已经注册了一个指向该主机的域名,还是像 @saltwaterc 建议的那样“欺骗”它。两种方法都可以。 - bryant
“/etc/hostname” 不是只有 Debian 派生的发行版才使用吗?我认为在 RedHat 派生的发行版中,“/etc/sysconfig/network” 中的 “HOSTNAME” 条目是标准位置。 - Alastair Irvine
在编辑/etc/hosts文件时要小心。应该将127.0.0.1保留为本地主机行。添加一行新的虚假地址(对于DHCP系统),例如127.0.1.1 webserver.example.com webserver。(Ping SaltwaterCcmd)。) - Alastair Irvine
1
你的警告是公正的,但在我的Amazon Linux机器上,即使使用默认名称如 ip-172-31-3-124.ec2.internalhostname --fqdn命令也会失败。通过 /etc/sysconfig/network 更改为真实名称并不会更糟。 - David

13
另一种方法是简单地编辑~/.bashrc文件,并在PS1前加上机器的昵称。
编辑:更准确地说,是全局修改,例如在AWS Linux AMI(一个例子)上(将以下内容复制到控制台或添加到您的任意安装.sh文件中):
cat << EOF | sudo tee /etc/profile.d/ps1.sh
if [ "$PS1" ]; then
  PS1="[\u@myinst1:\l \t \! \W]\\$ "
fi
EOF

$PS1被其值所替换,你能修正一下你的答案吗? - burtsevyg

12

请以root身份编辑/etc/sysconfig/network

替换

HOSTNAME=localhost.localdomain

使用

HOSTNAME=hostname.DOMAIN_NAME

然后,重新启动或运行/etc/init.d/network restart。接下来,服务器应将其名称报告为FQDN。


1
我通常确保新名称也在/etc/hosts中。 - Rup
1
对于像更改主机名这样的重大更改,进行完全重新启动而不仅仅是重新启动一个服务是否明智?如果其他服务无法使用相同名称启动会怎么样?亚马逊建议重新启动:http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/set-hostname.html - David

7

From this site:

Change the hostname on a running system

On any Linux system you can change its hostname with the command hostname (surprised?)… Here are some quick usages of the command line hostname:

$> hostname

without any parameter it will output the current hostname of the system.

$> hostname --fqd

it will output the fully qualified domain name (or FQDN) of the system.

$> hostname NEW_NAME

will set the hostname of the system to NEW_NAME.

你还可以编辑/etc/hostname文件(至少在Ubuntu上)。
为了确保AWS重启后文件不丢失,你可以将命令添加到/etc/rc.local中,这样它会在机器启动时运行。
还有一种方法可以通过USER_DATA来动态设置主机名:查看这里。
USER_DATA=`/usr/bin/curl -s http://169.254.169.254/latest/user-data`
HOSTNAME=`echo $USER_DATA`
IPV4=`/usr/bin/curl -s http://169.254.169.254/latest/meta-data/public-ipv4`
hostname $HOSTNAME
echo $HOSTNAME > /etc/hostname

1

如果您已经注册了公共DNS名称,请按照以下步骤更改系统主机名

遵循此过程

  1. 使用您喜欢的文本编辑器打开/etc/sysconfig/network配置文件,将HOSTNAME条目更改为反映完全限定域名(例如webserver.mydomain.com)。

    HOSTNAME=webserver.mydomain.com
    
  2. 重新启动实例以获取新的主机名。

    [ec2-user ~]$ sudo reboot
    
  3. 登录到您的实例并验证主机名已更新。您的提示应显示新主机名(直到第一个“。”),hostname命令应显示完全限定域名。

    [ec2-user@webserver ~]$ hostname
    webserver.mydomain.com
    

更改系统主机名,无需公共DNS名称

  1. 使用您喜欢的文本编辑器打开 /etc/sysconfig/network 配置文件,并将 HOSTNAME 条目更改为所需的系统主机名(例如 webserver)。

    HOSTNAME=webserver.localdomain
    
  2. 使用您喜欢的文本编辑器打开 /etc/hosts 文件,并添加一个以 127.0.1.1(在 DHCP 系统上)或 eth0 的地址(在静态 IP 系统上)开头的条目,以匹配下面的示例,替换您自己的主机名。(127.0.0.1 应保留为 localhost 行。)

    127.0.0.1   localhost localhost.localdomain
    127.0.1.1   webserver.example.com webserver
    
  3. 重新启动实例以获取新的主机名。

    [ec2-user ~]$ sudo reboot
    
  4. 登录到您的实例并验证主机名是否已更新。您的提示符应显示新的主机名(最多到第一个“.”),并且 hostname 命令应显示完全限定域名。

    [ec2-user@webserver ~]$ hostname
    webserver.localdomain
    
注意:您还可以更改shell提示符,而不影响主机名。请参阅this AWS documentation

3
好的回答,但你应该澄清一下,这是你从AWS文档中复制的。http://stackoverflow.com/help/referencing - David

0
在我的Linux AMI(其他实例的快照)中,上述公式都不起作用。 我只是改变了文件/etc/init.d/modifyhostname中的HOSTNAME字段,然后进行了正常的重新启动。

0

/etc/rc.local的解决方案对于基本主机名对我有用,但不能给我一个完全限定域名。


0
当然,如果你有自己的域名(设置一个CNAME指向Amazon主机名),那么你可以这样做。否则,你几乎只能使用他们给你的那个(或者如果你设置了一个弹性IP,可以使用它)。

4
我可以设置CNAME。我的问题更多涉及到我得到的bash提示符,其中包括主机名。我希望这更加用户友好,并想知道如何设置它,使其在重启后保持不变,并且是否会对AWS的内部网络配置造成任何问题。 - Nikhil Gupte
7
我只是运行了“hostname”命令来设置主机名,注销并重新登录。 - Barry Brown
使用hostname命令设置的主机名在重启后是否保留? - Nikhil Gupte
4
Nikhil,你可以在/etc/rc.local中添加:hostname myhostname - Jeff Bauer

0

-1
sudo hostname *yourdesiredhostnamehere*

sudo /etc/init.d/networking restart

然后主机名被更改。在我的服务器上,所有其他服务如apache和postfix都可以正常工作。服务器是Ubuntu 12.04 LTS。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接