Open phish108 opened 3 years ago
? How can the ansible inventory be accessed and how can I work with it?
@bajkad Ein Ansible Inventory ist eine einfache Datei mit Hostnamen, wobei die Hostnamen nach Arten gruppiert sein können.
Diese Datei übergibt man als Dateinamen an Ansible. Über die Gruppen im Inventory kann man Aktionen auf bestimmte arten von Rechnern beschränken (z.B. nur Hypervisoren oder VMs im Kubernetes Netzwerk).
Beispiel hier gefunden. Dort sind auch Links zur offiziellen Doku.
Finale Lösung durch diese Diskussion inspiriert.
Beim Booten im Bootloader mit e
in den Editiermodus wechseln.
Das Ergebnis muss wie folgt aussehen:
setparams 'Ubuntu Server'
set gfxpayload=keep
linux /casper/vmlinuz quiet autoinstall "ds=nocloud-net;s=https://raw.githubusercontent.com/dxiai/multimico-cluster/main/hypervisor/" ---
initrd /casper/initrd
Anschliessend mit Crtl+x
den Editiermodus verlassen und den Installationsprozess lostreten.
Mit nocloud-net
können wir den autoinstall-Prozess mit einer Netzwerkdatei initialisieren, der die relevanten Dateien von der URL holt, die im s
-Parameter angegeben ist.
Zusätzlich gibt es noch die Parameter i
und h
, die den Hostnamen festlegen. Hierzu gibt es eine kurze Doku. Leider werden diese Optionen nicht vom Installer übernommen, sondern werden nur für DHCP-Einstellungen weitergereicht.
Die aktuelle Version der So können wir die Hardware einheitlich aufsetzen. Der Ubuntu-Installer verzeiht keine Fehler in der Konfiguration des Cloud-Init Installers. Gleichzeitig ist die Dokumentation nur spärlich.user-data
-Datei funktioniert nicht richtig und der Installer bricht unterwegs ab. Konnte noch nicht evaluieren was noch fehlt. Hier müssen wir noch die Doku wälzen.
Bei der Konfiguration gilt es darauf zu achten, dass der Installer nicht durch die neuste Version ersetzt wird. Wenn der neuste Installer genutzt wird, dann bricht der Installationsprozess regelmässig an verschiedenen Stellen ab.
Der Autoinstaller besteht aus zwei Teilen:
Beide Teile werden durch eine Neustart getrennt.
In der Konfiguration findet sich der zweite Teil im Abschnitt user-data
. Laut Dokumentation kann der Standardnutzer im Abschnitt identity
im ersten Teil oder wie in allen anderen Cloud-Init im Abschnitt users
definiert sind. Die Dokumentation stellt aber nicht fest, dass entweder der Abschnitt identity
oder der Abschnitt user-data.users
vorhanden sein darf. Sind beide Abschnitte vorhanden, initialisiert der Installer keine Nutzer. Weil user-data.users
wesentlich flexibler ist als der Abschnitt identity
ist, empfehle ich diese Variante.
Bei der Nutzerkonfiguration übernimmt der Installer nicht die Default Shell. Diese müssen wir explizit unter shell
angeben. Es ist übrigens möglich mehrere SSH Identitäten von Github zu importieren. Das folgende Beispiel zeigt das:
users:
- name: dxiai
passwd: "PASSWORDHASH"
shell: /bin/bash
ssh_import_id:
- gh:phish108
- gh:bajkad
groups:
- sudo
- lxd
- adm
- plugdev
- cdrom
lock_passwd: false
Beim Passwordhash muss das Format strikt eingehalten werden. Am Besten man erstellt das Passwort wie unter #3 beschrieben mit openssl passwd -6 $PASSWORD
. Dabei gilt zu beachten, dass openssl unter MacOS diesen Befehl nicht unterstützt. Am leichtesten geht das unter Linux oder mit einem Docker Container.
In den Abschnitt user-data
müssen zusätzliche Software-Packete im Abschnitt packages
festgelegt werden. Dieser Abschnitt darf theoretisch auch in Teil 1 stehen. In diesem Fall können aber nur Packete installiert werden, die auf dem Installationsmedium vorhanden sind. Damit die Installation funktioniert müssen ausserdem die beiden Optionen package_update
und package_upgrade
auf true
gesetzt werden. Update synchronisiert die externen APT Repositories, so dass wir alle Deb-Packete auswählen können. Ohne Update können wir keine zusätzliche Software (wie petname
) installieren. Upgrade stellt sicher, dass alle Packete aktualisiert und alle Sicherheitsupdates eingespielt sind. Ergänzend habe ich noch package_reboot_if_required
auf true
. Das hatte jedoch keinen Effekt.
Bei der Netzwerkkonfiguration gab es zusätzliche Punkte zu beachten. Die folgende Konfiguration ist eine funktionierende Einstellung für unsere Hardware und Installationen unter VirtualBox.
network:
version: 2
ethernets:
maineth:
match:
name: "en*"
dhcp4: true
Die Option match
gibt uns die notwendige Flexibilität um verschiedene Netzwerkkarten richtig anzusprechen. Dieser Schritt war wichtig, damit die SSH Schlüssel geladen werden können. Tritt hier ein Fehler auf, wurden meine User gelöscht.
Diese Konfiguration werden wir später in Schritt #5 noch anpassen.
Weil wir cloud-init nur für die Erstinstallation verwenden muss nach der Installation cloud-init deaktiviert werden. Dazu muss eine leere Datei wie folgt angelegt werden: sudo touch /etc/cloud/cloud-init.disabled
(SIehe Diskussion hier). Die restliche Konfiguration wird mit Ansible vorgenommen.
LVM wird zur Kompensation von Funktionen benötigt, die in BTRFS standardmässig vorliegen. D.h. mit einem BTRFS Dateisystem ist LVM für unsere Zwecke nicht notwendig. hypervisor/user-data
berücksichtigt das in der storage
-Konfiguration. Das Ergebnis ist, dass wir nun drei Partitionen erhalten:
Das Fine-Tuning des Hypervisors erfolgt ebenfalls über cloud-init und erfordert keine zusätzlichen manuellen schritte.
Damit der Hypervisor Host richtig funktioniert, muss das Netzwerk finalisiert werden und LXD konfiguriert werden.
LXD finalisieren wir indem wir ein preseed.yaml
auf dem Host einrichten und damit LXD starten. Dabei müssen wir beachten, dass die --preseed
-Option immer nur von der Standardeingabe die Daten liesst.
Die korrekte Installation funktioniert nur mit dem ip
Kernel Parameter.
setparams 'Ubuntu Server'
set gfxpayload=keep
linux /casper/vmlinuz ip=dhcp quiet autoinstall "ds=nocloud-net;s=https://raw.githubusercontent.com/dxiai/multimico-cluster/main/hypervisor/" ---
initrd /casper/initrd
Hier ist der Link, von dem ich die entscheidende Inspiration für Daniels Lösung bekommen habe. Der entscheidende Hinweis findet sich im Abschnitt Grup (UEFI).
Der Parameter ip=dhcp
stellt sicher, dass die Netzwerkinitialisierung via DHCP immer vor der eigentlichen Systeminitialisierung durchgeführt wird. Dadurch ist eine Netzwerkverbindung zu jedem Zeitpunkt der Systeminitialisierung garantiert - solange eine IP-Adresse via DHCP zugewiesen wurde. Mehr Details zur ip
-Option gibt es in der Linux Kernel Dokumentation.
Unter normalen Umständen ist die Anpassung nicht notwendig, weil die Netzwerkinitialisierung normalerweise schnell genug abgeschlossen ist. Ab Ubuntu 21.04 ist das durch eine Änderung im Linux-Bootvorgang jedoch nicht mehr garantiert.
Wichtig: Das ursprüngliche Issue ging davon aus, dass wir den linux
QEMU
-Hypervisor verwenden. Diese Annahme haben wir inzwischen angepasst und sind auf LXC/LXD Systemcontainer umgestiegen. Diese sparen Ressourcen.we build on ubuntu LTS.
We do not install any extra components, as nodes will run as VM on the host hardware.
After installation we need to install
Extra tools