Установить имя хоста с помощью 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 user-data

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 и установить его вручную (позже), но результат тот же: виртуальная машина была зарегистрирована как ubuntu вместо нового имени хоста.

1
задан 6 June 2019 в 23:37
1 ответ

После некоторых головных болей я понял, что проблема была решена путем перезагрузки виртуальной машины:

power_state:
  delay: now
  mode: reboot
  message: Reboot to apply new hostname
  timeout: 10

Это работает, но конфликтует с моей обработкой Ansible после создания машины. И это тоже все задерживает. Кроме того, я хочу понять , почему возникает такое поведение. Поскольку перезагрузка работает, я предположил проблему синхронизации вместо systemd : DHCP получил имя хоста по умолчанию ubuntu , прежде чем cloudinit смог его применить. Тогда он не будет обновляться автоматически. Может, при следующей аренде, но мне нужно мгновенное решение.

Нашел статью, в которой объясняется, как принудительно разблокировать , и это работало вручную. Поэтому я заменил перезагрузку с помощью power_state выше на эти команды оболочки:

runcmd: 
  - dhclient -r
  - dhclient

Теперь DNS работает, как ожидалось, без перезагрузки всей машины:

root@k8sm:~# ping k8sm
PING k8sm.k8s.home (192.168.2.48) 56(84) bytes of data.
1
ответ дан 3 December 2019 в 23:04

Теги

Похожие вопросы