Назад | Перейти на главную страницу

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

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

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.