Skip to main content

Ubuntu 20.04/21.10

Теперь пришло время самого сложного - установка Ubuntu через cloud-init. Читать это конечно легко, но разобраться было непросто.

Подготовка

Для автоустановки понадобится 2 файла - meta-data и user-data. Все действо происходит в user-data, а в meta-data указываются метаданные установщика, но они нам не пригодятся, так как мы не в облаке. Только спустя долгие мучения понял, что нужно существование обоих файлов, даже учитывая, что у нас не облако.

В meta-data записываем следующую строку:

instance-id: test

Можно указать любое значение.

Настраиваем загрузчик

В /iso монтируем образ и указываем до него путь (url=), указываем путь до папки (s=) с cloud-init скриптами (meta-data/user-data)

label 6
  menu label ^Install Ubuntu
  kernel http://10.0.1.1/iso/casper/vmlinuz
  initrd http://10.0.1.1/iso/casper/initrd
  append url=http://10.0.1.1/ubuntu-21.10-live-server-amd64.iso autoinstall ds=nocloud-net;s=http://10.0.1.1/ cloud-config-url=/dev/null ip=:::::eth1:dhcp fsck.mode=skip net.ifnames=0 biosdevname=0 ---

Настраиваем автоматическую установку

$ cat user-data
#cloud-config
autoinstall:
  apt:
    geoip: true
    preserve_sources_list: false
    primary:
    - arches: [amd64, i386]
      uri: http://archive.ubuntu.com/ubuntu
  identity: {hostname: server, password: CRYPTED_PASS,
    realname: ubuntu, username: ubuntu}
  keyboard: {layout: us, toggle: null, variant: ''}
  locale: en_US.UTF-8
  network:
    ethernets:
      eth0: 
        critical: true
        addresses: [192.168.100.99/24]
        gateway4: 192.168.100.1
        nameservers:
          addresses: [8.8.8.8]
      eth1: {dhcp-identifier: mac, dhcp4: false}
    version: 2
  ssh: 
    allow-pw: true 
    authorized-keys: 
      - ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC3b.....
    install-server: true
  storage:
    config:
    - {ptable: gpt, path: /dev/sda, wipe: superblock-recursive,
      preserve: false, name: '', grub_device: true, type: disk, id: disk-sda}
    - {ptable: gpt, path: /dev/sdb, wipe: superblock-recursive,
      preserve: false, name: '', grub_device: false, type: disk, id: disk-sdb}

    - {device: disk-sda, size: 1048576, flag: bios_grub, number: 1, preserve: false,
      grub_device: false, type: partition, id: partition-sda-0}
    - {device: disk-sdb, size: 1048576, flag: bios_grub, number: 1, preserve: false,
      grub_device: false, type: partition, id: partition-sdb-0}

    - {device: disk-sda, size: 536870912, wipe: superblock, flag: '', number: 2, preserve: false,
      grub_device: false, type: partition, id: partition-sda-1}
    - {fstype: ext4, volume: partition-sda-1, preserve: false, type: format, id: format-sda-0}
    - {device: disk-sdb, size: 536870912, wipe: superblock, flag: '', number: 2, preserve: false,
      grub_device: false, type: partition, id: partition-sdb-1}
    - {fstype: ext4, volume: partition-sdb-1, preserve: false, type: format, id: format-sdb-0}

    - {device: disk-sda, size: -1, wipe: superblock, flag: '', number: 3,
      preserve: false, grub_device: false, type: partition, id: partition-sda-2}
    - {device: disk-sdb, size: -1, wipe: superblock, flag: '', number: 3,
      preserve: false, grub_device: false, type: partition, id: partition-sdb-2}

    - name: md0
      raidlevel: raid1
      devices: [partition-sda-2, partition-sdb-2]
      spare_devices: []
      preserve: false
      wipe: superblock-recursive
      ptable: gpt
      type: raid
      id: raid-0
    - {device: raid-0, size: -1, wipe: superblock, flag: '', number: 1, preserve: false,
      grub_device: false, type: partition, id: partition-root-md}
    - {fstype: ext4, volume: partition-root-md, preserve: false, type: format, id: format-1}

    - {path: /, device: format-1, type: mount, id: mount-1}
    - {path: /boot, device: format-sda-0, type: mount, id: mount-0}

  version: 1
  late-commands:
    - echo 'ubuntu ALL=(ALL) NOPASSWD:ALL' > /target/etc/sudoers.d/ubuntu
    - sed -ie 's/GRUB_CMDLINE_LINUX=.*/GRUB_CMDLINE_LINUX="net.ifnames=0 ipv6.disable=1 biosdevname=0"/' /target/etc/default/grub
    - curtin in-target --target /target update-grub2

Разметка должна быть именно такой. Т.е. чтобы RAID root был создан как 2 отдельных отдела, т.е. sda2 и sdb2. Если /dev/sda и /dev/sdb использовать как RAID устройства, то установка не пройдет. Если на одном диске создать /boot и рейд из раздела и диска, то работать не будет.

Additional

Логи лежат по пути /var/log/installer У скрипта автоустановки есть интересная опция phone_home - запрос по URL по окончанию установки. Можно сделать своеобразный хук. Также cloud-init умеет в chef/puppet.

SRC

Autoinstall - https://ubuntu.com/server/docs/install/autoinstall

PXE Boot - https://www.golinuxcloud.com/pxe-boot-server-cloud-init-ubuntu-20-04/#Step-4_Configure_PXE_Boot_Server