【发布时间】:2020-12-08 13:06:11
【问题描述】:
如何在 GCE 中永久设置实例的主机名?我可以通过主机名设置它,但重启后它又消失了。
我尝试输入元数据(主机名:f.q.d.n),但没有成功。但它应该通过元数据 (https://github.com/GoogleCloudPlatform/compute-image-packages/tree/master/google-startup-scripts) 工作。
有人有想法吗?
【问题讨论】:
如何在 GCE 中永久设置实例的主机名?我可以通过主机名设置它,但重启后它又消失了。
我尝试输入元数据(主机名:f.q.d.n),但没有成功。但它应该通过元数据 (https://github.com/GoogleCloudPlatform/compute-image-packages/tree/master/google-startup-scripts) 工作。
有人有想法吗?
【问题讨论】:
实现它的最简单方法是创建一个简单的脚本,这就是我所做的。
我已将主机名存储在实例元数据中,然后在每次系统重新启动时检索它,以便使用 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
【讨论】:
需要删除文件 /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
【讨论】:
编辑 rc.local
sudo nano /etc/rc.local
在其余部分添加您的行:
hostname *your.hostname.com*
确保在要执行的脚本之后运行以下命令
chmod +x /etc/rc.d/rc.local
重新启动,然后获利。
【讨论】:
这是不可能的。 Please take a look at this answer. 以下article 说明“主机名”是默认元数据条目的一部分,无法手动编辑任何默认元数据对。因此,每次系统重新启动时,您都需要使用脚本或其他方式更改主机名,否则每次重新启动时它都会自动与元数据服务器重新同步。
您可以在this article 中找到有关 GCE 启动脚本的信息。您可以visit this one 获取有关如何将脚本应用于实例的信息。
【讨论】:
您还可以创建一个简单的启动脚本来完成这些工作:
$ gcloud compute instances add-metadata <instance-name> --zone <instance-zone> --metadata startup-script='#! /bin/bash
hostname <hostname>'
请注意,如果您已经有一个启动脚本,则需要将命令添加到现有的启动脚本中,否则您将替换所有启动脚本:
$ hostname instance-name
【讨论】:
我很幸运能够在运行 CentOS 的 GCE 上设置主机名。 来源:desantolo.com
hostname + your.hostname.tld(将“your.hostname.tld”更改为您的实际主机名curl --silent "http://metadata.google.internal/computeMetadata/v1/instance/attributes/hostname" -H "Metadata-Flavor: Google"
sudo env EDITOR=nano crontab -e 编辑crontab@reboot hostname $(curl --silent "http://metadata.google.internal/computeMetadata/v1/instance/attributes/hostname" -H "Metadata-Flavor: Google")
Ctrl + X
Y
Enter
reboot
hostname 并查看您的更改是否已应用祝你好运!
【讨论】:
如果有人发现此解决方案不适用于 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)
【讨论】:
我不确定我是否理解 Adrián 的回答。这似乎过于复杂,因为您必须在每次启动时运行一个脚本,为什么不只使用主机名?
vi /etc/rc.local
添加:
主机名 your_hostname
就是这样。测试和工作。无需摆弄元数据等。
【讨论】:
非 cron/元数据/脚本解决方案。
编辑 /etc/dhclient-(network-interface).conf 或创建一个,如果它不存在。
例子:
sudo nano /etc/dhclient-eth0.conf
然后添加以下行,在双引号之间替换所需的 FQDN:
supersede host-name "hostname.domain-name";
在重新启动之间持续存在,hostname 和 hostname -f 按预期工作。
【讨论】:
hostname -f
在 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 覆盖
【讨论】:
创建 VM 时,您可以将自定义 FQDN 主机名指定为可选参数。此功能目前处于测试阶段。
$ gcloud beta compute instances create INSTANCE_NAME --hostname example.hostname
这应该可以跨操作系统工作,并且不需要变通脚本。 更多信息在docs。
-- 思锐(谷歌计算引擎产品经理)
【讨论】:
在我的 CentOS 虚拟机中,我发现由 google-compute-engine RPM 安装的脚本 /etc/dhcp/dhclient.d/google_hostname.sh 实际上更改了主机名。当实例在启动期间获取其 IP 地址时会发生这种情况。
虽然这不是我真正想要的长期解决方案,但现在我只是删除了这个脚本。我用hostnamectl 设置的主机名现在在重启后仍然存在。
该脚本很可能在 Debian/Ubuntu 虚拟机中位于完全相同的位置,但我当然不会运行其中任何一个。
【讨论】:
您可以像我一样做一些技巧来实现这一点。做吧:
sudo chattr +i /etc/hosts
此命令实际上使文件“(i)mmutable”,这意味着即使 root 也无法更改它(当然,除非 root 首先执行 chattr -i /etc/hosts)。
如上所述,您可以使用 sudo chattr -i /etc/hosts 撤消此操作
加油!
【讨论】:
解决此问题的一种简单方法是使用自定义元数据设置启动脚本。
Key :startup-script
Value:
#! /bin/bash
hostname <desired hostname>
【讨论】: