Kickstart Rocky Linux 9
Kickstart (Rocky Linux 9)
Kickstart automatisiert die Installation vollständig: einmal eine ks.cfg schreiben, ISO booten, fertig installiertes System zurückbekommen – ohne eine einzige Eingabe. Als Paketquelle dient der lokale Spiegel; derselbe Apache liefert auch die ks.cfg aus. Der Abschluss ist die Übergabe an Ansible.
ℹ️ Hinweis: Bezieht sich auf Rocky Linux 9. Die hier gezeigte positionale mkksiso-Syntax ist die, die mit der lorax-Version aus Rocky 9 funktioniert.
⛔ Warnung: Eine Kickstart-Installation fragt nichts nach und löscht die Platte ohne Rückfrage. Niemals auf einem System booten, dessen Daten erhalten bleiben sollen.
Vorlage und Werkzeuge
Jede manuelle Installation legt unter /root/anaconda-ks.cfg eine fertige Kickstart-Datei ab – das ist der beste Startpunkt. Zum Prüfen dient ksvalidator aus pykickstart.
- Werkzeuge installieren
dnf install -y pykickstart lorax
ℹ️ Hinweis: system-config-kickstart (das alte GUI-Werkzeug) ist seit EL8 entfernt. Die Datei wird per Editor gepflegt und mit ksvalidator geprüft.
Passwort-Hashes erzeugen
Klartext-Passwörter gehören nicht in die ks.cfg. SHA-512-Hash erzeugen und in die Datei eintragen:
openssl passwd -6
# Passwort eingeben -> Ausgabe beginnt mit $6$ ... -> in die ks.cfg kopieren
Die vollständige ks.cfg
Datei node2XX.ks – lauffähig, Hostname/IP/Hashes/SSH-Key an die Gruppe anpassen (2XX):
# Rocky Linux 9 - Kickstart (Lab) text eula --agreed firstboot --disable reboot # Sprache / Tastatur / Zeit lang de_DE.UTF-8 keyboard --vckeymap=de --xlayouts='de' timezone Europe/Berlin --utc # Installationsquelle: lokaler Spiegel url --url="http://repo.it2XX.lab/repo/rocky/9/baseos/" repo --name="appstream" --baseurl="http://repo.it2XX.lab/repo/rocky/9/appstream/" repo --name="extras" --baseurl="http://repo.it2XX.lab/repo/rocky/9/extras/" # Netzwerk network --bootproto=dhcp --device=link --activate --onboot=yes network --hostname=node2XX.it2XX.lab # Anmeldedaten (Hashes mit: openssl passwd -6) rootpw --iscrypted $6$ERSETZEN$ERSETZENERSETZENERSETZENERSETZENERSETZENERSETZENERSETZEN user --name=ansible --groups=wheel --iscrypted --password=$6$ERSETZEN$ERSETZENERSETZENERSETZENERSETZENERSETZENERSETZENERSETZEN # Bootloader / Partitionierung bootloader --location=mbr --boot-drive=sda clearpart --all --initlabel --drives=sda autopart --type=lvm # Sicherheit / Dienste selinux --enforcing firewall --enabled --service=ssh services --enabled=sshd,chronyd %packages @^minimal-environment openssh-server chrony vim-enhanced python3 %end %post --log=/root/ks-post.log # 1) Lokales Repo dauerhaft eintragen, Standard-Repos deaktivieren cat > /etc/yum.repos.d/local.repo <<'REPO' [baseos-local] name=Rocky 9 - BaseOS (Lokaler Spiegel) baseurl=http://repo.it2XX.lab/repo/rocky/9/baseos/ enabled=1 gpgcheck=1 gpgkey=http://repo.it2XX.lab/repo/RPM-GPG-KEY-Rocky-9 [appstream-local] name=Rocky 9 - AppStream (Lokaler Spiegel) baseurl=http://repo.it2XX.lab/repo/rocky/9/appstream/ enabled=1 gpgcheck=1 gpgkey=http://repo.it2XX.lab/repo/RPM-GPG-KEY-Rocky-9 [extras-local] name=Rocky 9 - Extras (Lokaler Spiegel) baseurl=http://repo.it2XX.lab/repo/rocky/9/extras/ enabled=1 gpgcheck=1 gpgkey=http://repo.it2XX.lab/repo/RPM-GPG-KEY-Rocky-9 REPO dnf config-manager --set-disabled baseos appstream extras crb 2>/dev/null || true # 2) SSH-Key des Ansible-Control-Nodes hinterlegen install -d -m 0700 -o ansible -g ansible /home/ansible/.ssh cat > /home/ansible/.ssh/authorized_keys <<'KEY' ssh-ed25519 AAAAC3Nza...ERSETZEN... ansible@control KEY chown ansible:ansible /home/ansible/.ssh/authorized_keys chmod 0600 /home/ansible/.ssh/authorized_keys # 3) Passwortloses sudo fuer Ansible echo 'ansible ALL=(ALL) NOPASSWD: ALL' > /etc/sudoers.d/ansible chmod 0440 /etc/sudoers.d/ansible %end
⚠️ Achtung: Die beiden $6$ERSETZEN...-Hashes und der SSH-Key sind Platzhalter. Ohne echte Werte schlägt die Anmeldung fehl bzw. der Ansible-Zugriff funktioniert nicht.
Validieren
ksvalidator node2XX.ks
Keine Ausgabe = Syntax in Ordnung.
Variante 1: ks.cfg per HTTP (ohne ISO-Umbau)
Die Kickstart-Datei auf denselben Apache legen, der das Repo ausliefert:
mkdir -p /var/www/html/ks
cp node2XX.ks /var/www/html/ks/
restorecon -Rv /var/www/html/ks
Beim Booten des Installations-ISO im Boot-Menü Tab (BIOS) bzw. e (UEFI/GRUB) drücken und an die Kernel-Zeile anhängen:
inst.ks=http://repo.it2XX.lab/ks/node2XX.ks
Variante 2: ISO mit eingebetteter ks.cfg (mkksiso) – für VirtualBox
Für die Kurs-Auslieferung ist das der saubere Weg: kein PXE, kein manuelles Eintippen am Bootprompt. mkksiso (aus lorax) injiziert die ks.cfg direkt ins Boot-ISO und ergänzt automatisch inst.ks= in der Kernel-Kommandozeile. Die VM läuft vollautomatisch durch.
- ISO bauen (Rocky 9 – positionale Form)
sudo mkksiso node2XX.ks Rocky-9.x-x86_64-boot.iso Rocky-9-node2XX.iso
ℹ️ Hinweis: Neuere lorax-Versionen (38.4+) nutzen stattdessen mkksiso --ks node2XX.ks INPUT.iso OUTPUT.iso. Auf Rocky 9 ist die positionale Form ohne Flag die richtige.
ℹ️ Hinweis: Das boot.iso (Netz-Installation) reicht, weil die Pakete vom lokalen Spiegel kommen. Das vollständige DVD-ISO funktioniert ebenso, ist aber größer.
Das erzeugte Rocky-9-node2XX.iso in VirtualBox als Boot-Medium einhängen – die Installation startet ohne Rückfrage und rebootet am Ende ins fertige System.
Übergabe an Ansible
Der %post-Block oben ist die Brücke zu Ansible: er legt den ansible-User in der Gruppe wheel an, hinterlegt den SSH-Key des Control-Nodes und richtet passwortloses sudo ein. Damit ist das frisch installierte System sofort per Ansible erreichbar:
# Vom Control-Node aus
ansible -i node2XX.it2XX.lab, all -u ansible -b -m ping
Kickstart provisioniert also das nackte System, Ansible übernimmt ab da die Konfiguration – saubere Arbeitsteilung, kein Overlap.
ℹ️ Hinweis: Optional lässt sich am Ende des %post ein ansible-pull einhängen, wenn das System sich direkt nach der Installation selbst konfigurieren soll.
Test und Fehlersuche
| Symptom | Ursache / Lösung |
|---|---|
| Installer landet im interaktiven Menü | inst.ks= nicht gesetzt oder ks.cfg per HTTP nicht erreichbar → URL und Apache prüfen
|
Error setting up base repository |
url/repo zeigen ins Leere → lokalen Spiegel und Netzwerk im Installer prüfen
|
Installation bricht bei %packages ab |
Gruppe/Paket nicht im Spiegel → fehlt z. B. AppStream-Repo, oder --downloadcomps beim reposync vergessen
|
| Login schlägt fehl | Platzhalter-Hash nicht ersetzt → openssl passwd -6
|
| Ansible-Ping scheitert | SSH-Key/sudo im %post nicht korrekt → /root/ks-post.log auf dem Zielsystem auswerten
|
ℹ️ Hinweis: {{{1}}}