【问题标题】:Google Compute Engine: how to set hostname permanently?Google Compute Engine:如何永久设置主机名?
【发布时间】:2020-12-08 13:06:11
【问题描述】:

如何在 GCE 中永久设置实例的主机名?我可以通过主机名设置它,但重启后它又消失了。

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

有人有想法吗?

【问题讨论】:

    标签: google-compute-engine


    【解决方案1】:

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

    我已将主机名存储在实例元数据中,然后在每次系统重新启动时检索它,以便使用 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")
    

    完成这些步骤后,每次重新启动实例时,它的主机名都将是 &lt;new_hostname&gt;。 您可以在提示符中或使用命令进行检查:hostname

    【讨论】:

    • 似乎是一个可行的解决方案。但我建议不要更改主机名,因为没有必要。所有外部出现的主机名都可以/应该在各自的应用程序中设置。
    • 很好的解决方案@Adrián,谢谢!但对我不起作用。似乎google在cron守护进程启动后设置了主机名......
    • 受此解决方案的启发,我编写了一个补丁程序,以防止您的主机名被 Google 覆盖。 stackoverflow.com/a/38344684/1325832
    • 这对我不起作用 - 这里的另一个解决方案是:stackoverflow.com/a/53607475/8177355
    【解决方案2】:

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

    rm -rf /etc/dhcp/dhclient.d/google_hostname.sh
    rm -rf /etc/dhcp/dhclient-exit-hooks.d/google_set_hostname
    

    【讨论】:

    • 这只是解决问题
    • 正是我想要的。
    【解决方案3】:

    编辑 rc.local

    sudo nano /etc/rc.local 
    

    在其余部分添加您的行:

    hostname *your.hostname.com*
    

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

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

    重新启动,然后获利。

    【讨论】:

    • 这不起作用 - 主机名在那台机器之外是不可解析的。
    • 设置主机名仅用于本地;更改 DNS 是一个不同的问题。
    【解决方案4】:

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

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

    【讨论】:

    • 我不介意在启动时使用脚本来设置主机名。但是不知道,如何将元数据填写到哪个脚本。
    • 您可以访问developers.google.com/compute/docs/howtos/startupscript 获取有关“启动脚本”的文章。我还将更新我的答案以包含此信息。这样它将在每次启动时运行。当您指定要运行的脚本时,您可以使用本地文件、来自 Google Cloud Storage 的文件或 URL。您可以访问developers.google.com/compute/docs/…,了解如何更新实例的元数据以应用启动脚本。
    【解决方案5】:

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

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

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

    $ hostname instance-name
    

    【讨论】:

      【解决方案6】:

      我很幸运能够在运行 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 并查看您的更改是否已应用

      祝你好运!

      【讨论】:

        【解决方案7】:

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

        事实上,一些 Linux 发行版,如 CentOS 和 Debian 使用 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 的 ously。 /etc/dhcp/dhclient-exit-hooks 脚本可以修改 exit_status 更改 dhclient-script 的退出状态。

        话虽如此,通过查看代码 sn-p 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
        

        >

        确保使这个新的 .sh 文件可执行:

         chmod +x YourFQDN.sh
        

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

        【讨论】:

          【解决方案8】:

          我不确定我是否理解 Adrián 的回答。这似乎过于复杂,因为您必须在每次启动时运行一个脚本,为什么不只使用主机名?

          vi /etc/rc.local

          添加:

          主机名 your_hostname

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

          【讨论】:

          • 当您想通过更改实例的元数据来更改主机名时,我认为 Adrián 的解决方案很好。您可以克隆服务器,更改元数据,它会工作。否则需要登录服务器、编辑文件、更改主机名等。
          • 也许这会对某人有所帮助;这不可行的原因是因为 GCE 每次重新启动都会重置主机名,除非使用上述解决方案之一。 (脚本,cron)
          【解决方案9】:

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

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

          例子:

          sudo nano /etc/dhclient-eth0.conf
          

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

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

          在重新启动之间持续存在,hostnamehostname -f 按预期工作。

          【讨论】:

          • 在 Centos7 中工作,但如果添加“something.com”,那么主机名上只会显示一些内容,期间正在跳过
          • 这是预期的行为,要显示 something.com,主机名命令需要“-f”参数,如:hostname -f
          【解决方案10】:

          在 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 命令的任何调用都将被另一个挂钩或使用此变量的dhclient-script 覆盖

          【讨论】:

            【解决方案11】:

            创建 VM 时,您可以将自定义 FQDN 主机名指定为可选参数。此功能目前处于测试阶段。

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

            这应该可以跨操作系统工作,并且不需要变通脚本。 更多信息在docs

            -- 思锐(谷歌计算引擎产品经理)

            【讨论】:

              【解决方案12】:

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

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

              该脚本很可能在 Debian/Ubuntu 虚拟机中位于完全相同的位置,但我当然不会运行其中任何一个。

              【讨论】:

                【解决方案13】:

                您可以像我一样做一些技巧来实现这一点。做吧:

                sudo chattr +i /etc/hosts
                

                此命令实际上使文件“(i)mmutable”,这意味着即使 root 也无法更改它(当然,除非 root 首先执行 chattr -i /etc/hosts)。

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

                加油!

                【讨论】:

                  【解决方案14】:

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

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

                  【讨论】:

                    猜你喜欢
                    • 1970-01-01
                    • 2020-10-18
                    • 1970-01-01
                    • 2015-01-10
                    • 1970-01-01
                    • 2017-01-14
                    • 2020-09-23
                    • 1970-01-01
                    • 1970-01-01
                    相关资源
                    最近更新 更多