![使用 cloudinit 为 dhcp 服务器设置主机名:Systemd 覆盖 cloudinit 主机名](https://linux22.com/image/738777/%E4%BD%BF%E7%94%A8%20cloudinit%20%E4%B8%BA%20dhcp%20%E6%9C%8D%E5%8A%A1%E5%99%A8%E8%AE%BE%E7%BD%AE%E4%B8%BB%E6%9C%BA%E5%90%8D%EF%BC%9ASystemd%20%E8%A6%86%E7%9B%96%20cloudinit%20%E4%B8%BB%E6%9C%BA%E5%90%8D.png)
对于测试环境,我想使用 DHCP 连接多个虚拟机,并将其主机名作为 DNS 条目。故障排除显示我的 DNS/DHCP 正常工作。但虚拟机使用ubuntu
主机名而不是我自己的主机名进行注册(k8sm
在此示例中):
root@k8sm:~# ping k8sm -c1
PING k8sm (192.168.2.89) 56(84) bytes of data.
64 bytes from ubuntu.k8s.home (192.168.2.89): icmp_seq=1 ttl=64 time=0.019 ms
使用我的k8sm
主机名,尝试时没有得到 IP dig +short k8sm.k8s.home @192.168.2.2
(其中 .2.2 是我的 DNS 服务器)。
Cloudinit 用户数据
hostname: ${hostname}
fqdn: ${hostname}.k8s.home
它是从我的 Terraform 配置文件中调用的:
data "template_file" "k8sm-cloudinit-data" {
template = "${file("${path.module}/cloudinit/user-data.cfg")}"
vars = {
hostname = "k8sm"
}
}
根据日志
root@k8sm:~# grep hostname /var/log/syslog
Jun 6 19:17:09 k8sm systemd-resolved[604]: Using system hostname 'ubuntu'.
Jun 6 19:17:09 k8sm systemd-networkd[581]: Not connected to system bus, not setting hostname.
Jun 6 19:17:09 k8sm systemd-resolved[604]: System hostname changed to 'k8sm'.
Jun 6 19:17:09 k8sm kernel: [ 3.526063] systemd[1]: Set hostname to <ubuntu>.
Jun 6 19:17:09 k8sm dbus-daemon[781]: [system] Activating via systemd: service name='org.freedesktop.hostname1' unit='dbus-org.freedesktop.hostname1.service' requested by ':1.0' (uid=100 pid=581 comm="/lib/systemd/systemd-networkd " label="unconfined")
Jun 6 19:17:09 k8sm dbus-daemon[781]: [system] Successfully activated service 'org.freedesktop.hostname1'
Jun 6 19:17:09 k8sm systemd-hostnamed[844]: Changed host name to 'ubuntu'
似乎我的k8sm
主机名已应用,但被 systemd 覆盖。为什么会发生这种情况?需要做什么才能正确设置 DHCP 的主机名?目标是到达k8sm.k8s.home
本例中使用的机器。
hostnamectl
显示虚拟机中正确的主机名
root@k8sm:~# hostnamectl status
Static hostname: k8sm.k8s.home
Icon name: computer-vm
Chassis: vm
Machine ID: 001637a6a5e0410f923cb082af1953d2
Boot ID: 853577fa58844d8e900c107cfb0c1dde
Virtualization: kvm
Operating System: Ubuntu 18.04.2 LTS
Kernel: Linux 4.15.0-50-generic
Architecture: x86-64
主机和虚拟机均运行 18.04 LTS 和 KVM 2.11.1。
我尝试的另一种方法
preserve_hostname: true
runcmd:
- hostnamectl set-hostname k8sm
- hostnamectl set-hostname k8sm --static
想法是跳过 cloudinits 主机名设置preserve_hostname
并手动设置它(稍后),但结果是一样的:VM 被注册为其ubuntu
新主机名。
答案1
经过一番头痛之后,我意识到通过重新启动虚拟机可以解决问题:
power_state:
delay: now
mode: reboot
message: Reboot to apply new hostname
timeout: 10
这是可行的,但与创建机器后执行的 Ansible 配置相冲突。而且它还会延迟一切。此外,我想了解为什么出现此行为。由于重新启动有效,我假设是时间问题而不是systemd
:DHCP 在 cloudinit 可以应用它之前获得了默认ubuntu
主机名。那么它不会自动更新。也许在下一个租约中,但我想要一个即时解决方案。
成立一篇解释如何强制发布的文章power_state
并且手动操作成功了。因此我用以下 shell 命令替换了上面的重启:
runcmd:
- dhclient -r
- dhclient
现在 DNS 可以按预期工作,而无需重新启动整个机器:
root@k8sm:~# ping k8sm
PING k8sm.k8s.home (192.168.2.48) 56(84) bytes of data.