Capturé le 2026-07-28 depuis un CE de ce déploiement. sitecli/capture-manifest.json
enregistre le nœud concerné, et scripts/capture-sitecli.sh --check revérifie la surface
de commande sur un CE actif.
SSH atteint le compte admin de l’appliance, dont le shell de connexion est le Site CLI
(/opt/bin/vpmu). C’est la seule voie d’accès à la surface de commande complète sur la boîte —
l’API de débogage expose 34 commandes, et l’appliance elle-même en offre
bien d’autres qui ne figurent pas du tout dans cette API.
Chaque élément de cette ligne de commande est indispensable, et les trois sections suivantes
expliquent quelle erreur chacun prévient.
Il n’existe pas d’invite shell sur laquelle atterrir : le shell de connexion d’adminest
le Site CLI, vous arrivez donc directement à son invite >>>. Exécutez les commandes sur la
boîte avec execcli <name> à cet endroit — voir les
commandes sur la boîte.
admin_user_credentials.ssh_key sur l’objet site ressemble exactement au champ prévu pour
cela. Il est accepté, survit à une relecture, et ne configure rien. vpm est propriétaire
des utilisateurs locaux du nœud et refuse de modifier celui-ci — d’après le journal propre
du nœud, à trois reprises lors d’un seul démarrage :
vpm users.go:165: Won't do any change for user admin (internal skip)
Tout le reste découle de cette seule ligne. /var/home/admin/.ssh n’existe jamais, avant
ni après que le site atteigne ONLINE. La date de dernier changement du shadow d’admin
reste à la date de construction de l’image tandis que vesbkp et vesopcon affichent la
date actuelle, car vpm a configuré ces deux-là et a ignoré admin. Et vpm ne journalise
rien concernant ssh_key ou authorized_keys à aucun moment.
Le fichier doit donc être écrit en dehors de vpm. admin est l’uid 2202, gravé dans
l’image du nœud, il existe donc avant l’exécution de cloud-init et owner: admin:admin
est résolu au moment de l’écriture — pas de runcmd, pas de correction de propriété :
- path: /var/home/admin/.ssh/authorized_keys
permissions: "0600"
owner: admin:admin
content: |
${ssh_public_key}
sshd était toujours disposé à répondre. sshd -T rapporte pubkeyauthentication yes,
et admin apparaît dans AllowUsers dans les deux fichiers sshd_config livrés sur le
nœud. Il n’y avait jamais rien à activer — seulement un fichier manquant.
sshd lie 0.0.0.0:22, mais seule l’adresse interne (SLI) se trouve sur la pile
réseau de l’hôte d’une manière à laquelle sshd répondra. eth0 est renommé a-i-eth0 et
ne porte aucune IP hôte — le plan de données Argo est propriétaire de cette interface, et
l’adresse de gestion/SLO qu’elle aurait portée apparaît sur vhost0 à la place. Les deux
autres NIC restent sur la pile hôte sous leurs propres noms.
Sondé depuis une VM à l’intérieur du VNet, sur un CE :
adresse management/SLO délai dépassé
adresse externe délai dépassé
adresse interne/SLI OUVERTE SSH-2.0-OpenSSH_8.7
adresse inutilisée délai dépassé (contrôle)
Un sondage sur l’adresse par laquelle vous connaissez le nœud renvoie donc exactement ce
que retourne un groupe de sécurité fermé. Rien ne le bloque ; il n’y a simplement pas de
listener sur cette adresse.
Les adresses publiques du CE n’ont pas non plus de listener sur le port 22, ce qui explique
pourquoi la commande ci-dessus utilise -J : une VM opérateur à l’intérieur du VNet, dans
le même sous-réseau que les adresses SLI. Ce déploiement en construit une à cet effet —
terraform output -raw client_vm_name la nomme.
Le Site CLI nécessite un terminal et un retour chariot
Le shell de connexion d’admin n’est pas un shell. C’est une application go-prompt, qui
met le terminal en mode raw et lit des frappes clavier plutôt que des lignes. Quatre
conséquences, chacune échouant d’une manière qui ressemble à un problème différent :
Mécanisme
Ce qui se passe sans lui
Allouer un terminal (ssh -tt)
panic: no such device or address de go-prompt.NewStandardInputParser, ce qui ressemble à une appliance en plantage
Envoyer un retour chariot, et non un saut de ligne, pour Entrée
La ligne n’est jamais soumise, et la session se ferme en fin d’entrée sans avoir rien affiché
Garder l’entrée standard ouverte
La connexion se termine avant que la commande ait été rendue, donc une commande fonctionnelle semble silencieuse
Écrire le texte de la commande et l’octet Entrée séparément
Le saut de ligne atterrit dans le tampon comme un caractère littéral et le CLI répond unknown command, ce qui donne l’impression que la commande n’existe pas
ssh host 'some-command' ne fonctionne donc pas : l’argument est ignoré et l’invite
interactive démarre quand même. Pilotez-le comme un terminal ou pas du tout.
scripts/sitecli_ssh_harvest.py est l’implémentation de référence.
Avant de taper quoi que ce soit, la bannière de connexion a déjà répondu à plusieurs des
questions sur lesquelles vous auriez autrement passé des commandes. Depuis f5-xc-ce-vm-01,
art ASCII et IP publique masqués :
Registration Status distingue un nœud encore en cours de démarrage (PROVISIONING) d’un
nœud terminé (PROVISIONED). Software est la chaîne de build qui détermine quelles
commandes existent. DNS et NTP couvrent les deux dépendances qui cassent l’enregistrement
en premier, donc un nœud qui n’est jamais passé en ligne vous a généralement déjà dit pourquoi
ici — avant que
chronyc-sources ou
dig soient nécessaires.
Pointez le déploiement vers la moitié publique. Le module racine lit le fichier une
fois et transmet la chaîne à chaque nœud :
terraform/terraform.tfvars
ssh_public_key_path ="~/.ssh/id_ed25519.pub"
ssh_public_key prend le matériau en ligne à la place, ce qui est ce qu’utilisent les
tests de plan. La moitié privée ne quitte jamais votre poste de travail.
Appliquez. Lisez d’abord l’avertissement en haut de cette page — sur un déploiement
existant, cela remplace les VMs CE.
Chacun de ces éléments a été testé et écarté alors que la voie était encore considérée
comme impossible. Chacun est suffisamment plausible pour coûter une journée.
Pas la cause
Comment cela a été écarté
L’identifiant ne s’applique qu’à la création
sshd démarre environ 90 secondes après le premier démarrage, avant que l’objet site existe. admin_user_credentials est également présent dans ReplaceSpecType et s’applique en place.
block_all_services
La fermeture du port 22 sur l’adresse de gestion est identique que les services soient bloqués ou non.
Un saut de ligne en fin de clé
Testé dans les deux sens, aucun changement. Cloud-init le supprime quand même, car un bloc littéral rendrait autrement une deuxième ligne vide.
Un logiciel CE épinglé et plus ancien
Reproduit sur trois builds, dont un exécutant OpenSSH 9.9.
Un admin_password manquant
Définir admin_password aux côtés de ssh_key sur un CE créé de zéro n’a rien changé.
Debug APIScriptée, ne nécessite pas d'accès à l'intérieur du VNet, et le bon choix pour des preuves reproductibles. Couvre 34 commandes et nécessite que le site soit ONLINE.
Site ConsoleInterface de dépannage de nœud F5 via un tunnel Azure Bastion. Pas de clé, pas d'hôte de saut, et répond avant que le site s'enregistre.
Console sériePour un nœud qui ne s'est jamais enregistré, ou qui n'a pas de chemin réseau fonctionnel. Nécessite un terminal, ou le harnais websocket.