Google Compute Engine:如何永久设置主机名?

时间:2014-08-20 15:23:02

标签: google-compute-engine

如何永久地在GCE中设置实例的主机名?我可以通过主机名设置它,但重新启动后它会再次消失。

我尝试输入元数据(主机名:f.q.d.n),但是没有完成这项工作。但它应该通过元数据(https://github.com/GoogleCloudPlatform/compute-image-packages/tree/master/google-startup-scripts)工作。

有人有想法吗?

14 个答案:

答案 0 :(得分:13)

实现它的最简单方法是创建一个简单的脚本,这就是我所做的。

我已将主机名存储在实例元数据中,然后每次系统重新启动时都会检索它,以便使用cron作业设置主机名。

$ gcloud compute instances add-metadata <instance> --metadata hostname=<new_hostname> 
$ sudo crontab -e

这是必须附加在crontab中的行

@reboot hostname $(curl --silent "http://metadata.google.internal/computeMetadata/v1/instance/attributes/hostname" -H "Metadata-Flavor: Google")

完成这些步骤后,每次重新启动实例时,都会有主机名<new_hostname>。 您可以在提示中或使用以下命令进行检查:hostname

答案 1 :(得分:10)

编辑rc.local

sudo nano /etc/rc.local 

在其余部分添加您的行:

hostname *your.hostname.com*

确保在执行脚本之后运行以下命令

chmod +x /etc/rc.d/rc.local

重新启动,并获利。

答案 2 :(得分:6)

需要删除文件/etc/dhcp/dhclient.d/google_hostname.sh

答案 3 :(得分:5)

这是不可能的。 Please take a look at this answer.以下article解释了&#34;主机名&#34;是默认元数据条目的一部分,无法手动编辑任何默认元数据对。因此,每次系统重新启动时,您都需要使用脚本或其他内容来更改主机名,否则每次重新启动时都会自动与元数据服务器重新同步。

您可以在this article中找到有关GCE启动脚本的信息。您可以visit this one获取有关如何将脚本应用于实例的信息。

答案 4 :(得分:3)

您还可以创建一个简单的启动脚本来完成这些工作:

$ gcloud compute instances add-metadata <instance-name> --zone <instance-zone> --metadata startup-script='#! /bin/bash 
hostname <hostname>'

请注意,如果您已经有一个启动脚本,则需要添加到下面的现有启动脚本命令,否则您将替换所有启动脚本:

$ hostname instance-name

答案 5 :(得分:2)

如果有人发现此解决方案在GCS实例上不起作用。然后我建议你尝试使用谷歌支持所描述的退出钩子。

  

事实上,像CentOS和Debian这样的Linux的一些发行版使用   dhclient-script脚本用来配置网络参数   机。这个脚本是由dhclient不时调用的   动态主机配置协议客户端并提供了一种方法   使用DHCP协议配置一个或多个网络接口,   BOOTP协议,或者如果这些协议失败,则通过静态分配   地址。

     

以下文字是来自人(手册)页面的引用   dhclient的脚本:

     

完成所有处理后,/ usr / sbin / dhclient-script   检查是否存在可执行文件          / etc / dhcp / dhclient-exit-hooks脚本,如果存在则使用'。'命令调用。退出状态          dhclient-script将传递给exit_status shell变量中的dhclient-exit-hooks,并且始终为零          如果脚本成功执行了调用它的任务。如上所述的其余环境          对于dhclient-enter-hooks也存在。 / etc / dhcp / dhclient-exit-hooks脚本可以修改有效值          exit_status更改dhclient-script的退出状态。

     

话虽如此,通过查看代码片段   dhclient-script,我们可以看到脚本检查是否存在   可执行文件/ etc / dhcp / dhclient-up-hooks脚本和所有脚本   /etc/dhcp/dhclient-exit-hooks.d/目录。

ETCDIR="/etc/dhcp"

193 exit_with_hooks() {
194     exit_status="${1}"
195 
196     if [ -x ${ETCDIR}/dhclient-exit-hooks ]; then
197         . ${ETCDIR}/dhclient-exit-hooks
198     fi
199 
200     if [ -d ${ETCDIR}/dhclient-exit-hooks.d ]; then
201         for f in ${ETCDIR}/dhclient-exit-hooks.d/*.sh ; do
202             if [ -x ${f} ]; then
203                 . ${f}204             fi
205         done
206     fi
207     
208     exit ${exit_status}209 }
     

因此,为了修改Linux VM的主机名,您可以   创建一个扩展名为.sh的自定义脚本并将其放入   /etc/dhcp/dhclient-exit-hooks.d/目录。如果这个目录没有   存在,你可以创建它。自定义脚本的内容将是:

hostname YourFQDN.sh

&GT;

  

请务必使这个新的.sh文件可执行:

 chmod +x YourFQDN.sh

资料来源:(https://groups.google.com/d/msg/gce-discussion/olG_nXZ-Jaw/Y9HMl4mlBwAJ

答案 6 :(得分:1)

我不确定我理解阿德里安的答案。这似乎过于复杂,因为你必须为每次启动运行一个脚本,为什么不只是使用主机名?

vi /etc/rc.local

添加:

hostname your_hostname

就是这样。经过测试和工作。无需摆弄元数据等。

答案 7 :(得分:1)

非cron /元数据/脚本解决方案。

编辑/etc/dhclient-(network-interface).conf或创建一个,如果它不存在。

示例:

sudo nano /etc/dhclient-eth0.conf

然后添加以下行,在双引号之间替换所需的FQDN:

supersede host-name "hostname.domain-name";

重新启动和主机名之间以及主机名-f 之间保持不变。

答案 8 :(得分:1)

我很幸运能够在运行CentOS的GCE上设置主机名。 资料来源:desantolo.com

  1. 点击您实例上的“编辑”
  2. 转到“自定义元数据”部分
  3. 添加hostname + your.hostname.tld(将“your.hostname.tld”更改为您的实际主机名
  4. 运行curl --silent "http://metadata.google.internal/computeMetadata/v1/instance/attributes/hostname" -H "Metadata-Flavor: Google"
  5. 运行sudo env EDITOR=nano crontab -e以编辑crontab
  6. 添加行@reboot hostname $(curl --silent "http://metadata.google.internal/computeMetadata/v1/instance/attributes/hostname" -H "Metadata-Flavor: Google")
  7. 在键盘上Ctrl + X
  8. 在键盘上点击Y
  9. 在键盘上点击Enter
  10. 运行reboot
  11. 系统重启后,运行hostname并查看是否已应用更改
  12. 祝你好运!

答案 9 :(得分:1)

在Debian上测试。

dhclient使用DHCP设置主机名

您可以通过在/etc/dhcp/dhclient-exit-hooks.d/custom_set_hostname中创建一个自定义挂钩脚本来覆盖此操作,该脚本将从/etc/hostname读取主机名:

if [ -f "/etc/hostname" ]; then
    new_host_name=$(cat /etc/hostname)
fi

脚本必须具有执行权限。

设置new_host_name变量并且不直接调用hostname命令非常重要,因为对hostname命令的任何调用都将被另一个钩子或{{ 1}}使用此变量

答案 10 :(得分:0)

在我的CentOS虚拟机中,我发现由/etc/dhcp/dhclient.d/google_hostname.sh RPM安装的脚本google-compute-engine实际上更改了主机名。当实例在引导期间获取其IP地址时会发生这种情况。

虽然这不是我真正想要的长期解决方案,但现在我只是删除了这个脚本。我在hostnamectl设置的主机名现在在重新启动后仍然存在。

该脚本可能与Debian / Ubuntu VM完全相同,但我当然不会运行任何这些脚本。

答案 11 :(得分:0)

创建VM时,可以将自定义FQDN主机名指定为可选参数。此功能当前处于Beta中。

$ gcloud beta compute instances create INSTANCE_NAME --hostname example.hostname

这应可在所有OS上使用,并避免需要变通方法脚本。 在docs中有更多信息。

-Sirui(Google Compute Engine产品经理)

答案 12 :(得分:0)

有一些技巧可以像我一样实现。只要做:

sudo chattr +i /etc/hosts

此命令实际上使文件“(i)可变”,这意味着即使root也不能更改它(当然,除非root首先做chattr -i / etc / hosts)。

如上所述,您可以使用sudo chattr -i / etc / hosts取消此操作

加油!

答案 13 :(得分:0)

解决此问题的一种简单方法是使用自定义元数据设置启动脚本。

Key :startup-script 
Value: 
#! /bin/bash 
hostname <desired hostname>