This page looks best with JavaScript enabled

Ubuntu Autoinstall

 ·  ☕ 3 min read  ·  🦉 admin

Introduction

The server installer for 20.04 supports a new mode of operation: automated installation, autoinstallation for short. You might also know this feature as unattended or handsoff or preseeded installation. Autoinstallation lets you answer all those configuration questions ahead of time with an autoinstall config and lets the installation process run without any interaction.

Providing the autoinstall config

The autoinstall config is provided via cloud-init configuration, which is almost endlessly flexible. Autoinstall requires the files user-data and meta-data.
According to my short experience, autoinstall is not as mature as cloud-init is. Other than that, its documentation is shallow that you may need to test or dig into the Internet to understand some of the features. Nevertless, I am still able to install basic VM fully networked and necessary repos to install Kubernetes componenets without any interaction.

Experiment

In this experiment, I am going to provision a VM (ubuntu20.04.2) for my Kubernetes Management and Worker nodes. So after basic installation, autoinstall disable the swap, enable some kernel parameters, enable repos to Install Kubernetes componenets.

Mount ISO to /mnt

First thing is to mount the Ubuntu iso to /mnt folder on the KVM host.

1
sudo mount -o loop ubuntu-20.04.2-live-server-amd64.iso /mnt/

Providing the autoinstall Config

As it is mentioned autoinstall is provided via cloud-init configuration. Because of that you must provide user-data and meta-data which will be served on very simple HTTP Server that when the VM boots it will fetch the configuration via HTTP GET Request.

user-data

Following user-data will be copied to /www folder.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
#cloud-config
autoinstall:
  version: 1
  early-commands:
    - systemctl stop ssh # otherwise packer tries to connect and exceed max attempts
  network:
    network:
      version: 2
      ethernets:
        eth0:
          addresses:
            - 10.5.100.23/24
          gateway4: 10.5.100.254
          nameservers: 
            search: [homelab.io]
            addresses: [8.8.8.8]
  apt:
    preserve_sources_list: false
    primary:
      - arches: [amd64]
        uri: "http://archive.ubuntu.com/ubuntu/"
  ssh:
    install-server: yes
    authorized-keys:
      - "your SSH pub key here"
    allow-pw: yes
  identity:
    hostname: ubuntu-00
    password: "$6$FhcddHFVZ7ABA4Gi$9l4yURWASWe8xEa1jzI0bacVLvhe3Yn4/G3AnU11K3X0yu/mICVRxfo6tZTB2noKljlIRzjkVZPocdf63MtzC0" # root
    username: ubuntu # root doesn't work
  packages:
    - apt-transport-https 
    - ca-certificates 
    - curl
  user-data:
    disable_root: false
  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 console=ttyS0,115200n8"/' /target/etc/default/grub
    - curtin in-target --target /target update-grub2
    - swapoff -a
    - sed -ie '/\/swap.img/s/^/#/g' /target/etc/fstab
    - curl -vo /target/usr/share/keyrings/kubernetes-archive-keyring.gpg https://packages.cloud.google.com/apt/doc/apt-key.gpg
    - |
      cat <<EOF |  tee /target/etc/modules-load.d/k8s.conf
      br_netfilter
      EOF      
    - |
      cat <<EOF | sudo tee /target/etc/sysctl.d/k8s.conf
      net.bridge.bridge-nf-call-ip6tables = 1
      net.bridge.bridge-nf-call-iptables = 1
      EOF      
    - sysctl --system
    - echo 'deb [signed-by=/usr/share/keyrings/kubernetes-archive-keyring.gpg] https://apt.kubernetes.io/ kubernetes-xenial main' | tee /target/etc/apt/sources.list.d/kubernetes.list

meta-data

meta-data file will be copied to the /www folder.

1
touch /www/meta-data

Start HTTP Server

To serving user-data and meta-data via http protocol, Python’s built-in SimpleHTTPServer module is used. HTTP server listening on port 3003.

mkdir /www
cd /www
# If Python version returned above is 3.X
python3 -m http.server 3003
# If Python version returned above is 2.X
python -m SimpleHTTPServer 3003

Create VM on KVM

To create a VM with virt-install following parameters provided. Some of the parameters differs based on your environment.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
#Static IP
#ip=<client-ip>:<server-ip>:<gw-ip>:<netmask>:<hostname>:<device>:<autoconf>:<dns0-ip>:<dns1-ip>:<ntp0-ip>
#For ubuntu net.ifnames=0 and biosdevname=0  for predictable NIC device name like eth0,eth1
virt-install \
--connect qemu:///system \
--name aiubuntu \
--os-variant ubuntu20.04 \
--os-type linux \
--ram 2048 \
--disk bus=virtio,pool=KVMs,size=15,format=qcow2 \
--network network=OVS0,model=virtio,virtualport_type=openvswitch,portgroup=VLAN100 \
--vcpus 2 \
--location '/home/tonyukuk/Downloads/ubuntu-20.04.2-live-server-amd64.iso',initrd=casper/initrd,kernel=casper/vmlinuz \
--extra-args='net.ifnames=0 biosdevname=0 ip=10.5.100.45::10.5.100.254:255.255.255.0:ubuntutest:eth0:none:10.5.100.253 autoinstall  ds=nocloud-net;s=http://10.5.100.10:3003/'
Share on

manintheit
WRITTEN BY
admin
IT Engineer