Zum Inhalt springen

Blog ·

Ein Skript, das den Container erkennt

Sieben Felder, bei denen Fehlen nicht festgestellt heißt, eine Kommandotabelle, deren Test die Fälle ableitet, und ein Betriebssystem in der falschen Liste.

Von Provibr

Ein Proxmox-Host kann zwei sehr verschiedene Dinge betreiben: eine vollständige virtuelle Maschine mit eigenem Kern und eigener Firmware, und einen Container, der sich den Kern des Hosts teilt. Aus der Ferne sind beide „ein Server“, und das Panel führt sie in einer Liste. Aus der Nähe unterscheiden sie sich auf eine Weise, die für jeden zählt, der Automatisierung schreibt, und bis zu dieser Runde konnte ein Skript sie nicht auseinanderhalten.

Das ist eine schlechte Lage. Ein Skript, das einen Container bittet, eine virtuelle Festplatte zu vergrößern, ein ISO anzuhängen oder vom Netz zu starten, bittet nicht um etwas Schwieriges; es bittet um etwas, das es nicht gibt. Der Fehlschlag kommt vier Schichten später an, als Kommando, das angenommen, eingereiht, versandt und dann von einem Agenten abgewiesen wurde.

Sieben Felder, und Fehlen bedeutet nicht festgestellt

Skripte und Webhooks bekommen jetzt eine Gruppe von Tatsachen darüber, was unter einem Server steckt: seine Art, die Vorlage, aus der er stammt, ob er unprivilegiert ist, den Speicher, auf dem seine Wurzel liegt, seine Einhängepunkte, was er wirklich kann und was er nicht kann.

Jedes dieser Felder darf fehlen, und Fehlen bedeutet nicht festgestellt. Das ist dieselbe Regel, der die zugrunde liegende Spalte folgt, in der die Art nie still nachgetragen wurde, und sie besteht, weil die Alternative schlimmer als nutzlos ist. Eine Momentaufnahme, die „virtuelle Maschine“ einträgt, obwohl es nie jemand gemessen hat, ist eine Vermutung, die einem Skript übergeben wird, das darauf eine Entscheidung trifft.

Eine unbekannte Art wird also kein Vorgabewert. Das Feld verschwindet vollständig aus dem Darstellungskontext, und es zu lesen ist dann ein harter Fehler in dem Moment, in dem der Ablauf gespeichert wird, statt einer leeren Zeichenkette, die eine Bedingung still unwahr macht. Das ist dieselbe Überlegung wie das Entfernen einer Variablengruppe, die ein Auslöser nicht liefern kann: laut beim Speichern schlägt still zur Laufzeit.

Es ist außerdem die erste geschachtelte Gruppe im Variablenkatalog. Ein Feldname mit einem Punkt darin ist in dieser Codebasis normalerweise eine Falle, denn der Übersetzungskatalog behandelt einen Punkt als Ebene; hier plättet ihn der Katalogschlüssel bewusst, während der Kontextpfad eine Ebene tiefer geht, und ein Test hält die Annahme fest, dass genau ein Punkt darin steht.

Hostpfade reisen nicht mit

Eine Bind-Einhängung in der Konfiguration eines Containers sieht aus wie ein Schlüssel, ein Hostpfad und ein Einhängepunkt. Dieser Hostpfad ist ein Verzeichnis auf dem Hypervisor, und er darf ihn nie verlassen.

Die Regel in unserer eigenen Dokumentation ist unverblümt: Kunden bekommen über Provibr nie eine Host-Shell, einen Pfad im Dateisystem des Hosts oder ein Wurzel-Zugangsdatum des Hypervisors. Eine Variablen-Momentaufnahme ist genau ein solcher Weg. Sie landet in einem Skript, in einem Webhook-Rumpf bei einem Dritten und in einer Prüfzeile.

Die Momentaufnahme trägt die Quelle deshalb nie. Übrig bleibt, was ein Kunde über seinen eigenen Container wissen darf: welcher Schlüssel es ist, wo er im Container hängt und aus welcher Art Quelle er kommt. Eine feste Textform, denn ein Skript liest das, indem es an einem Trennzeichen teilt, und nicht, indem es Prosa auswertet: mp1:bind:/srv sagt, dass an /srv eine Bind-Einhängung hängt, und sagt überhaupt nichts darüber, woher sie auf dem Host stammt.

Das gilt auch für eine Volumen-Einhängung. Ein Speichername ist kein Hostpfad, aber er ist die eigene Benennung des Hypervisors, und keine Skriptfrage braucht ihn. Der Speichername erscheint einmal, für sich, als ein Wort, das der Kunde bei seiner Bestellung ohnehin sah.

Der Preis dieses Entwurfs steht ehrlich dabei statt verborgen: die Einhängetatsachen stammen aus der Konfiguration, die der Agent während einer Sicherung liest, ein Container ohne je eine Sicherung liefert also gar keine Einhängepunkte. Das Feld fehlt dann, und das ist richtig, denn eine leere Liste behauptete, der Container habe keine Einhängepunkte.

Eine Tabelle, deren Test die Fälle selbst ableitet

Es gab bereits eine geschriebene Tabelle, die je Kommando für virtuelle Maschinen sagt, ob ein Container es kann und warum nicht. Es fehlte eine Tabelle, die jedes Kommando abdeckt, das eine Proxmox-Anbindung tragen kann, einschließlich Sicherungen und der vier Lesungen, die die Anbindung betreffen und nicht einen einzelnen Gast.

Ohne diese Unterscheidung kann ein Sieb „kein Urteil festgehalten“ nicht von „das betrifft überhaupt keinen Gast“ trennen, und das einzig sichere Verhalten für das zweite ist durchlassen. Das ist genau der stille Zweig, an dem sich dieses Projekt immer wieder verbrennt.

Die neue Tabelle ist deshalb aus der geschriebenen abgeleitet und nicht daneben geschrieben, und der Test zählt keine Fälle auf. Er berechnet die erreichbare Menge aus den Registern, indem er jede Kommandoart nimmt, die der Proxmox-Anbieter nicht abweist und die auch eine Gastressource bedient, dazu die Lesungen, die auf dem Anbieterdeskriptor selbst stehen, und verlangt dann je Art eine Aussage. Siebenundzwanzig Gastkommandos und vier Anbindungslesungen, und der Test wurde erst rot und dann grün bewiesen.

Ein Test je Fall kann einen fehlenden Fall nicht finden. Diese Lektion hat diese Codebasis nun dreimal gelernt, und dies ist die dritte Form derselben Absicherung.

Ein Kommando fehlt mit Absicht, und der Kommentar sagt, wo Sie danach suchen. Ein Kommando in einem Container auszuführen hieße heute, es als Wurzelnutzer auf dem Hypervisor laufen zu lassen, außerhalb des Containers, mit den Rechten des Hosts. Das ist keine Skriptfunktion mit kleinem Fußabdruck; es ist eine Host-Shell mit freundlichem Namen. Wer sie baut, bekommt eine eigene Runde, mit einem Ausführer im Gast, einem eigenen Recht und einer eigenen Prüfspur.

Eine Abweisung vor dem Versand hinterlässt keine Zeile

Die Gateway wies unmögliche Kommandos schon ab. Diese Abweisung trifft ein Kommando, das bereits ist: die Zeile steht in der Datenbank, die Operation wurde angelegt, und der Kunde sieht einem Auftrag beim Scheitern zu.

Verlangt war die Prüfung vor dem Versand, und genau das ist der Unterschied. Einen Container nach seiner virtuellen Hardware zu fragen soll einen Satz ergeben und keine Prüfzeile.

Die beiden Siebe können nicht auseinanderlaufen, denn sie lesen dieselbe Tabelle. Das ist keine zweite Wahrheit; es ist dieselbe Wahrheit, eine Schicht früher. Die Gateway wird weiterhin für die wiederholte oder nachgebaute Anfrage gebraucht, die nie durch die Panelfunktion kommt.

Der Abweisungsgrund erscheint als eine Meldung mit einem Zweig je Grund, und die Absicherung darum verlangt zweierlei: einen Zweig für jeden Grund, und dass sich die Sätze voneinander unterscheiden. Ein fehlender Zweig in einer Sprachauswahl fällt auf die Vorgabe durch und sagt etwas, das stimmt und nichts bedeutet, und dieses Fehlverhalten kennt dieses Projekt bereits.

Das Betriebssystem in der falschen Liste

Der Fund, den nur eine echte Datenbank hervorbrachte, hatte mit alldem nichts zu tun.

Einträge für Betriebssysteme hielten ihre Installationsquelle früher in einer Spalte und jetzt in zweien, wobei die alte Spalte als Rückfall für Zeilen gelesen wird, die kein neuer Schreiber je berührt hat. Containervorlagen kamen später dazu und gehen in eine eigene Spalte, und werden auf einer frischen Zeile auch in die alte gespiegelt.

Der Rückfall wusste davon nichts. Er las einen Containerverweis in der alten Spalte als Vorlage für eine virtuelle Maschine, wodurch ein Betriebssystem mit nur einer Containervorlage in der Liste der virtuellen Maschinen des Bestellablaufs stand, ohne Rechenart, und eine darauf abgegebene Bestellung wäre später an einer Klonquelle ohne ID gescheitert.

Die Reparatur ist ein Zweig: ein Containerverweis in der alten Spalte ist keine Quelle für eine virtuelle Maschine. Es geht nichts verloren, denn die Containerseite liest ihre eigene Spalte und sonst keine, und Zeilen, die alt genug für den Rückfall sind, können konstruktionsbedingt keinen Containerverweis tragen: diese Spalte gab es damals noch nicht.

Ein zweiter Fund kam aus einer Bildschirmaufnahme und nicht aus einer Prüfung. In der Liste der Dinge, die ein Container nicht kann, stand ein Zahlungskommando, das zu einem anderen Anbieter gehört und auf Proxmox für keine der beiden Arten existiert. Wahr, und auf der Detailseite eines Containers völlig fehl am Platz. Es wurde aus dieser Liste entfernt.

Was wir festhalten würden

  1. Fehlend ist eine Antwort. Kennen Sie die Art nicht, tragen Sie keinen Vorgabewert ein. Eine an die Automatisierung weitergereichte Vermutung ist schlimmer als eine Lücke, die das Skript sehen kann.
  2. Rechtesicherheit ist eine Eigenschaft der Form, nicht des Aufrufers. Entwerfen Sie die Momentaufnahme so, dass der Hostpfad nicht darin steht, dann kann ihn kein späterer Leser verraten.
  3. Eine feste Textform schlägt Prosa. Irgendjemand wird das an einem Trennzeichen teilen.
  4. Leiten Sie die Fälle aus dem Register ab. Ein Test je Fall kann den Fall, den niemand geschrieben hat, strukturell nicht finden.
  5. Weisen Sie ab, bevor Sie festhalten. Eine Abweisung, die eine Prüfzeile erzeugt, hat dem Kunden bereits die falsche Geschichte erzählt.
  6. Sehen Sie sich die Bildschirmaufnahmen an. Der fehl am Platz stehende Eintrag war wahr, kam durch jede Prüfung und war für ein menschliches Auge sofort falsch.

Zur Klarheit darüber, was das ist: Container sind auf Proxmox bestellbar und die Rechentatsachen sind aktiv. Mehrere Dinge sind unbewiesen. Nichts davon wurde in dieser Runde an einem echten Hypervisor erprobt, die Einhängetatsachen hängen davon ab, dass es mindestens einmal eine Sicherung gab, ein Satz im Bestellablauf sagt bei einem Container weiterhin „die VM“, und der Lizenzzähler zählt einen Container weiterhin als virtuelle Maschine.

Aus der Plattformarbeit von Provibr. Warum ein unprivilegierter Container eine Messung und keine Einstellung ist, steht in unprivilegiert ist eine Messung, keine Einstellung, und welche Einhängepunkte eine Containersicherung enthält und welche nicht, steht in was eine Sicherung nicht enthält.

Fangen Sie mit einem Host und einem Agenten an

Konto erstellen, den Agenten mit einem einzigen Befehl installieren und Ihren ersten Proxmox-Host verbinden. Die Testphase läuft 14 Tage und fragt nicht nach Zahlungsdaten.