Funktionierende Lösung zur Installation von Ubuntu 22.04 über iPXE mit cloud-init, subiquity, auto-install, curtin

Ich entschuldige mich vorab für den folgenden polemischen Beitrag. Aber was Canonical da abgeliefert hat ist ehrlichgesagt eine einzige Katastrophe. Seit 22.04 gibt es den Legacy-Debian-Installer nicht mehr, welcher bei 20.04 noch verfügbar war. Möchte man sauber Hosts über PXE komissionieren, ist bei Ubuntu nun cloud-init, subiquity, auto-install oder wie auch immer sie den Unsinn nennen, angesagt. Hauptsache die Buzzword-Quote stimmt, Funktionalität ist nunmehr nebensächlich. „Cloud-init is the industry standard multi-distribution method for cross-platform cloud instance initialization“…

Die neue YAML-Syntax sollte Verbesserungen bringen, aber das Chaos ist dadurch nur noch größer. root-User lassen sich im „identity“ Dictionary nicht anlegen, automatische Updates im Installationsprozess lassen sich nur mit einem Hack abstellen, die Referenzierung auf user-data und user-meta Files ist völlig undurchdacht, die YAML-Files erfordern nicht-YAML-konforme Syntax um zu funktionieren (wer hat sich die bescheuerte Erfordernis von „#cloud-config“ in der ersten Zeile der user-data YAML ausgedacht?), der Installationsprozess wird ewig in die Länge gezogen, ISO-Images sind zusätzlich zum Kernel und der Initramdisk nun auch bei Installation nötig und als wäre das nicht genug, werden diese in der Standardkonfiguration auch noch doppelt geladen (2×1,3GB) sodass eine Installation mindestens 3GB RAM erfordert, mit Hack dann 2GB. Schöne neue Welt.

Versteht mich bitte nicht falsch, der Debian-Installer hatte auch seine Macken, die Partitionierung war katastrophal, aber über die Jahre hat man sich eben irgendwie arrangiert und konnte von Release zu Release mit leichten Anpassungen springen.

Auto-Install reißt das alles ein um dann alles wieder gleichermaßen beschissen und schlecht dokumentiert wieder aufzubauen. Wofür bitte?

Sei es drum, trotz der schlechten Dokumentation und ohne Präzedenzfall habe ich es mit Hilfe geschafft, ein user-data YAML sowie einen beispielhaften Eintrag in der menu.ipxe zu schaffen, um Ubuntu 22.04 sauber mithilfe von iPXE installieren zu können. Sollte das Beispiel bei euch nicht funktionieren, meldet euch bitte in den Kommentaren.

Für weitere Informationen könnt ihr die Dokumentation von Molnar Peter konsultieren. Meine Beispiele stellen insofern eine Erweiterung der seinen dar, als das es hier konkret um iPXE geht und mein user-data YAML auf meine Bedürfnisse angepasst wurde.

user-data YAML

#cloud-config
autoinstall:
  version: 1
  locale: en_US.UTF-8
  timezone: Europe/Berlin
  network:
    version: 2
    renderer: networkd
    ethernets:
      ens192:
        dhcp4: true
  proxy: http://mein-deb-proxy:3128/
  apt:
    sources:
      saltstack.list:
        source: deb http://repo.saltstack.com/py3/ubuntu/20.04/amd64/3004 focal main
        key: |
          -----BEGIN PGP PUBLIC KEY BLOCK-----
          Version: GnuPG v2

          mQENBFOpvpgBCADkP656H41i8fpplEEB8IeLhugyC2rTEwwSclb8tQNYtUiGdna9
          m38kb0OS2DDrEdtdQb2hWCnswxaAkUunb2qq18vd3dBvlnI+C4/xu5ksZZkRj+fW
          tArNR18V+2jkwcG26m8AxIrT+m4M6/bgnSfHTBtT5adNfVcTHqiT1JtCbQcXmwVw
          WbqS6v/LhcsBE//SHne4uBCK/GHxZHhQ5jz5h+3vWeV4gvxS3Xu6v1IlIpLDwUts
          kT1DumfynYnnZmWTGc6SYyIFXTPJLtnoWDb9OBdWgZxXfHEcBsKGha+bXO+m2tHA
          gNneN9i5f8oNxo5njrL8jkCckOpNpng18BKXABEBAAG0MlNhbHRTdGFjayBQYWNr
          YWdpbmcgVGVhbSA8cGFja2FnaW5nQHNhbHRzdGFjay5jb20+iQE4BBMBAgAiBQJT
          qb6YAhsDBgsJCAcDAgYVCAIJCgsEFgIDAQIeAQIXgAAKCRAOCKFJ3le/vhkqB/0Q
          WzELZf4d87WApzolLG+zpsJKtt/ueXL1W1KA7JILhXB1uyvVORt8uA9FjmE083o1
          yE66wCya7V8hjNn2lkLXboOUd1UTErlRg1GYbIt++VPscTxHxwpjDGxDB1/fiX2o
          nK5SEpuj4IeIPJVE/uLNAwZyfX8DArLVJ5h8lknwiHlQLGlnOu9ulEAejwAKt9CU
          4oYTszYM4xrbtjB/fR+mPnYh2fBoQO4d/NQiejIEyd9IEEMd/03AJQBuMux62tjA
          /NwvQ9eqNgLw9NisFNHRWtP4jhAOsshv1WW+zPzu3ozoO+lLHixUIz7fqRk38q8Q
          9oNR31KvrkSNrFbA3D89uQENBFOpvpgBCADJ79iH10AfAfpTBEQwa6vzUI3Eltqb
          9aZ0xbZV8V/8pnuU7rqM7Z+nJgldibFk4gFG2bHCG1C5aEH/FmcOMvTKDhJSFQUx
          uhgxttMArXm2c22OSy1hpsnVG68G32Nag/QFEJ++3hNnbyGZpHnPiYgej3FrerQJ
          zv456wIsxRDMvJ1NZQB3twoCqwapC6FJE2hukSdWB5yCYpWlZJXBKzlYz/gwD/Fr
          GL578WrLhKw3UvnJmlpqQaDKwmV2s7MsoZogC6wkHE92kGPG2GmoRD3ALjmCvN1E
          PsIsQGnwpcXsRpYVCoW7e2nW4wUf7IkFZ94yOCmUq6WreWI4NggRcFC5ABEBAAGJ
          AR8EGAECAAkFAlOpvpgCGwwACgkQDgihSd5Xv74/NggA08kEdBkiWWwJZUZEy7cK
          WWcgjnRuOHd4rPeT+vQbOWGu6x4bxuVf9aTiYkf7ZjVF2lPn97EXOEGFWPZeZbH4
          vdRFH9jMtP+rrLt6+3c9j0M8SIJYwBL1+CNpEC/BuHj/Ra/cmnG5ZNhYebm76h5f
          T9iPW9fFww36FzFka4VPlvA4oB7ebBtquFg3sdQNU/MmTVV4jPFWXxh4oRDDR+8N
          1bcPnbB11b5ary99F/mqr7RgQ+YFF0uKRE3SKa7a+6cIuHEZ7Za+zhPaQlzAOZlx
          fuBmScum8uQTrEF5+Um5zkwC7EXTdH1co/+/V/fpOtxIg4XO4kcugZefVm5ERfVS
          MA==
          =dtMN
          -----END PGP PUBLIC KEY BLOCK-----

  storage:
    swap:
      size: 4G
    config:
      # Physical disk
      - type: disk
        id: drive-0
        ptable: gpt
        wipe: superblock-recursive
        preserve: false
        name: ''
        grub_device: false

      # EFI partition
      - type: partition             # EFI partition /boot/efi
        number: 1
        id: partition-0
        device: drive-0
        size: 256M
        flag: boot
        grub_device: true
      - type: format                # EFI partition format rules
        id: format-0
        volume: partition-0
        fstype: fat32
        label: ESP
      - path: /boot/efi             # EFI partition mount rules
        device: format-0
        type: mount
        id: mount-efi

      # LVM PV
      - type: partition             # LVM partition (PV)
        number: 2
        id: pv-0
        device: drive-0
        size: -1
        grub_device: false

      # LVM VG
      - name: VG                # LVM VG (system)
        devices: [ pv-0 ]
        preserve: false
        type: lvm_volgroup
        id: vg-0

      # LVM LV ROOT
      - name: ROOT               # LVM LV (root)
        volgroup: vg-0
        size: 8G
        wipe: superblock
        preserve: false
        type: lvm_partition
        id: lv-0
      - fstype: ext4                 # LVM LV root - format rules
        volume: lv-0
        preserve: false
        type: format
        id: format-root
      - path: /                     # LVM LV root - mount rules
        device: format-root
        type: mount
        id: mount-root

      # LVM LV VAR
      - name: VAR               # LVM LV (root)
        volgroup: vg-0
        size: 12G
        wipe: superblock
        preserve: false
        type: lvm_partition
        id: lv-1
      - fstype: ext4                 # LVM LV root - format rules
        volume: lv-1
        preserve: false
        type: format
        id: format-var
      - path: /var                     # LVM LV root - mount rules
        device: format-var
        type: mount
        id: mount-var

      # LVM LV DATA
      - name: DATA               # LVM LV (root)
        volgroup: vg-0
        size: -1
        wipe: superblock
        preserve: false
        type: lvm_partition
        id: lv-2
      - fstype: ext4                 # LVM LV root - format rules
        volume: lv-2
        preserve: false
        type: format
        id: format-data
      - path: /data                     # LVM LV root - mount rules
        device: format-data
        type: mount
        id: mount-data

  identity:
    hostname: testname
    username: setup
    password: "$6$.SAlxBpn2Ch0I$dPF3313pydThKpTXoHH/2aebmxilJVkPSMXtE8ZDG4rQTakd2VQTNZHKCVYRcPvzzCF3DX49hQr114jKYo7De."

  ssh:
    install-server: true
    allow-pw: true

  updates: all

  packages:
    - salt-minion
    - python3-mako
    - python3-psutil

  user-data:
    disable_root: false

  late-commands:
    - curtin in-target --target=/target -- sed -ie 's/GRUB_TIMEOUT=.\*/GRUB_TIMEOUT=5/' /etc/default/grub
    - curtin in-target --target=/target -- sed -i '/^#GRUB_TERMINAL/cGRUB_TERMINAL=console' /etc/default/grub
    - curtin in-target --target=/target -- sed -i '/^GRUB_CMDLINE_LINUX_DEFAULT/cGRUB_CMDLINE_LINUX_DEFAULT=""' /etc/default/grub
    - curtin in-target --target=/target -- update-grub

menu.ipxe

:jammy-autonet
kernel http://seedserver.local/ipxe/jammy/vmlinuz initrd=initrd ip=dhcp cloud-config-url=/dev/null url=http://seedserver.local/jammy-live-server-amd64.iso autoinstall ds=nocloud-net;s=http://seedserver.local/preseed/
initrd http://seedserver.local/ipxe/jammy/initrd

Wünsche maximale Erfolge!

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert