
Automatische Ubuntu Installation mit Autoinstall
Nebst „debian-installer preseeding“ gibt es seit Ubuntu 20.04 (Server) und Ubuntu 23.04 (Desktop) eine weitere Methode, Ubuntu Installationen zu automatisieren, nämlich Autoinstall.
Die Autoinstall-Methode setzt eine YAML-Datei voraus, in der sämtliche Fragen über die Konfiguration des zu installierenden Systems beantwortet werden, sodass die Installation ohne weiteren manuellen Eingriff vollautomatisch abläuft.
Wie sich eine solche Autoinstall-Installation auf einen USB-Datenträger oder einer DVD anwenden lässt, wird im folgenden Beitrag erklärt.
Vorbereitung der ISO-Datei
Zunächst wird ein USB-Datenträger wie gewohnt mit einem Ubuntu Image bespielt. Darauf zu achten ist jedoch, dass für die Installation der Server Variante mindestens 20.04 bzw. für die Desktop Variante 23.04 verwendet werden muss, da Autoinstall nur ab diesen Versionen funktioniert.
Im folgenden Beispiel verwende ich die Beta Version von Ubuntu 24.04 in der Desktop Variante.
Hinweis:
Mit den Daily/Nightly Build bin ich in Kombination mit der Autoinstall auf massive Probleme gestoßen, weswegen mindestens die Beta oder noch besser das offizielle Release, verwendet werden sollte.
Wenn wir die ISO direkt auf einen Datenträger schreiben würden, wäre dieser in aller Regel read-only, sodass wir leider nicht mehr die Möglichkeit haben, für Autoinstall benötigte Dateien anzulegen. Aus diesem Grund müssen wir das ISO zuvor modifizieren. Das gelingt am einfachsten mit dem grafischen Tool Cubic. Folgendermaßen lässt es sich über die PPA installieren:
sudo add-apt-repository ppa:cubic-wizard/release
sudo apt install --no-install-recommends cubic
Anschließend rufen wir es auf:

Im Startbildschirm wählen wir zunächst ein Verzeichnis für unser Projekt und klicken auf Next:

Dann wählen wir die ISO aus und klicken abermals auf Next:

Nachdem das ISO eingeladen wurde, landen wir in einer chroot-Umgebung von der aus wir noch das Live-System verändern könnten. Da dies nicht unser anliegen ist, klicken wir wieder direkt auf Next.

Als nächstes erscheinen am oberen Fensterrand 3 Tabs, bei denen wir zunächst auf Preseed klicken. Hier haben wir u.a. die Möglichkeit, neue Dateien und Ordner anzulegen. Also legen wir die Datei autoinstall.yaml an und klicken auf Create …

Nun haben wir die Möglichkeit, diese mit Inhalt zu befüllen. Hier legen wir all die gewünschten Parameter fest, die während der Installation automatisch getroffen werden sollen. Wichtig hierbei zu verstehen ist es, dass, falls ein eine Einstellung innerhalb der autoinstall.yaml nicht gesetzt ist, diese mit dem Standardwert konfiguriert wird.
Eine minimale autoinstall.yaml sähe folgendermaßen aus:
#cloud-config
autoinstall:
version: 1
identity:
hostname: ubuntu
username: local_admin
password: $5$DjjupaLnnu6dXfIb$SIWzHifKzo.SpQcmoirPu7FsAlL7a1WCCZNT1QNFHv6

Die erste einkommentierte Zeile ist notwendig, da sie die autoinstall.yaml einleitet. Dann folgt ein autoinstall:, die eingerückte Version und die Sektion identity:, die den lokalen Administrator festlegt (hostname, username und password müssen hier mit den eigenen Werten entsprechend geändert werden).
Kleiner Tipp an dieser Stelle, ein gehashtes Passwort lässt sich mit dem Befehl …
echo GeheimesPasswort | mkpasswd -m sha-256 -s
… in der Kommandozeile erzeugen.
Da es sich um eine YAML-Datei handelt, ist die korrekte Einrückung essentiell für die korrekte Funktionsweise.
Nebst identity: gibt es natürlich noch zahlreiche weitere Sektionen die gesetzt werden können, um die Installation den eigenen Bedürfnissen anzupassen, wie etwa das Sprach- und Tastaturlayout, die Zeitzone, die Verwendung bestimmter Paket-Repositories usw. Auch ist es möglich, bestimmte Angaben erst während der Installation zu treffen, was mit interactive-sections: funktioniert.
Eine gut dokumentierte und vollständige Auflistung aller Möglichkeiten und Parameter findet sich auf dieser Seite:
https://canonical-subiquity.readthedocs-hosted.com/en/latest/reference/autoinstall-reference.html
Neben der autoinstall.yaml werden noch zwei weitere Dateien benötigt, nämlich die meta-data und die user-data. Diese 2 Dateien sind für den cloud-init-Dienst notwendig, der während der Installation mitläuft.

Die meta-data bleibt komplett leer, in die user-data hingegen füllen wir denselben Inhalt, wie in der autoinstall.yaml, d.h. user-data und autoinstall.yaml müssen inhaltlich deckungsgleich sein!
Damit der Bootloader Grub auch weiss, dass er mit Hilfe der autoinstall.yaml booten soll, modifizieren wir noch die grub.cfg und wechseln deshalb auf den Tab Boot. Hier sehen wir die jeweiligen Grub-Einträge, die während des Boot-Vorgangs auswählbar sind. Wir fügen hier einen weiteren Eintrag (oberhalb des ersten oder unterhalb des letzten „menuentry“) hinzu:
menuentry "Start Ubuntu Autoinstall" {
set gfxpayload=keep
linux /casper/vmlinuz autoinstall ds=nocloud\;seedfrom=/cdrom/preseed/ --- quiet splash
initrd /casper/initrd.gz
}

Alternativ lässt sich auch einer der bestehenden Einträge modifizieren. Wichtig ist hier lediglich, dass in der Zeile linux die Parameter autoinstall (für die Autoinstall-Initiierung) sowie ds=nocloud\;seedfrom=/ steht.
Wir klicken auf Next und erstellen das ISO mit einem Klick auf Generate.
Ist der Prozess durchgelaufen, beenden wir das Menü mit Close.

Im zuvor ausgewählten Projektordner befindet sich nun das modifizierte ISO:

Um die ISO auf einen USB-Stick oder eine DVD zu schreiben, eignen sich beispielsweise die Programme „Startmedienersteller“ bzw. „Startup Disk Creator“ (für USB-Sticks) oder „Brasero“ (für DVDs).
Installation mit der vorbereiteten ISO Datei
Nach erfolgtem Schreibprozess booten wir von dem neu erstellten Medium.

Vorsicht!
Ist kein Partitionierungsschema angegeben oder wurde das Partitionierungsschema nicht als Interaktiv deklariert, verwendet die Installation ein Standardlayout und löscht ungefragt bestehende Partitionen und somit Daten auf der Festplatte!
Der Installationsprozess sollte in etwas folgendermaßen starten und ohne weitere Eingaben durchlaufen:


Am Ende können wir uns dafür entscheiden, das Betriebssystem entweder noch weiterhin zu verwenden oder einen Neustart durchzuführen:

Nach erfolgtem Neustart landen wir in den Login-Bildschirm und sehen bereits den von uns definierten lokalen Administrator „local_admin“.

Das Betriebssystem wäre damit installiert!
Fazit
Die Autoinstall Methode ist eine stark skalierbare Art und Weise, Ubuntu-Systeme automatisch zu provisionieren. Zahlreiche Vorgaben ermöglichen es, die jeweilige Installation auf die eigenen Bedürfnisse anzupassen. Auch sind bei Bedarf interaktive Eingaben während der Installation festlegbar.
Als Manko sehe ich hier die recht stringente Formatierung der YAML-Datei, sowie die umständliche Einrichtung der notwendigen Dateien, die (sollte auch nur ein Parameter oder eine einzelne Datei nicht vorhanden sein) direkt in Fehlern mündet.
Bildquellen:
Bild von guaxipo auf Pixabay
Bild von OpenClipart-Vectors auf Pixabay
Moin! Vielen dank für den super Artikel! Das hat sehr geholfen!
Eine Anmerkung:
Im grub Eintrag, der als Text (zum Kopieren) steht, fehlt /cdrom/. Auf dem Bild ist es korrekt. Bei mir hat es ohne /cdrom/ nicht funktioniert:
linux /casper/vmlinuz autoinstall ds=nocloud\;seedfrom=/preseed/ — quiet splash
müsste
linux /casper/vmlinuz autoinstall ds=nocloud\;seedfrom=/cdrom/preseed/ — quiet splash
sein. Viele Grüße, Daniel
Hallo Daniel,
vielen Dank für dein Feedback!
Da hat sich wohl ein kleiner Fehler eingeschlichen. Habe es gleich mal korrigiert.
Beste Grüße
Hallo oder Moin!
Sehr coole Anleitung!
Ich möchte es gerne für die Installation für unsere Firmenlaptops nutzen.
Ich kenne es von der Packer Image Erstellung, dass da noch viel viel mehr geht.
Kann man nicht auch evtl. das Partionsschema und im Installprozess gleich Apps installieren?
Hab gerade auch mal geguckt, ob man die Ubuntu nicht sogar like GPO immer die gleichen Einstellungen übergibt, z. B. DNS,
Bin auf Landscape, Foreman und Puppet gestoßen.
Viele Grüße
André
Hallo Andre,
in der Tat hast du die Möglichkeit sowohl Partitionierungsschema als auch die Installation von Applikationen während der Autoinstall-Installation vorzunehmen (Link zur offiziellen Dokumentation):
https://canonical-subiquity.readthedocs-hosted.com/en/latest/reference/autoinstall-reference.html
Für die Installation zusätzlicher Pakete steht dir hierfür der Parameter ‚packages‘ zur Verfügung (beachte auf jedenfall die Einrückung):
autoinstall:
…
packages:
– openssh-server
– python3
Die Autoinstall-Partitionierung finde ich persönlich allerdings etwas holprig. Hierfür ist die Obersektion ’storage‘ zuständig. Da diese relativ komplex und für jedes Setup individuell ist, kann ich dir leider keine genauere Anweisung geben und muss dich leider auf die oben verlinkte Dokumentation verweisen.
Was jedoch in jedem Fall immer ganz gut funktioniert hat, ist die Ausführung eigener Kommandos. Du kannst am Ende der Datei ja mal folgendes einfügen:
autoinstall:
…
…
user-data:
rundcmd:
– apt -y install openssh-server
– echo …
– wget …
Mit dieser Methode lassen sich auch Skripte von anderswo herunterladen, ausführbar machen und direkt ausführen. Das verleiht der Autoinstall-Methode wesentlich mehr Tiefe und Anpassungsmöglichkeiten.
Es gibt auch noch den Parameter ‚late-commands‘ mit dem zeitgesteuert (d.h. diese Befehle werden am Ende der Autoinstall Routine ausgeführt) eigene Befehle ausgeführt werden. Den gab es bereits zu Zeiten der alten Preseed-Methode.
Und falls du ein Orchestrierungstool für Linux suchst welches dir vordefinierte Regeln GPO ähnlich auf den Maschinen umsetzt, kann ich dir Ansible ans Herz legen. Es ist Open-Source und darüber hinaus mit Foreman (als grafische Oberfläche) erweiterbar. Puppet ist auch ein prima Produkt, in der Handhabung allerdings etwas komplexer. Am Ende ist die Entscheidung, wie so oft, eine individuelle, da beide Programme unterschiedlich arbeiten. Falls du Interesse hast, kannst du dir gerne meine Beiträge zu den Themen ansehen:
Ansible:
https://derlinuxwikinger.de/ansible-teil-1-installation-und-einrichtung/
https://derlinuxwikinger.de/ansible-teil-2-foreman-als-gui/
Puppet:
https://derlinuxwikinger.de/puppet-teil-1-installation-und-einrichtung/
https://derlinuxwikinger.de/puppet-teil-2-inventarisierung-und-erstes-manifest/
Hoffe ich konnte dir ein wenig weiterhelfen.
viele Grüße,
Marian
Danke für die Anleitung. Eine kleine Korrektur:
Der menuentry-Eintrag im Bild ist korrekt, im zu kopierenden Text fehlt allerdings das „.gz“ hinter „initrd /casper/initrd“
Viele Grüße.
Besten Dank für den Hinweis.
Habe es soeben korrigiert.
viele Grüße