feat(templates): Profile ins Template einbacken
Beim Template-Bau lassen sich Profile wählen (nur solche ohne Pflichtvariablen). Nach dem Vorbereitungsstart laufen sie über den Guest-Agent; danach werden Maschinen-ID, SSH-Host-Keys, Docker-Engine-ID und apt-Cache entfernt. Ausrollen nimmt das Template mit den meisten passenden Profilen und überspringt, was schon eingebacken ist. Auf pve-demo: Provisionierung mit base+docker 141 s ohne, ~30 s mit Template. Dabei gefunden: docker nimmt den Benutzer per guest.user in die Gruppe auf – Profile mit guest.* laufen deshalb beim Deploy noch einmal (idempotent, schnell). Closes #022 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
@@ -68,6 +68,40 @@ export function profileAufloesen(
|
||||
return { ok: true, profile, automatisch: reihenfolge.filter((id) => !auswahl.includes(id)) };
|
||||
}
|
||||
|
||||
/** Werte eines Profils aus der Eingabe, mit Standardwerten und Typprüfung. */
|
||||
export function variablenWerte(
|
||||
profil: Profil,
|
||||
eingabe: Record<string, unknown>,
|
||||
): { werte: Record<string, string | number | boolean>; fehler: ProfilFehler[] } {
|
||||
const werte: Record<string, string | number | boolean> = {};
|
||||
const fehler: ProfilFehler[] = [];
|
||||
for (const variable of profil.variables) {
|
||||
const ergebnis = wertPruefen(variable, eingabe[variable.name]);
|
||||
if ("fehler" in ergebnis)
|
||||
fehler.push({ profil: profil.id, variable: variable.name, meldung: ergebnis.fehler });
|
||||
else werte[variable.name] = ergebnis.wert;
|
||||
}
|
||||
return { werte, fehler };
|
||||
}
|
||||
|
||||
/**
|
||||
* Ein ins Template eingebackenes Profil muss beim Deploy nur dann nicht noch einmal laufen, wenn
|
||||
* seine Variablen genau die Standardwerte haben – mit denen wurde es eingebacken.
|
||||
*/
|
||||
export function mitStandardwerten(eintrag: AufgeloestesProfil): boolean {
|
||||
const standard = variablenWerte(eintrag.profil, {}).werte;
|
||||
return JSON.stringify(standard) === JSON.stringify(eintrag.werte);
|
||||
}
|
||||
|
||||
/**
|
||||
* Verweist ein Profil auf `{{ guest.* }}` (Name, Benutzer), hängt es vom einzelnen Gast ab – im
|
||||
* Template stand dort etwas anderes. Solche Profile laufen beim Deploy trotzdem noch einmal; dank
|
||||
* Idempotenz ist das schnell (Fund: docker nahm sonst den Benutzer nicht in die Gruppe auf).
|
||||
*/
|
||||
export function gastunabhaengig(profil: Profil): boolean {
|
||||
return !/\{\{[^}]*\bguest\./.test(JSON.stringify(profil.families));
|
||||
}
|
||||
|
||||
function wertPruefen(
|
||||
variable: ProfilVariable,
|
||||
eingabe: unknown,
|
||||
|
||||
Reference in New Issue
Block a user