Blog ·
Un script qui sait qu’il parle à un conteneur
Sept champs facultatifs où l’absence signifie non établi, une table dont le test dérive ses cas, et un système d’exploitation dans la mauvaise liste.
Par Provibr
Un hôte Proxmox peut faire tourner deux choses très différentes : une machine virtuelle complète avec son propre noyau et son propre micrologiciel, et un conteneur qui partage le noyau de l’hôte. De loin, les deux sont « un serveur » et le panneau les met dans une seule liste. De près, elles diffèrent d’une manière qui compte pour qui écrit de l’automatisation, et jusqu’à cette manche un script ne pouvait pas les distinguer.
C’est une mauvaise position. Un script qui demande à un conteneur d’agrandir un disque virtuel, d’attacher une image ISO ou de démarrer par le réseau ne demande pas quelque chose de difficile ; il demande quelque chose qui n’existe pas. L’échec arrive quatre couches plus tard, sous la forme d’une commande acceptée, mise en file, envoyée, puis refusée par un agent.
Sept champs, et absent signifie non établi
Les scripts et les webhooks reçoivent désormais un groupe de faits sur ce qu’il y a sous un serveur : sa sorte, le modèle dont il vient, s’il est non privilégié, le stockage où réside sa racine, ses points de montage, ce qu’il sait réellement faire et ce qu’il ne sait pas faire.
Chacun de ces champs peut manquer, et manquer signifie non établi. C’est la règle que suit déjà la colonne sous-jacente, où la sorte n’a jamais été comblée en silence, et elle existe parce que l’autre solution est pire qu’inutile. Un instantané qui inscrit « machine virtuelle » alors que personne ne l’a jamais mesuré est une conjecture remise à un script qui prendra une décision dessus.
Une sorte inconnue ne devient donc pas une valeur par défaut. Le champ disparaît entièrement du contexte de rendu, et le lire est alors une erreur dure au moment où le flux est enregistré, plutôt qu’une chaîne vide qui rend une condition fausse en silence. C’est le même raisonnement que la suppression d’un groupe de variables qu’un déclencheur ne peut pas fournir : bruyant à l’enregistrement bat silencieux à l’exécution.
C’est aussi le premier groupe imbriqué du catalogue de variables. Un nom de champ contenant un point est d’ordinaire un piège dans cette base de code, car le catalogue de traduction traite un point comme un niveau ; ici, la clé du catalogue l’aplatit volontairement pendant que le chemin du contexte descend d’un niveau, et un test fixe l’hypothèse qu’il y a exactement un point.
Les chemins de l’hôte ne voyagent pas
Un montage lié dans la configuration d’un conteneur ressemble à une clé, un chemin de l’hôte et un point de montage. Ce chemin est un répertoire de l’hyperviseur, et il ne doit jamais en sortir.
La règle dans notre propre documentation est franche : les clients n’obtiennent jamais par Provibr un interpréteur de commandes de l’hôte, un chemin de son système de fichiers ni un identifiant d’administration de l’hyperviseur. Un instantané de variables est exactement une telle voie. Il finit dans un script, dans le corps d’un webhook chez un tiers, et dans une ligne d’audit.
L’instantané ne porte donc jamais la source. Ce qui reste est ce qu’un client a le droit de savoir de son propre conteneur : quelle clé c’est, où il est monté dans le conteneur, et de quelle sorte de source il vient. Une forme de texte fixe, car un script lit cela en découpant sur un séparateur et non en analysant de la prose : mp1:bind:/srv dit qu’un montage lié se trouve sur /srv, et ne dit absolument rien d’où il vient sur l’hôte.
Cela vaut aussi pour un montage de volume. Un nom de stockage n’est pas un chemin de l’hôte, mais c’est la nomenclature propre de l’hyperviseur, et aucune question de script n’en a besoin. Le nom du stockage apparaît une fois, à part, comme un seul mot que le client avait déjà vu à la commande.
Le prix de cette conception est annoncé plutôt que caché : les faits de montage viennent de la configuration que l’agent lit pendant une sauvegarde, un conteneur qui n’a jamais eu de sauvegarde ne produit donc aucun point de montage. Le champ manque alors, et c’est correct, car une liste vide affirmerait que le conteneur n’a pas de points de montage.
Une table dont le test dérive ses propres cas
Il existait déjà une table écrite qui dit, pour chaque commande de machine virtuelle, si un conteneur en est capable et pourquoi non. Il manquait une table couvrant toutes les commandes qu’une intégration Proxmox peut porter, y compris les sauvegardes et les quatre lectures qui décrivent l’intégration et non un invité particulier.
Sans cette distinction, un tamis ne peut pas séparer « aucun jugement noté » de « cela ne concerne pas du tout un invité », et le seul comportement sûr pour le second est de laisser passer. C’est précisément la branche silencieuse contre laquelle ce projet se brûle sans cesse.
La nouvelle table est donc dérivée de celle qui est écrite plutôt qu’écrite à côté, et le test n’énumère pas de cas. Il calcule l’ensemble atteignable à partir des registres, en prenant chaque sorte de commande que le fournisseur Proxmox ne refuse pas et qui sert aussi une ressource invitée, plus les lectures nommées sur le descripteur du fournisseur lui-même, puis en exigeant une déclaration par sorte. Vingt-sept commandes d’invité et quatre lectures d’intégration, et le test a été prouvé rouge avant d’être prouvé vert.
Un test par cas ne peut pas trouver un cas manquant. Cette base de code a maintenant appris cette leçon trois fois, et voici la troisième forme de la même garde.
Une commande manque exprès, et le commentaire dit où la chercher. Exécuter une commande dans un conteneur reviendrait aujourd’hui à la lancer en tant qu’administrateur sur l’hyperviseur, hors du conteneur, avec les droits de l’hôte. Ce n’est pas une fonction de script à faible empreinte ; c’est un interpréteur de commandes de l’hôte sous un nom sympathique. Qui la construira aura une manche à lui, avec un exécuteur dans l’invité, un droit à lui et une piste d’audit à lui.
Un refus avant l’envoi ne laisse pas de ligne
La passerelle refusait déjà les commandes impossibles. Ce refus arrive à une commande qui existe déjà : la ligne est en base, l’opération a été créée, et le client regarde une tâche échouer.
Ce qui était demandé, c’est la validation avant l’envoi, et c’est exactement la différence. Demander à un conteneur son matériel virtuel doit donner une phrase et non une ligne d’audit.
Les deux tamis ne peuvent pas diverger, car ils lisent la même table. Ce n’est pas une seconde vérité ; c’est la même vérité, une couche plus tôt. La passerelle reste nécessaire pour la requête répétée ou contrefaite qui ne passe jamais par la fonction du panneau.
Le motif du refus est rendu comme un seul message avec une branche par motif, et la garde autour exige deux choses : une branche pour chaque motif, et que les phrases diffèrent entre elles. Une branche absente dans une sélection de langue retombe sur la valeur par défaut et dit quelque chose de vrai qui ne veut rien dire, et ce mode de panne, ce projet le connaît déjà.
Le système d’exploitation dans la mauvaise liste
La trouvaille que seule une vraie base de données a produite n’avait rien à voir avec tout ce qui précède.
Les entrées de système d’exploitation gardaient autrefois leur source d’installation dans une colonne et en gardent désormais deux, l’ancienne étant lue comme repli pour les lignes qu’aucun nouvel écrivain n’a jamais touchées. Les modèles de conteneur sont arrivés plus tard et vont dans une colonne à eux, et sur une ligne neuve ils sont aussi projetés dans l’ancienne.
Le repli n’en savait rien. Il lisait une référence de conteneur dans l’ancienne colonne comme un modèle de machine virtuelle, de sorte qu’un système d’exploitation n’ayant qu’un modèle de conteneur figurait dans la liste des machines virtuelles du flux de commande, sans sorte de calcul, et une commande passée dessus aurait plus tard échoué sur une source de clonage sans identifiant à cloner.
La correction est une branche : une référence de conteneur dans l’ancienne colonne n’est pas une source de machine virtuelle. Rien n’est perdu, car le côté conteneur lit sa propre colonne et aucune autre, et les lignes assez anciennes pour avoir besoin du repli ne peuvent par construction pas porter de référence de conteneur : cette colonne n’existait pas encore.
Une seconde trouvaille est venue d’une capture d’écran et non d’une vérification. Dans la liste de ce qu’un conteneur ne sait pas faire figurait une commande de paiement qui appartient à un autre fournisseur et qui n’existe sur Proxmox pour aucune des deux sortes. Vraie, et complètement déplacée sur la page de détail d’un conteneur. Elle a été retirée de cette liste.
Ce que nous noterions
- Absent est une réponse. Si vous ne connaissez pas la sorte, n’inscrivez pas de valeur par défaut. Une conjecture transmise à l’automatisation est pire qu’un trou que le script peut voir.
- La sûreté des droits est une propriété de la forme, pas de l’appelant. Concevez l’instantané pour que le chemin de l’hôte n’y soit pas, et aucun lecteur futur ne pourra le divulguer.
- Une forme de texte fixe bat la prose. Quelqu’un va découper cela sur un séparateur.
- Dérivez les cas du registre. Un test par cas est structurellement incapable de trouver le cas que personne n’a écrit.
- Refusez avant d’enregistrer. Un refus qui produit une ligne d’audit a déjà raconté au client la mauvaise histoire.
- Regardez les captures d’écran. L’entrée déplacée était vraie, elle a passé toutes les vérifications, et elle était visiblement fausse pour un œil humain.
Pour être clair sur ce dont il s’agit : les conteneurs sont commandables sur Proxmox et les faits de calcul sont en production. Plusieurs choses ne sont pas prouvées. Rien de tout cela n’a été exercé cette manche contre un vrai hyperviseur, les faits de montage dépendent d’une sauvegarde ayant eu lieu au moins une fois, une phrase du flux de commande dit encore « la VM » sur un conteneur, et le compteur de licences compte encore un conteneur comme une machine virtuelle.
Issu du travail de plateforme de Provibr. Pourquoi un conteneur non privilégié est une mesure et non un réglage est expliqué dans non privilégié est une mesure, pas un réglage, et quels points de montage une sauvegarde de conteneur contient ou non est expliqué dans ce qu’une sauvegarde ne contient pas.