使用 cloudinit 为 dhcp 服务器设置主机名:Systemd 覆盖 cloudinit 主机名

使用 cloudinit 为 dhcp 服务器设置主机名:Systemd 覆盖 cloudinit 主机名

对于测试环境,我想使用 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.

相关内容