Il y a 389 articles et 19 utilisateurs inscrits (ce bandeau est défini dans MediaWiki:Sitenotice)

« Déploiement technique d’une VM AJLSM » : différence entre les versions

De AJLSM
Aller à la navigation Aller à la recherche
Ligne 455 : Ligne 455 :


Une page absente ne signifie pas que le script est absent : --help est l’aide intégrée de l’exécutable. Le manuel installé doit être réconcilié avec le cycle et l’assistant avant d’être considéré comme référence de cette version. En attendant, le présent guide et l’aide des fichiers du lot de recette décrivent le fonctionnement courant.
Une page absente ne signifie pas que le script est absent : --help est l’aide intégrée de l’exécutable. Le manuel installé doit être réconcilié avec le cycle et l’assistant avant d’être considéré comme référence de cette version. En attendant, le présent guide et l’aide des fichiers du lot de recette décrivent le fonctionnement courant.
<syntaxhighlight lang="bash">Last login: Fri Oct 16 15:21:06 on ttys000
jlarvers@MacBook-Pro ~ % ssh saturne3
Linux Saturne3 7.0.14-23-pve #1 SMP PREEMPT_DYNAMIC PMX 7.0.14-23 (2026-10-07T20:25Z) x86_64
The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.
Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
Last login: Fri Oct 16 09:46:02 2026 from 109.190.129.96
root@Saturne3:~# qm status 505
qm config 505
status: running
agent: 1
balloon: 16384
boot: order=scsi0;net0
cores: 8
cpu: x86-64-v2-AES
memory: 24576
meta: creation-qemu=11.0.0,ctime=1779439732
name: MERCURE3
net0: virtio=BC:24:11:D5:B4:C2,bridge=vmbr2,firewall=1,link_down=0
net1: virtio=BC:24:11:E8:F0:BD,bridge=vmbr1,firewall=1,link_down=0
numa: 0
onboot: 1
ostype: l26
scsi0: local-zfs:vm-505-disk-0,iothread=1,size=100G
scsihw: virtio-scsi-single
smbios1: uuid=f47653e5-e87f-4765-bd41-46bb2eaac990
sockets: 1
tags: interne
vmgenid: d0cfe3f4-9292-4c03-81d9-662131e54889
root@Saturne3:~# qm set 505 --onboot 0
qm shutdown 505 --timeout 120
qm status 505
update VM 505: -onboot 0
status: stopped
root@Saturne3:~# PROJET_YAML=/etc/ajlsm/deploy/projets/mercure3.yaml
root@Saturne3:~# ./ajlsm-deploy "$PROJET_YAML" --clone
-bash: ./ajlsm-deploy: No such file or directory
root@Saturne3:~# history
    1  Ne pas lancer toutes les phases dans un script ou une chaîne de
    2  commandes.
    3  PHASE 1 - CLONAGE
    4  Simulation :
    5      ajlsm-deploy "$PROJET" --dry-run
    6  Clonage :
    7      ajlsm-deploy "$PROJET" --clone
    8  Le clone est créé sans démarrage.
    9  Vérifier le VMID réellement attribué.
  10  PHASE 2 - CONFIGURATION DES RESSOURCES
  11  Simulation :
  12      ajlsm-deploy "$PROJET" --resources-dry-run
  13  Application :
  14      ajlsm-deploy "$PROJET" --configure-resources
  15  Configuration des ressources CPU, RAM et disque.
  16  L'agrandissement du disque Proxmox ne suffit pas à agrandir le
  17  système de fichiers à l'intérieur de la VM.
  18  PHASE 3 - PREMIER DEMARRAGE ISOLE
  19  Simulation :
  20      ajlsm-deploy "$PROJET" --first-boot-dry-run
  21  Application :
  22      ajlsm-deploy "$PROJET" --first-boot-apply
  23  Le clone démarre avec ses interfaces réseau isolées.
  24  Le programme contrôle notamment l'agent QEMU et l'initialisation
  25  du clone.
  26  Ne pas activer manuellement les interfaces réseau.
  27  PHASE 4 - EXTENSION DU VOLUME RACINE
  28  Simulation :
  29      ajlsm-deploy "$PROJET" --root-grow-dry-run
  30  Application :
  31      ajlsm-deploy "$PROJET" --root-grow-apply
  32  Cette phase étend la partition, le volume LVM et le système de
  33  fichiers ext4 selon la configuration prévue.
  34  Elle doit être effectuée après le premier démarrage et avant la
  35  personnalisation système.
  36  En cas d'erreur, ne pas poursuivre sans diagnostic.
  37  PHASE 5 - PERSONNALISATION SYSTEME
  38  Simulation :
  39      ajlsm-deploy "$PROJET" --system-dry-run
  40  Application :
  41      ajlsm-deploy "$PROJET" --system-apply
  42  Personnalisation de l'identité système, notamment du hostname
  43  et du machine-id.
  44  La VM reste isolée du réseau.
  45  Les informations de transaction sont conservées dans :
  46      /var/lib/ajlsm/system-personalisation/
  47  Ne pas supprimer ces informations pour forcer une nouvelle opération.
  48  PHASE 6 - CONFIGURATION NETPLAN
  49  Simulation :
  50      ajlsm-deploy "$PROJET" --network-dry-run
  51  Application :
  52      ajlsm-deploy "$PROJET" --network-apply
  53  Préparation de Netplan et vérification de sa génération.
  54  Les interfaces Proxmox restent isolées.
  55  PHASE 7 - ACTIVATION DU RESEAU
  56  Simulation :
  57      ajlsm-deploy "$PROJET" --network-enable-dry-run
  58  Application :
  59      ajlsm-deploy "$PROJET" --network-enable
  60  Avant activation, le programme effectue les contrôles prévus,
  61  notamment la recherche de conflits d'adresses IPv4 par ARP.
  62  Après activation, vérifier :
  63  - Les adresses IPv4.
  64  - La route par défaut.
  65  - La passerelle.
  66  - Les DNS.
  67  - L'adresse loopback, si elle est configurée.
  68  - Le paramètre onboot de la VM.
  69  Le mécanisme de repli en cas d'échec réseau reste à valider
  70  par un test réel de panne.
  71  PHASE 8 - AUDIT SSH
  72      ajlsm-deploy "$PROJET" --ssh-audit
  73  Avant l'audit SSH, le programme synchronise l'identification
  74  du serveur dans /root/.ssh/known_hosts sur Saturne3.
  75  Il compare :
  76  - La clé publique ED25519 obtenue directement dans la VM
  77    via l'agent QEMU.
  78  - La clé ED25519 présentée sur le réseau via ssh-keyscan.
  79  Si les clés diffèrent, l'opération est refusée.
  80  Si elles correspondent, known_hosts peut être actualisé après
  81  sauvegarde.
  82  L'audit ne modifie pas la configuration SSH de la VM.
  83  ATTENTION :
  84  Bien que l'audit soit sans modification de la configuration SSH
  85  invitée, la synchronisation préalable peut modifier le fichier
  86  known_hosts de Saturne3.
  87  PHASE 9 - SECURISATION SSH
  88      ajlsm-deploy "$PROJET" --ssh-secure
  89  Cette phase désactive l'authentification SSH par mot de passe
  90  et conserve l'accès root par clé publique.
  91  Vérifier impérativement les accès par clé avant de confirmer.
  92  Après application, refaire un audit :
  93      ajlsm-deploy "$PROJET" --ssh-audit
  94  PHASE 10 - MOT DE PASSE DU COMPTE AJLSM
  95      ajlsm-deploy "$PROJET" --password-ajlsm
  96  Le mot de passe est demandé interactivement avec double saisie.
  97  Ne pas inscrire de mot de passe dans le YAML ou dans une commande.
  98  PHASE 11 - CERTIFICAT TLS INTERNE
  99      ajlsm-deploy "$PROJET" --tls-apply
  100  Initialisation ou vérification du certificat TLS interne.
  101  Vérifier le résultat et le fonctionnement du service concerné.
  102  6. VERIFICATIONS FINALES
  103  ------------------------
  104  Sur Saturne3, avec le VMID réellement attribué :
  105      qm status VMID
  106      qm config VMID
  107  Dans la VM :
  108      hostnamectl
  109      ip -br addr
  110      ip route
  111      resolvectl status
  112  Pour vérifier le volume racine :
  113      lsblk
  114      df -hT /
  115      pvs
  116      vgs
  117      lvs
  118  Pour vérifier SSH depuis Saturne3 :
  119      ssh root@ADRESSE_IP_VM
  120  Adapter VMID et ADRESSE_IP_VM au projet.
  121  Ne jamais accepter aveuglément une empreinte SSH différente.
  122  7. CONFIRMATIONS ET CODES DE RETOUR
  123  -----------------------------------
  124  Chaque modification nécessite une confirmation.
  125  La réponse par défaut est NON.
  126  Respecter la confirmation réellement demandée par la version
  127  installée du programme.
  128  Codes de retour :
  129      0 : succès
  130      1 : annulation
  131      2 : erreur
  132  Une erreur impose un diagnostic avant de poursuivre.
  133  8. REPRISE APRES INCIDENT
  134  -------------------------
  135  En cas d'échec :
  136  1. Ne pas lancer la phase suivante.
  137  2. Conserver la sortie complète du programme.
  138  3. Vérifier le VMID et l'identité de la VM.
  139  4. Contrôler son état dans Proxmox.
  140  5. Vérifier que le réseau est toujours isolé si nécessaire.
  141  6. Examiner les sauvegardes et informations de transaction.
  142  7. Corriger la cause avant de reprendre.
  143  Ne jamais supprimer une VM pour recommencer sans avoir vérifié
  144  son identité et ses données.
  145  Ne jamais modifier manuellement known_hosts pour contourner
  146  une erreur de correspondance de clés SSH.
  147  9. MAINTENANCE DES SCRIPTS
  148  --------------------------
  149  Vérifier la syntaxe Python :
  150      python3 -m py_compile \
  151          /usr/local/sbin/ajlsm-deploy \
  152          /usr/local/sbin/ajlsm_deploy_rootgrow.py \
  153          /usr/local/sbin/ajlsm_deploy_postconfig.py
  154  Les trois scripts forment un ensemble cohérent.
  155  Effectuer une sauvegarde avant toute modification.
  156  Ne pas restaurer un module isolément sans vérifier sa
  157  compatibilité avec les autres.
  158  10. ETAT DES VALIDATIONS AU 15 OCTOBRE 2026
  159  -------------------------------------------
  160  Recette MERCURE3 :
  161  - Clonage depuis TEMPLATE3.
  162  - Configuration des ressources.
  163  - Premier démarrage isolé.
  164  - Personnalisation système.
  165  - Configuration Netplan.
  166  - Contrôle ARP.
  167  - Activation réseau.
  168  - Vérifications réseau.
  169  Tests fonctionnels isolés du 15 octobre :
  170  - Validation de la comparaison des clés ED25519.
  171  - Acceptation de deux clés identiques.
  172  - Refus de clés différentes.
  173  - Refus de clés malformées.
  174  - Préservation de known_hosts en cas de refus.
  175  - Conservation des autres entrées de known_hosts.
  176  - Compilation Python des trois scripts.
  177  Restent à confirmer lors d'un déploiement complet avec les
  178  dernières versions des scripts :
  179  - Extension du volume racine.
  180  - Enchaînement complet des phases.
  181  - Synchronisation SSH avec une nouvelle VM réelle.
  182  - Sécurisation SSH et postconfiguration.
  183  - Repli en cas d'échec réseau.
  184  11. PRECAUTIONS
  185  ---------------
  186  TEMPLATE3 : VMID 506, modèle de clonage.
  187  MERCURE3 : VMID 505, VM utilisée pour la recette.
  188  Ces identifiants ne doivent jamais être réutilisés aveuglément.
  189  La VM 515 est indépendante de cette procédure et ne doit pas
  190  être modifiée.
  191  Le README applicatif présent sur TEMPLATE3 et MERCURE3 ne doit
  192  pas être remplacé par ce document.
  193  12. DOCUMENTATION COMPLEMENTAIRE
  194  --------------------------------
  195  Aide rapide :
  196      ajlsm-deploy --help
  197  Manuel système :
  198      man ajlsm-deploy
  199  Documentation technique complète :
  200      AJLSM-DEPLOY - Déploiement automatisé des VM Proxmox
  201      (documentation MediaWiki AJLSM)
  202  Le manuel et la documentation MediaWiki doivent être maintenus
  203  en cohérence avec les scripts.
  204  FIN DU README
  205  =============
  206  FIN_README
  207        chmod 644 /usr/local/sbin/README-ajlsm-deploy;    echo "README créé : /usr/local/sbin/README-ajlsm-deploy"; fi
  208  ls -l /usr/local/sbin/README-ajlsm-deploy
  209  head -20 /usr/local/sbin/README-ajlsm-deploy
  210  ls -l /usr/local/sbin/README-ajlsm-deploy
  211  head -20 /usr/local/sbin/README-ajlsm-deploy
  212  vim /usr/local/sbin/README-ajlsm-deploy
  213  man -w ajlsm-deploy
  214  cat /usr/local/man/man8/ajlsm-deploy.8
  215  python3 - <<'PY'
  216  from pathlib import Path
  217  from datetime import datetime
  218  import shutil
  219  path = Path("/usr/local/man/man8/ajlsm-deploy.8")
  220  original = path.read_text(encoding="utf-8")
  221  updated = original
  222  old_audit = r""".TP
  223  .B \-\-ssh-audit
  224  Contrôler en lecture seule les empreintes de clés autorisées, la configuration
  225  SSH, sudo et l'accès par clé au compte ajlsm.
  226  """
  227  new_audit = r""".TP
  228  .B \-\-ssh-audit
  229  Identifier la VM Proxmox concernée, synchroniser sa clé d'hôte SSH ED25519
  230  dans /root/.ssh/known_hosts sur Saturne3, puis contrôler les clés autorisées,
  231  la configuration SSH, sudo et l'accès par clé au compte ajlsm.
  232  .PP
  233  Avant l'audit, la clé publique ED25519 est récupérée directement dans
  234  l'invité via l'agent QEMU, puis comparée à la clé présentée sur le réseau
  235  par ssh-keyscan. La structure de la clé est vérifiée. Une clé malformée,
  236  une divergence ou une récupération impossible provoque un refus.
  237  .PP
  238  Lorsque les clés correspondent, le programme peut actualiser
  239  /root/.ssh/known_hosts après sauvegarde. Les anciennes entrées associées
  240  à l'adresse IP, y compris les entrées hachées, sont supprimées de la copie
  241  de travail avant insertion de la clé vérifiée. Les autres entrées sont
  242  conservées. Le remplacement est atomique.
  243  .PP
  244  L'audit de la configuration SSH dans l'invité est en lecture seule,
  245  mais la synchronisation préalable peut modifier known_hosts sur Saturne3.
  246  """
  247  old_examples = r"""\&./ajlsm-deploy projet-test.yaml --root-grow-apply
  248  \&./ajlsm-deploy projet-test.yaml --ssh-audit
  249  \&./ajlsm-deploy projet-test.yaml --ssh-secure
  250  \&./ajlsm-deploy projet-test.yaml --password-ajlsm
  251  \&./ajlsm-deploy projet-test.yaml --tls-apply
  252  \&./ajlsm-deploy projet-test.yaml --system-dry-run
  253  \&./ajlsm-deploy projet-test.yaml --system-apply
  254  \&./ajlsm-deploy projet-test.yaml --network-dry-run
  255  \&./ajlsm-deploy projet-test.yaml --network-apply
  256  \&./ajlsm-deploy projet-test.yaml --network-enable-dry-run
  257  \&./ajlsm-deploy projet-test.yaml --network-enable
  258  """
  259  new_examples = r"""\&./ajlsm-deploy projet-test.yaml --root-grow-apply
  260  \&./ajlsm-deploy projet-test.yaml --system-dry-run
  261  \&./ajlsm-deploy projet-test.yaml --system-apply
  262  \&./ajlsm-deploy projet-test.yaml --network-dry-run
  263  \&./ajlsm-deploy projet-test.yaml --network-apply
  264  \&./ajlsm-deploy projet-test.yaml --network-enable-dry-run
  265  \&./ajlsm-deploy projet-test.yaml --network-enable
  266  \&./ajlsm-deploy projet-test.yaml --ssh-audit
  267  \&./ajlsm-deploy projet-test.yaml --ssh-secure
  268  \&./ajlsm-deploy projet-test.yaml --ssh-audit
  269  \&./ajlsm-deploy projet-test.yaml --password-ajlsm
  270  \&./ajlsm-deploy projet-test.yaml --tls-apply
  271  """
  272  old_limit = r"""L'absence de réponse ARP ne garantit pas qu'une IP est libre, et ne
  273  remplace
  274  pas l'inventaire réseau. Le repli réseau nécessite
  275  une recette sur une VM dédiée.
  276  """
  277  new_limit = r"""L'absence de réponse ARP ne garantit pas qu'une IP est libre, et ne
  278  remplace
  279  pas l'inventaire réseau. Le repli réseau nécessite
  280  une recette sur une VM dédiée.
  281  .PP
  282  La synchronisation des clés SSH a été validée par tests fonctionnels
  283  isolés le 15 octobre 2026 : clés concordantes, divergentes et malformées,
  284  préservation de known_hosts en cas de refus. Elle reste à confirmer
  285  lors d'un nouveau déploiement complet sur une VM réelle.
  286  """
  287  replacements = [
  288      ("section SSH", old_audit, new_audit),
  289      ("ordre des exemples", old_examples, new_examples),
  290      ("limites et validation", old_limit, new_limit),
  291  ]
  292  for label, old, new in replacements:
  293      count = updated.count(old)
  294      if count != 1:
  295          raise SystemExit(
  296              f"ERREUR : section '{label}' trouvée {count} fois. "
  297              "Aucune modification effectuée."
  298          )
  299      updated = updated.replace(old, new, 1)
  300  backup = path.with_name(
  301      path.name + ".bak-" + datetime.now().strftime("%Y%m%d-%H%M%S")
  302  )
  303  shutil.copy2(path, backup)
  304  path.write_text(updated, encoding="utf-8")
  305  print("Manuel actualisé :", path)
  306  print("Sauvegarde      :", backup)
  307  print("Sections modifiées : SSH, exemples, limites.")
  308  PY
  309  man 8 ajlsm-deploy
  310  man 8 ajlsm-deploy | col -b | grep -n -E  'known_hosts|ssh-keyscan|ED25519|déploiement complet'
  311  mkdir -p /root/ajlsm-deploy-review/sauvegardes-man
  312  mv /usr/local/man/man8/ajlsm-deploy.8.bak-20261015-235157    /root/ajlsm-deploy-review/sauvegardes-man/
  313  man 8 ajlsm-deploy >/dev/null
  314  echo "=== INTERFACES RESEAU ==="
  315  ip -br -4 addr
  316  echo
  317  echo "=== ROUTE VERS EOLE3 ==="
  318  ip route get 192.168.123.202
  319  ip route get 51.178.110.230
  320  echo
  321  echo "=== MONTAGES NFS ==="
  322  findmnt -t nfs,nfs4 -o SOURCE,TARGET,FSTYPE,OPTIONS
  323  echo
  324  echo "=== CONNEXIONS ACTIVES VERS EOLE3 ==="
  325  ss -tn state established | grep -E  '192\.168\.123\.202|51\.178\.110\.230' || true
  326  echo
  327  echo "=== STOCKAGES PROXMOX ==="
  328  pvesm status
  329  echo "=== REFERENCES A EOLE3 DANS LES TACHES CRON ==="
  330  grep -RInE  'eole3|51\.178\.110\.230|192\.168\.123\.202'  /etc/cron.d /etc/crontab /var/spool/cron/crontabs  2>/dev/null || true
  331  echo
  332  echo "=== REFERENCES A EOLE3 DANS LES SCRIPTS LOCAUX ==="
  333  grep -RInE  'eole3|51\.178\.110\.230|192\.168\.123\.202'  /usr/local/sbin /usr/local/bin  2>/dev/null | head -60
  334  echo
  335  echo "=== TIMERS SYSTEMD ==="
  336  systemctl list-timers --all --no-pager
  337  exit
  338  qm status 505
  339  qm config 505
  340  qm set 505 --onboot 0
  341  qm shutdown 505 --timeout 120
  342  qm status 505
  343  PROJET_YAML=/etc/ajlsm/deploy/projets/mercure3.yaml
  344  ./ajlsm-deploy "$PROJET_YAML" --clone
  345  history
root@Saturne3:~# cd  /usr/local/sbin
root@Saturne3:/usr/local/sbin# ls -la
total 216
drwxr-xr-x  3 root root  4096 Oct 15 23:50 .
drwxr-xr-x 11 root root  4096 Mar 27  2026 ..
-rw-r--r--  1 root root 10453 Oct 15 23:44 README-ajlsm-deploy
drwxr-xr-x  2 root root  4096 Oct 15 23:26 __pycache__
-rwxr-x---  1 root root 66119 Oct 15 23:17 ajlsm-deploy
-rwxr-xr-x  1 root root 11954 Oct 15 21:41 ajlsm-deploy-check
-rwxr-xr-x  1 root root  6874 Oct 15 21:41 ajlsm-deploy-resources
-rwxr-xr-x  1 root root  2945 Oct 15 11:19 ajlsm-deploy.avant-clonage
-rwxr-xr-x  1 root root 10383 Oct 15 12:05 ajlsm-deploy.avant-first-boot
-rwxr-xr-x  1 root root  9664 Oct 15 11:51 ajlsm-deploy.avant-integration-ressources
-rwxr-x---  1 root root 18851 Oct 15 12:51 ajlsm-deploy.bak-20261015
-rw-r--r--  1 root root 10349 Oct 15 21:41 ajlsm_deploy_common.py
-rw-r--r--  1 root root  9595 Oct 15 23:26 ajlsm_deploy_postconfig.py
-rw-r--r--  1 root root  6192 Oct 15 22:14 ajlsm_deploy_rootgrow.py
-rwx------  1 root root  863 Apr 20 11:03 backup_pbs_saturne3.sh
-rwx------  1 root root  5289 Oct 14 12:55 supervision_rapport.sh
-rwxr-x---  1 root root  4112 Oct 14 12:23 supervision_updates.sh
-rw-r--r--  1 root root  1673 Oct 13 17:15 supervision_updates_collect.py
root@Saturne3:/usr/local/sbin# ./ajlsm-deploy "$PROJET_YAML" --clone
=== PRÉCONTRÔLES ===
[OK] Configuration YAML chargée
=== CONTRÔLES PROXMOX ===
[OK] VM source 506 présente
[OK] VM source 506 arrêtée
[OK] QEMU Guest Agent activé dans la configuration
[OK] Disque source scsi0 : 32 Gio
[OK] Prochain VMID proposé : 511 (non réservé)
[OK] CPU : 1 socket(s) × 8 cœur(s) = 8 vCPU
[OK] RAM : 16384 à 24576 Mio
[OK] Stockage local-zfs actif
[OK] Disque demandé : 100 Gio
[OK] Tags : interne
=== CONTRÔLES RÉSEAU ===
[OK] Bridge vmbr2 présent
[OK] net0 / ens18 : 10.0.0.43/24
[OK] Bridge vmbr1 présent
[OK] net1 / ens19 : 192.168.123.27/24
[OK] IP loopback : 51.83.117.113/32
[OK] Passerelle : 10.0.0.4 via ens18
[OK] DNS : 10.0.0.4
[AVERTISSEMENT] Disponibilité réelle des IP non vérifiée sur le réseau
=== BILAN ===
Erreurs : 0
Avertissements : 1
Précontrôles satisfaits. Aucune modification effectuée.
Commande suggérée (à lancer manuellement) :
/usr/local/sbin/ajlsm-deploy /etc/ajlsm/deploy/projets/mercure3.yaml --dry-run
[ERREUR] Une VM nommée MERCURE3 existe déjà :
  VMID 505 : stopped
root@Saturne3:/usr/local/sbin# qm destroy 505
qm config 505
Configuration file 'nodes/Saturne3/qemu-server/505.conf' does not exist
root@Saturne3:/usr/local/sbin# ./ajlsm-deploy /etc/ajlsm/deploy/projets/mercure3.yaml --clone
=== PRÉCONTRÔLES ===
[OK] Configuration YAML chargée
=== CONTRÔLES PROXMOX ===
[OK] VM source 506 présente
[OK] VM source 506 arrêtée
[OK] QEMU Guest Agent activé dans la configuration
[OK] Disque source scsi0 : 32 Gio
[OK] Prochain VMID proposé : 505 (non réservé)
[OK] CPU : 1 socket(s) × 8 cœur(s) = 8 vCPU
[OK] RAM : 16384 à 24576 Mio
[OK] Stockage local-zfs actif
[OK] Disque demandé : 100 Gio
[OK] Tags : interne
=== CONTRÔLES RÉSEAU ===
[OK] Bridge vmbr2 présent
[OK] net0 / ens18 : 10.0.0.43/24
[OK] Bridge vmbr1 présent
[OK] net1 / ens19 : 192.168.123.27/24
[OK] IP loopback : 51.83.117.113/32
[OK] Passerelle : 10.0.0.4 via ens18
[OK] DNS : 10.0.0.4
[AVERTISSEMENT] Disponibilité réelle des IP non vérifiée sur le réseau
=== BILAN ===
Erreurs : 0
Avertissements : 1
Précontrôles satisfaits. Aucune modification effectuée.
Commande suggérée (à lancer manuellement) :
/usr/local/sbin/ajlsm-deploy /etc/ajlsm/deploy/projets/mercure3.yaml --dry-run
=== PLAN DE CLONAGE ===
Source  : VM 506
Clone    : MERCURE3
VMID    : 505
Stockage : local-zfs
Type    : clone complet
Réseau  : isolation avant premier démarrage
Onboot  : désactivé
Démarrage: aucun
Pour créer la VM 505, confirmer (OUI/NON) : oui
[ACTION] Clonage en cours...
[OK] VM 505 créée
[ACTION] Isolation de net0
[ACTION] Isolation de net1
[OK] Adresses MAC du clone distinctes de TEMPLATE3
[OK] Clone arrêté
[OK] Démarrage automatique désactivé
[OK] Toutes les interfaces réseau isolées
=== CLONAGE TERMINÉ ===
VM 505 : MERCURE3
État : arrêtée, réseau isolé, onboot=0
Aucun démarrage effectué.
Prochaine phase : ressources CPU/RAM/disque.
Commande suggérée (à lancer manuellement) :
/usr/local/sbin/ajlsm-deploy /etc/ajlsm/deploy/projets/mercure3.yaml --resources-dry-run
root@Saturne3:/usr/local/sbin# /usr/local/sbin/ajlsm-deploy /etc/ajlsm/deploy/projets/mercure3.yaml --resources-dry-run
=== RESSOURCES : MERCURE3 (VM 505) ===
[OK] VM arrêtée, réseau isolé, onboot=0
[MODIFICATION] CPU : 2 x 4 -> 1 x 8
[MODIFICATION] RAM : 8192 -> 24576 Mio ; balloon : non défini -> 16384 Mio
[MODIFICATION] Disque scsi0 : 32 -> 100 Gio
[DRY-RUN] Aucune modification effectuée.
Commande suggérée (à lancer manuellement) :
/usr/local/sbin/ajlsm-deploy /etc/ajlsm/deploy/projets/mercure3.yaml --configure-resources
root@Saturne3:/usr/local/sbin# /usr/local/sbin/ajlsm-deploy /etc/ajlsm/deploy/projets/mercure3.yaml --configure-resources
=== RESSOURCES : MERCURE3 (VM 505) ===
[OK] VM arrêtée, réseau isolé, onboot=0
[MODIFICATION] CPU : 2 x 4 -> 1 x 8
[MODIFICATION] RAM : 8192 -> 24576 Mio ; balloon : non défini -> 16384 Mio
[MODIFICATION] Disque scsi0 : 32 -> 100 Gio
Pour appliquer les ressources à la VM 505, confirmer (OUI/NON) : oui
[ACTION] CPU : 2 x 4 -> 1 x 8
[ACTION] RAM : 8192 -> 24576 Mio ; balloon : non défini -> 16384 Mio
[ACTION] Disque scsi0 : 32 -> 100 Gio
[OK] Ressources configurées et vérifiées.
[OK] VM toujours arrêtée et réseau isolé.
Commande suggérée (à lancer manuellement) :
/usr/local/sbin/ajlsm-deploy /etc/ajlsm/deploy/projets/mercure3.yaml --first-boot-dry-run
root@Saturne3:/usr/local/sbin# /usr/local/sbin/ajlsm-deploy /etc/ajlsm/deploy/projets/mercure3.yaml --first-boot-apply
=== PREMIER DÉMARRAGE : MERCURE3 (VM 505) ===
[OK] Démarrage automatique désactivé, interfaces isolées
État actuel : stopped
Pour démarrer la VM 505 avec le réseau isolé, confirmer (OUI/NON) : oui
[ACTION] Démarrage de la VM 505 avec interfaces isolées
[OK] Agent QEMU disponible
[OK] ajlsm-clone-init terminé avec succès
[OK] UUID matériel conforme : ab93f3d0-c137-428c-acad-81f3196329c6
[OK] Phase de premier démarrage validée ; interfaces toujours isolées
Commande suggérée (à lancer manuellement) :
/usr/local/sbin/ajlsm-deploy /etc/ajlsm/deploy/projets/mercure3.yaml --system-dry-run
root@Saturne3:/usr/local/sbin# /usr/local/sbin/ajlsm-deploy /etc/ajlsm/deploy/projets/mercure3.yaml --system-dry-run
[OK] Agent QEMU disponible
[OK] ajlsm-clone-init terminé avec succès
Cible : MERCURE3 VM505, UUID ab93f3d0-c137-428c-acad-81f3196329c6, hostname mercure3.ajlsm.com
État de reprise : nouvelle transaction
[DRY-RUN] Sauvegarder hostname, hosts et les deux machine-id dans l'invité
[DRY-RUN] Préparer une identité aléatoire persistante, puis redémarrer isolé
[DRY-RUN] Vérifier boot_id, identité PID1, hostname, hosts et isolation
Commande suggérée (à lancer manuellement) :
/usr/local/sbin/ajlsm-deploy /etc/ajlsm/deploy/projets/mercure3.yaml --system-apply
root@Saturne3:/usr/local/sbin# /usr/local/sbin/ajlsm-deploy /etc/ajlsm/deploy/projets/mercure3.yaml --system-apply
[OK] Agent QEMU disponible
[OK] ajlsm-clone-init terminé avec succès
Cible : MERCURE3 VM505, UUID ab93f3d0-c137-428c-acad-81f3196329c6, hostname mercure3.ajlsm.com
État de reprise : nouvelle transaction
Cible : VM505 — mercure3.ajlsm.com
Cette opération modifiera l’identité système et redémarrera la VM avec le réseau isolé.
Confirmer (OUI/NON) : oui
[ACTION] Identité disque préparée ; identité active non encore validée
[OK] Agent QEMU disponible
[OK] ajlsm-clone-init terminé avec succès
[OK] Nouveau démarrage et identité active vérifiés ; VM505 toujours isolée
Commande suggérée (à lancer manuellement) :
/usr/local/sbin/ajlsm-deploy /etc/ajlsm/deploy/projets/mercure3.yaml --network-dry-run
root@Saturne3:/usr/local/sbin# /usr/local/sbin/ajlsm-deploy /etc/ajlsm/deploy/projets/mercure3.yaml --network-dry
[OK] Agent QEMU disponible
[OK] ajlsm-clone-init terminé avec succès
Cible : MERCURE3 VM505 ; reseau Proxmox isole
  ens18: 10.0.0.43/24
  ens19: 192.168.123.27/24
  lo: 51.83.117.113/32 ; passerelle: 10.0.0.4 (ens18) ; DNS: 10.0.0.4
[DRY-RUN] Sauvegarder le Netplan initial, ecrire la configuration et executer netplan generate
[DRY-RUN] Aucune modification ni activation reseau
[OK] Déploiement terminé ; procéder aux vérifications finales du manuel.
root@Saturne3:/usr/local/sbin# /usr/local/sbin/ajlsm-deploy /etc/ajlsm/deploy/projets/mercure3.yaml --network-apply
[OK] Agent QEMU disponible
[OK] ajlsm-clone-init terminé avec succès
Cible : MERCURE3 VM505 ; reseau Proxmox isole
  ens18: 10.0.0.43/24
  ens19: 192.168.123.27/24
  lo: 51.83.117.113/32 ; passerelle: 10.0.0.4 (ens18) ; DNS: 10.0.0.4
Cette operation remplace Netplan dans l'invite, sans activer les interfaces Proxmox.
Confirmer (OUI/NON) : oui
[OK] Netplan ecrit et netplan generate valide : {"changed": true, "backup": true}
[OK] VM505 toujours isolee ; aucune activation des liens
Commande suggérée (à lancer manuellement) :
/usr/local/sbin/ajlsm-deploy /etc/ajlsm/deploy/projets/mercure3.yaml --network-enable-dry-run
root@Saturne3:/usr/local/sbin# /usr/local/sbin/ajlsm-deploy /etc/ajlsm/deploy/projets/mercure3.yaml --network-enable
[OK] Agent QEMU disponible
[OK] ajlsm-clone-init terminé avec succès
[OK] ARP DAD 10.0.0.43 sur vmbr2 (aucune reponse)
[OK] ARP DAD 192.168.123.27 sur vmbr1 (aucune reponse)
[OK] VM505 UUID=ab93f3d0-c137-428c-acad-81f3196329c6, clone et Netplan valides, reseau isole
Activer le reseau de cette VM (OUI/NON) : oui
[OK] ARP DAD 10.0.0.43 sur vmbr2 (aucune reponse)
[OK] ARP DAD 192.168.123.27 sur vmbr1 (aucune reponse)
[OK] Adresses, loopback, route, DNS et ping passerelle valides
[OK] VM505 : reseau actif et controle, onboot conforme au YAML
Commande suggérée (à lancer manuellement) :
/usr/local/sbin/ajlsm-deploy /etc/ajlsm/deploy/projets/mercure3.yaml --ssh-audit
root@Saturne3:/usr/local/sbin# /usr/local/sbin/ajlsm-deploy /etc/ajlsm/deploy/projets/mercure3.yaml --ssh-audit
[OK] Clé ED25519 vérifiée via QEMU : 10.0.0.43
[OK] known_hosts actualisé avec sauvegarde conservée
=== Contrôle SSH, sans modification ===
Identité : mercure3.ajlsm.com
Clés autorisées ajlsm :
4096 SHA256:zGdW2VjyzL/p30BjtNy6dzXIahBWTH9djZLc62IKCAk siva@MacBook-Pro-de-Sivakavi.local (RSA)
256 SHA256:lVtwxE0No+RZNyOXpf64JBCnMYIk9YaMw43clCV92hk jlarvers@MacBook-Pro.lan (ED25519)
256 SHA256:HAHGVQ2Afy6vGJpLhJ2vftXonwV31QNOiFHH6t5BfB4 modou-mbp (ED25519)
Configuration effective SSH :
permitrootlogin prohibit-password
pubkeyauthentication yes
passwordauthentication yes
kbdinteractiveauthentication no
Règles sudo pour ajlsm :
User ajlsm may run the following commands on mercure3.ajlsm.com:
    (ALL : ALL) ALL
Etat du mot de passe ajlsm :
ajlsm P 2026-05-22 0 99999 7 -1
[OK] Connexion ajlsm par clé vérifiée.
Commande suggérée (à lancer manuellement) :
/usr/local/sbin/ajlsm-deploy /etc/ajlsm/deploy/projets/mercure3.yaml --ssh-secure
root@Saturne3:/usr/local/sbin# /usr/local/sbin/ajlsm-deploy /etc/ajlsm/deploy/projets/mercure3.yaml --ssh-secure
=== Contrôle SSH, sans modification ===
Identité : mercure3.ajlsm.com
Clés autorisées ajlsm :
4096 SHA256:zGdW2VjyzL/p30BjtNy6dzXIahBWTH9djZLc62IKCAk siva@MacBook-Pro-de-Sivakavi.local (RSA)
256 SHA256:lVtwxE0No+RZNyOXpf64JBCnMYIk9YaMw43clCV92hk jlarvers@MacBook-Pro.lan (ED25519)
256 SHA256:HAHGVQ2Afy6vGJpLhJ2vftXonwV31QNOiFHH6t5BfB4 modou-mbp (ED25519)
Configuration effective SSH :
permitrootlogin prohibit-password
pubkeyauthentication yes
passwordauthentication yes
kbdinteractiveauthentication no
Règles sudo pour ajlsm :
User ajlsm may run the following commands on mercure3.ajlsm.com:
    (ALL : ALL) ALL
Etat du mot de passe ajlsm :
ajlsm P 2026-05-22 0 99999 7 -1
[OK] Connexion ajlsm par clé vérifiée.
Appliquer PasswordAuthentication no et root par clé seulement [oui/non] : oui
[OK] SSH sécurisé ; root reste autorisé par clé.
[OK] Connexions root et ajlsm par clé toujours fonctionnelles.
Commande suggérée (à lancer manuellement) :
/usr/local/sbin/ajlsm-deploy /etc/ajlsm/deploy/projets/mercure3.yaml --password-ajlsm
root@Saturne3:/usr/local/sbin# /usr/local/sbin/ajlsm-deploy /etc/ajlsm/deploy/projets/mercure3.yaml --password-ajlsm
Ouvrir passwd ajlsm sur MERCURE3 [oui/non] : oui
Le mot de passe sera demandé deux fois par passwd sur la VM.
Il ne sera pas enregistré dans le script. Le reporter manuellement dans le fichier ODS.
New password:
Retype new password:
passwd: password updated successfully
Connection to 10.0.0.43 closed.
[OK] Mot de passe ajlsm modifié ; vérifier ensuite sudo -i depuis ajlsm.
Commande suggérée (à lancer manuellement) :
/usr/local/sbin/ajlsm-deploy /etc/ajlsm/deploy/projets/mercure3.yaml --tls-apply
root@Saturne3:/usr/local/sbin# /usr/local/sbin/ajlsm-deploy /etc/ajlsm/deploy/projets/mercure3.yaml --tls-apply
mercure3.ajlsm.com
subject=CN=clone-ab93f3d0-c13.internal
X509v3 Subject Alternative Name:
    DNS:clone-ab93f3d0-c13.internal
Initialiser le certificat TLS interne [oui/non] : oui
Initialisation TLS pour : mercure3.ajlsm.com
....++++++++++++++++++++++++++++++++++++++++++*..+...++++++++++++++++++++++++++++++++++++++++++*........+............+...+.............+..+.......+.....................+..+............+.+.....+.+...+..+.+...+...........+.+...............+..............+.........+....+.....+.+.........+....................+...+..........+..............+.+.....+...+++++
...........+..+...+.............+.....+....+..+......+.........+......+.......++++++++++++++++++++++++++++++++++++++++++*.........++++++++++++++++++++++++++++++++++++++++++*....................+................+...+......+.....+....+.....+.........+...+....+...+..+..........+.........+.........+..+....+++++
-----
Syntax OK
Initialisation TLS terminée.
Sauvegarde : /etc/ssl/ajlsm/backup.8vB54QHP
subject=CN=mercure3.ajlsm.com
notBefore=Oct 16 13:54:38 2026 GMT
notAfter=Oct 13 13:54:38 2036 GMT
subject=CN=mercure3.ajlsm.com
X509v3 Subject Alternative Name:
    DNS:mercure3.ajlsm.com
active
[OK] Phases techniques terminées ; les opérations applicatives seront traitées séparément.
root@Saturne3:/usr/local/sbin#
root@Saturne3:/usr/local/sbin#
root@Saturne3:/usr/local/sbin#
root@Saturne3:/usr/local/sbin#
root@Saturne3:/usr/local/sbin#
root@Saturne3:/usr/local/sbin#
root@Saturne3:/usr/local/sbin#
root@Saturne3:/usr/local/sbin#
root@Saturne3:/usr/local/sbin#
root@Saturne3:/usr/local/sbin# ssh ajlsm@10.0.0.43
sudo -i
hostname
lsblk
df -hT /
Welcome to Ubuntu 26.04.1 LTS (GNU/Linux 7.0.0-38-generic x86_64)
* Documentation:  https://docs.ubuntu.com
* Management:    https://landscape.canonical.com
* Support:        https://ubuntu.com/pro
System information as of Fri Oct 16 03:56:00 PM CEST 2026
  System load:  0.35              Processes:              190
  Usage of /:  54.2% of 14.66GB  Users logged in:        0
  Memory usage: 3%                IPv4 address for ens18: 10.0.0.43
  Swap usage:  0%
* Canonical Workshop gives developers fast, composable, reproducible, and
  secure developer environments that are perfect for agentic workflows.
  https://ubuntu.com/workshop
Expanded Security Maintenance for Applications is not enabled.
1 update can be applied immediately.
To see these additional updates run: apt list --upgradable
9 additional security updates can be applied with ESM Apps.
Learn more about enabling ESM Apps service at https://ubuntu.com/esm
You have new mail.
Last login: Thu Oct 15 08:18:27 2026 from 10.40.0.2
ajlsm@mercure3:~$ sudo -i
[sudo: authenticate] Password:                   
root@mercure3:~# hostname
lsblk
df -hT /
mercure3.ajlsm.com
NAME                      MAJ:MIN RM  SIZE RO TYPE MOUNTPOINTS
sda                        8:0    0  100G  0 disk
├─sda1                      8:1    0    1M  0 part
├─sda2                      8:2    0    2G  0 part /boot
└─sda3                      8:3    0  30G  0 part
  └─ubuntu--vg-ubuntu--lv 252:0    0  15G  0 lvm  /
Filesystem                        Type  Size  Used Avail Use% Mounted on
/dev/mapper/ubuntu--vg-ubuntu--lv ext4  15G  8.0G  6.0G  58% /
root@mercure3:~# pvs
vgs
lvs -o lv_path,lv_size,vg_name
findmnt -no SOURCE,FSTYPE /
command -v growpart
  PV        VG        Fmt  Attr PSize  PFree
  /dev/sda3  ubuntu-vg lvm2 a--  <30.00g 15.00g
  VG        #PV #LV #SN Attr  VSize  VFree
  ubuntu-vg  1  1  0 wz--n- <30.00g 15.00g
  Path                    LSize  VG     
  /dev/ubuntu-vg/ubuntu-lv <15.00g ubuntu-vg
/dev/mapper/ubuntu--vg-ubuntu--lv ext4
/usr/bin/growpart
root@mercure3:~#
root@mercure3:~# lsblk
pvs
vgs
df -hT /
NAME                      MAJ:MIN RM  SIZE RO TYPE MOUNTPOINTS
sda                        8:0    0  100G  0 disk
├─sda1                      8:1    0    1M  0 part
├─sda2                      8:2    0    2G  0 part /boot
└─sda3                      8:3    0  30G  0 part
  └─ubuntu--vg-ubuntu--lv 252:0    0  15G  0 lvm  /
  PV        VG        Fmt  Attr PSize  PFree
  /dev/sda3  ubuntu-vg lvm2 a--  <30.00g 15.00g
  VG        #PV #LV #SN Attr  VSize  VFree
  ubuntu-vg  1  1  0 wz--n- <30.00g 15.00g
Filesystem                        Type  Size  Used Avail Use% Mounted on
/dev/mapper/ubuntu--vg-ubuntu--lv ext4  15G  8.0G  6.0G  58% /
root@mercure3:~# growpart /dev/sda 3
CHANGED: partition=3 start=4198400 old: size=62908416 end=67106815 new: size=205516767 end=209715166
root@mercure3:~# /usr/local/sbin/ajlsm-deploy --help
-bash: /usr/local/sbin/ajlsm-deploy: No such file or directory
root@mercure3:~# exit
logout
ajlsm@mercure3:~$ exit
logout
Connection to 10.0.0.43 closed.
root@Saturne3:~# /usr/local/sbin/ajlsm-deploy /etc/ajlsm/deploy/projets/mercure3.yaml --root-grow-apply
=== EXTENSION RACINE : VM 505 (APPLY) ===
Étendre la partition, le LVM et ext4 de la VM 505 [OUI/NON] : oui
[ETAT] {"disk_bytes": 107374182400, "grow_partition": false, "lv": "/dev/ubuntu-vg/ubuntu-lv", "partition_free_bytes_approx": 16896, "pv": "/dev/sda3", "root": "/dev/mapper/ubuntu--vg-ubuntu--lv ext4", "vg": "ubuntu-vg", "vg_free_bytes": 89120571392}
[ACTION] pvresize /dev/sda3
[ACTION] lvextend -r -l +100%FREE /dev/ubuntu-vg/ubuntu-lv
[OK] Extension racine vérifiée : Filesystem                        Type  Size  Used Avail Use% Mounted on
/dev/mapper/ubuntu--vg-ubuntu--lv ext4  97G  8.0G  85G  9% /
Commande suggérée (à lancer manuellement) :
/usr/local/sbin/ajlsm-deploy /etc/ajlsm/deploy/projets/mercure3.yaml --system-apply
[OK] Déploiement terminé ; procéder aux vérifications finales du manuel.
root@Saturne3:~# Read from remote host 141.95.206.118: Connection reset by peer
Connection to 141.95.206.118 closed.
client_loop: send disconnect: Broken pipe
jlarvers@MacBook-Pro ~ % ssh saturne3
Linux Saturne3 7.0.14-23-pve #1 SMP PREEMPT_DYNAMIC PMX 7.0.14-23 (2026-10-07T20:25Z) x86_64
The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.
Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
Last login: Fri Oct 16 16:02:53 2026 from 109.190.129.96
root@Saturne3:~# ls -la
total 208
drwx------  9 root root  4096 Oct 16 16:44  .
drwxr-xr-x 18 root root  4096 Apr  1  2026  ..
-rw-------  1 root root 14581 Oct 16 16:36  .bash_history
-rw-r--r--  1 root root  607 Mar  2  2026  .bashrc
drwxr-xr-x  3 root root  4096 Apr  2  2026  .cache
drwx------  5 root root  4096 Apr 20 10:28  .config
-rw-r--r--  1 root root    35 Apr 30 11:01  .forward
-rw-------  1 root root    28 Oct 15 23:52  .lesshst
drwxr-xr-x  3 root root  4096 Apr  1  2026  .local
-rw-r--r--  1 root root    50 Apr  1  2026  .ovhrc
-rw-------  1 root root    37 Apr 20 11:05  .pbs_token_saturne3
-rw-r--r--  1 root root  132 Mar  2  2026  .profile
-rw-------  1 root root  1024 Apr  1  2026  .rnd
-rw-r--r--  1 root root    75 Apr 20 10:24  .selected_editor
drwx------  2 root root  4096 Oct 16 15:53  .ssh
-rw-------  1 root root 16696 Oct 15 23:50  .viminfo
-rw-r--r--  1 root root 32718 Oct 16 16:06  ajlsm-deploy-actuel.tar.gz
-rw-r--r--  1 root root 46186 Oct 16 16:44  ajlsm-deploy-cycle.zip
drwxr-x---  8 root root  4096 Oct 15 23:53  ajlsm-deploy-review
-rw-------  1 root root  161 Apr  2  2026  dead.letter
drwxr-xr-x  6 root root  4096 Oct 14 13:16  export-supervision-svn
-rw-r--r--  1 root root 12216 Oct 15 23:52 'm-deploy | col -b | grep -n -E '
-rw-r--r--  1 root root  4680 Oct 14 13:19  supervision-ajlsm-2026-10-14.tar.gz
drwxr-xr-x  2 root root  4096 Oct 13 17:15  supervision-test
root@Saturne3:~# mkdir -p /root/ajlsm-deploy/archives
mkdir -p /root/ajlsm-deploy/recettes/20261016
mv /root/ajlsm-deploy-actuel.tar.gz /root/ajlsm-deploy/archives/
mv /root/ajlsm-deploy-cycle.zip /root/ajlsm-deploy/archives/
unzip /root/ajlsm-deploy/archives/ajlsm-deploy-cycle.zip \
  -d /root/ajlsm-deploy/recettes/20261016
cd /root/ajlsm-deploy/recettes/20261016/ajlsm-deploy-cycle
chmod 750 ajlsm-deploy ajlsm-deploy-check ajlsm-deploy-resources ajlsm-deploy-cycle
-bash: unzip: command not found
-bash: cd: /root/ajlsm-deploy/recettes/20261016/ajlsm-deploy-cycle: No such file or directory
chmod: cannot access 'ajlsm-deploy-check': No such file or directory
chmod: cannot access 'ajlsm-deploy-resources': No such file or directory
chmod: cannot access 'ajlsm-deploy-cycle': No such file or directory
root@Saturne3:~# mkdir -p /root/ajlsm-deploy/archives
mkdir -p /root/ajlsm-deploy/recettes/20261016
mv /root/ajlsm-deploy-actuel.tar.gz /root/ajlsm-deploy/archives/
mv /root/ajlsm-deploy-cycle.zip /root/ajlsm-deploy/archives/
unzip /root/ajlsm-deploy/archives/ajlsm-deploy-cycle.zip \
  -d /root/ajlsm-deploy/recettes/20261016
cd /root/ajlsm-deploy/recettes/20261016/ajlsm-deploy-cycle
chmod 750 ajlsm-deploy ajlsm-deploy-check ajlsm-deploy-resources ajlsm-deploy-cycle
mv: cannot stat '/root/ajlsm-deploy-actuel.tar.gz': No such file or directory
mv: cannot stat '/root/ajlsm-deploy-cycle.zip': No such file or directory
-bash: unzip: command not found
-bash: cd: /root/ajlsm-deploy/recettes/20261016/ajlsm-deploy-cycle: No such file or directory
chmod: cannot access 'ajlsm-deploy-check': No such file or directory
chmod: cannot access 'ajlsm-deploy-resources': No such file or directory
chmod: cannot access 'ajlsm-deploy-cycle': No such file or directory
root@Saturne3:~# python3 -m zipfile -e \
  /root/ajlsm-deploy/archives/ajlsm-deploy-cycle.zip \
  /root/ajlsm-deploy/recettes/20261016 &&
cd /root/ajlsm-deploy/recettes/20261016/ajlsm-deploy-cycle &&
chmod 750 ajlsm-deploy ajlsm-deploy-check ajlsm-deploy-resources ajlsm-deploy-cycle &&
./ajlsm-deploy-cycle /etc/ajlsm/deploy/projets/mercure3.yaml --plan
=== ÉTAPE 1/11 : clonage ===
/usr/bin/python3 /root/ajlsm-deploy/recettes/20261016/ajlsm-deploy-cycle/ajlsm-deploy /etc/ajlsm/deploy/projets/mercure3.yaml --clone --agent-timeout 300
=== ÉTAPE 2/11 : ressources ===
/usr/bin/python3 /root/ajlsm-deploy/recettes/20261016/ajlsm-deploy-cycle/ajlsm-deploy /etc/ajlsm/deploy/projets/mercure3.yaml --configure-resources --agent-timeout 300
=== ÉTAPE 3/11 : premier-demarrage ===
/usr/bin/python3 /root/ajlsm-deploy/recettes/20261016/ajlsm-deploy-cycle/ajlsm-deploy /etc/ajlsm/deploy/projets/mercure3.yaml --first-boot-apply --agent-timeout 300
=== ÉTAPE 4/11 : extension-racine ===
/usr/bin/python3 /root/ajlsm-deploy/recettes/20261016/ajlsm-deploy-cycle/ajlsm-deploy /etc/ajlsm/deploy/projets/mercure3.yaml --root-grow-apply --agent-timeout 300
=== ÉTAPE 5/11 : identite ===
/usr/bin/python3 /root/ajlsm-deploy/recettes/20261016/ajlsm-deploy-cycle/ajlsm-deploy /etc/ajlsm/deploy/projets/mercure3.yaml --system-apply --agent-timeout 300
=== ÉTAPE 6/11 : netplan ===
/usr/bin/python3 /root/ajlsm-deploy/recettes/20261016/ajlsm-deploy-cycle/ajlsm-deploy /etc/ajlsm/deploy/projets/mercure3.yaml --network-apply --agent-timeout 300
=== ÉTAPE 7/11 : activation-reseau ===
/usr/bin/python3 /root/ajlsm-deploy/recettes/20261016/ajlsm-deploy-cycle/ajlsm-deploy /etc/ajlsm/deploy/projets/mercure3.yaml --network-enable --agent-timeout 300
=== ÉTAPE 8/11 : audit-ssh ===
/usr/bin/python3 /root/ajlsm-deploy/recettes/20261016/ajlsm-deploy-cycle/ajlsm-deploy /etc/ajlsm/deploy/projets/mercure3.yaml --ssh-audit --agent-timeout 300
=== ÉTAPE 9/11 : securisation-ssh ===
/usr/bin/python3 /root/ajlsm-deploy/recettes/20261016/ajlsm-deploy-cycle/ajlsm-deploy /etc/ajlsm/deploy/projets/mercure3.yaml --ssh-secure --agent-timeout 300
=== ÉTAPE 10/11 : mot-de-passe ===
/usr/bin/python3 /root/ajlsm-deploy/recettes/20261016/ajlsm-deploy-cycle/ajlsm-deploy /etc/ajlsm/deploy/projets/mercure3.yaml --password-ajlsm --agent-timeout 300
=== ÉTAPE 11/11 : tls ===
/usr/bin/python3 /root/ajlsm-deploy/recettes/20261016/ajlsm-deploy-cycle/ajlsm-deploy /etc/ajlsm/deploy/projets/mercure3.yaml --tls-apply --agent-timeout 300
[PLAN] Aucune phase exécutée.
root@Saturne3:~/ajlsm-deploy/recettes/20261016/ajlsm-deploy-cycle#
root@Saturne3:~/ajlsm-deploy/recettes/20261016/ajlsm-deploy-cycle#
root@Saturne3:~/ajlsm-deploy/recettes/20261016/ajlsm-deploy-cycle# qm config 505
agent: 1
balloon: 16384
boot: order=scsi0;net0
cores: 8
cpu: x86-64-v2-AES
memory: 24576
meta: creation-qemu=11.0.0,ctime=1779439732
name: MERCURE3
net0: virtio=BC:24:11:F6:BC:A4,bridge=vmbr2,firewall=1,link_down=0
net1: virtio=BC:24:11:A5:17:8E,bridge=vmbr1,firewall=1,link_down=0
numa: 0
onboot: 1
ostype: l26
scsi0: local-zfs:vm-505-disk-0,iothread=1,size=100G
scsihw: virtio-scsi-single
smbios1: uuid=ab93f3d0-c137-428c-acad-81f3196329c6
sockets: 1
tags: interne
vmgenid: d71326df-130f-4394-bd68-6f8c493047e1
root@Saturne3:~/ajlsm-deploy/recettes/20261016/ajlsm-deploy-cycle# qm set 505 --onboot 0 &&
qm shutdown 505 --timeout 120 &&
qm destroy 505 &&
./ajlsm-deploy-cycle /etc/ajlsm/deploy/projets/mercure3.yaml
update VM 505: -onboot 0
=== ÉTAPE 1/11 : clonage ===
/usr/bin/python3 /root/ajlsm-deploy/recettes/20261016/ajlsm-deploy-cycle/ajlsm-deploy /etc/ajlsm/deploy/projets/mercure3.yaml --clone --agent-timeout 300
=== PRÉCONTRÔLES ===
[OK] Configuration YAML chargée
=== CONTRÔLES PROXMOX ===
[OK] VM source 506 présente
[OK] VM source 506 arrêtée
[OK] QEMU Guest Agent activé dans la configuration
[OK] Disque source scsi0 : 32 Gio
[OK] Prochain VMID proposé : 505 (non réservé)
[OK] CPU : 1 socket(s) × 8 cœur(s) = 8 vCPU
[OK] RAM : 16384 à 24576 Mio
[OK] Stockage local-zfs actif
[OK] Disque demandé : 100 Gio
[OK] Tags : interne
=== CONTRÔLES RÉSEAU ===
[OK] Bridge vmbr2 présent
[OK] net0 / ens18 : 10.0.0.43/24
[OK] Bridge vmbr1 présent
[OK] net1 / ens19 : 192.168.123.27/24
[OK] IP loopback : 51.83.117.113/32
[OK] Passerelle : 10.0.0.4 via ens18
[OK] DNS : 10.0.0.4
[AVERTISSEMENT] Disponibilité réelle des IP non vérifiée sur le réseau
=== BILAN ===
Erreurs : 0
Avertissements : 1
Précontrôles satisfaits. Aucune modification effectuée.
=== PLAN DE CLONAGE ===
Source  : VM 506
Clone    : MERCURE3
VMID    : 505
Stockage : local-zfs
Type    : clone complet
Réseau  : isolation avant premier démarrage
Onboot  : désactivé
Démarrage: aucun
Pour créer la VM 505, confirmer (OUI/NON) : oui
[ACTION] Clonage en cours...
[OK] VM 505 créée
[ACTION] Isolation de net0
[ACTION] Isolation de net1
[OK] Adresses MAC du clone distinctes de TEMPLATE3
[OK] Clone arrêté
[OK] Démarrage automatique désactivé
[OK] Toutes les interfaces réseau isolées
=== CLONAGE TERMINÉ ===
VM 505 : MERCURE3
État : arrêtée, réseau isolé, onboot=0
Aucun démarrage effectué.
Prochaine phase : ressources CPU/RAM/disque.
=== ÉTAPE 2/11 : ressources ===
/usr/bin/python3 /root/ajlsm-deploy/recettes/20261016/ajlsm-deploy-cycle/ajlsm-deploy /etc/ajlsm/deploy/projets/mercure3.yaml --configure-resources --agent-timeout 300
=== RESSOURCES : MERCURE3 (VM 505) ===
[OK] VM arrêtée, réseau isolé, onboot=0
[MODIFICATION] CPU : 2 x 4 -> 1 x 8
[MODIFICATION] RAM : 8192 -> 24576 Mio ; balloon : non défini -> 16384 Mio
[MODIFICATION] Disque scsi0 : 32 -> 100 Gio
Pour appliquer les ressources à la VM 505, confirmer (OUI/NON) : oui
[ACTION] CPU : 2 x 4 -> 1 x 8
[ACTION] RAM : 8192 -> 24576 Mio ; balloon : non défini -> 16384 Mio
[ACTION] Disque scsi0 : 32 -> 100 Gio
[OK] Ressources configurées et vérifiées.
[OK] VM toujours arrêtée et réseau isolé.
=== ÉTAPE 3/11 : premier-demarrage ===
/usr/bin/python3 /root/ajlsm-deploy/recettes/20261016/ajlsm-deploy-cycle/ajlsm-deploy /etc/ajlsm/deploy/projets/mercure3.yaml --first-boot-apply --agent-timeout 300
=== PREMIER DÉMARRAGE : MERCURE3 (VM 505) ===
[OK] Démarrage automatique désactivé, interfaces isolées
État actuel : stopped
Pour démarrer la VM 505 avec le réseau isolé, confirmer (OUI/NON) : oui
[ACTION] Démarrage de la VM 505 avec interfaces isolées
[OK] Agent QEMU disponible
[OK] ajlsm-clone-init terminé avec succès
[OK] UUID matériel conforme : 89aea8cb-9fd5-4b3b-9e06-a80cfa014f5b
[OK] Phase de premier démarrage validée ; interfaces toujours isolées
=== ÉTAPE 4/11 : extension-racine ===
/usr/bin/python3 /root/ajlsm-deploy/recettes/20261016/ajlsm-deploy-cycle/ajlsm-deploy /etc/ajlsm/deploy/projets/mercure3.yaml --root-grow-apply --agent-timeout 300
=== EXTENSION RACINE : VM 505 (APPLY) ===
Étendre la partition, le LVM et ext4 de la VM 505 [OUI/NON] : oui
[ETAT] {"disk_bytes": 107374182400, "grow_partition": true, "lv": "/dev/ubuntu-vg/ubuntu-lv", "partition_free_bytes_approx": 73015492608, "pv": "/dev/sda3", "root": "/dev/mapper/ubuntu--vg-ubuntu--lv ext4", "vg": "ubuntu-vg", "vg_free_bytes": 16106127360}
[ACTION] growpart /dev/sda 3
[ACTION] pvresize /dev/sda3
[ACTION] lvextend -r -l +100%FREE /dev/ubuntu-vg/ubuntu-lv
[OK] Extension racine vérifiée : Filesystem                        Type  Size  Used Avail Use% Mounted on
/dev/mapper/ubuntu--vg-ubuntu--lv ext4  97G  8.0G  85G  9% /
=== ÉTAPE 5/11 : identite ===
/usr/bin/python3 /root/ajlsm-deploy/recettes/20261016/ajlsm-deploy-cycle/ajlsm-deploy /etc/ajlsm/deploy/projets/mercure3.yaml --system-apply --agent-timeout 300
[OK] Agent QEMU disponible
[OK] ajlsm-clone-init terminé avec succès
Cible : MERCURE3 VM505, UUID 89aea8cb-9fd5-4b3b-9e06-a80cfa014f5b, hostname mercure3.ajlsm.com
État de reprise : nouvelle transaction
Cible : VM505 — mercure3.ajlsm.com
Cette opération modifiera l’identité système et redémarrera la VM avec le réseau isolé.
Confirmer (OUI/NON) : oui
[ACTION] Identité disque préparée ; identité active non encore validée
[OK] Agent QEMU disponible
[OK] ajlsm-clone-init terminé avec succès
[OK] Nouveau démarrage et identité active vérifiés ; VM505 toujours isolée
=== ÉTAPE 6/11 : netplan ===
/usr/bin/python3 /root/ajlsm-deploy/recettes/20261016/ajlsm-deploy-cycle/ajlsm-deploy /etc/ajlsm/deploy/projets/mercure3.yaml --network-apply --agent-timeout 300
[OK] Agent QEMU disponible
[OK] ajlsm-clone-init terminé avec succès
Cible : MERCURE3 VM505 ; reseau Proxmox isole
  ens18: 10.0.0.43/24
  ens19: 192.168.123.27/24
  lo: 51.83.117.113/32 ; passerelle: 10.0.0.4 (ens18) ; DNS: 10.0.0.4
Cette operation remplace Netplan dans l'invite, sans activer les interfaces Proxmox.
Confirmer (OUI/NON) : oui
[OK] Netplan ecrit et netplan generate valide : {"changed": true, "backup": true}
[OK] VM505 toujours isolee ; aucune activation des liens
=== ÉTAPE 7/11 : activation-reseau ===
/usr/bin/python3 /root/ajlsm-deploy/recettes/20261016/ajlsm-deploy-cycle/ajlsm-deploy /etc/ajlsm/deploy/projets/mercure3.yaml --network-enable --agent-timeout 300
[OK] Agent QEMU disponible
[OK] ajlsm-clone-init terminé avec succès
[OK] ARP DAD 10.0.0.43 sur vmbr2 (aucune reponse)
[OK] ARP DAD 192.168.123.27 sur vmbr1 (aucune reponse)
[OK] VM505 UUID=89aea8cb-9fd5-4b3b-9e06-a80cfa014f5b, clone et Netplan valides, reseau isole
Activer le reseau de cette VM (OUI/NON) : oui
[OK] ARP DAD 10.0.0.43 sur vmbr2 (aucune reponse)
[OK] ARP DAD 192.168.123.27 sur vmbr1 (aucune reponse)
[OK] Adresses, loopback, route, DNS et ping passerelle valides
[OK] VM505 : reseau actif et controle, onboot conforme au YAML
=== ÉTAPE 8/11 : audit-ssh ===
/usr/bin/python3 /root/ajlsm-deploy/recettes/20261016/ajlsm-deploy-cycle/ajlsm-deploy /etc/ajlsm/deploy/projets/mercure3.yaml --ssh-audit --agent-timeout 300
[OK] Clé ED25519 vérifiée via QEMU : 10.0.0.43
[OK] known_hosts actualisé avec sauvegarde conservée
=== Contrôle SSH, sans modification ===
Identité : mercure3.ajlsm.com
Clés autorisées ajlsm :
4096 SHA256:zGdW2VjyzL/p30BjtNy6dzXIahBWTH9djZLc62IKCAk siva@MacBook-Pro-de-Sivakavi.local (RSA)
256 SHA256:lVtwxE0No+RZNyOXpf64JBCnMYIk9YaMw43clCV92hk jlarvers@MacBook-Pro.lan (ED25519)
256 SHA256:HAHGVQ2Afy6vGJpLhJ2vftXonwV31QNOiFHH6t5BfB4 modou-mbp (ED25519)
Configuration effective SSH :
permitrootlogin prohibit-password
pubkeyauthentication yes
passwordauthentication yes
kbdinteractiveauthentication no
Règles sudo pour ajlsm :
User ajlsm may run the following commands on mercure3.ajlsm.com:
    (ALL : ALL) ALL
Etat du mot de passe ajlsm :
ajlsm P 2026-05-22 0 99999 7 -1
[OK] Connexion ajlsm par clé vérifiée.
=== ÉTAPE 9/11 : securisation-ssh ===
/usr/bin/python3 /root/ajlsm-deploy/recettes/20261016/ajlsm-deploy-cycle/ajlsm-deploy /etc/ajlsm/deploy/projets/mercure3.yaml --ssh-secure --agent-timeout 300
=== Contrôle SSH, sans modification ===
Identité : mercure3.ajlsm.com
Clés autorisées ajlsm :
4096 SHA256:zGdW2VjyzL/p30BjtNy6dzXIahBWTH9djZLc62IKCAk siva@MacBook-Pro-de-Sivakavi.local (RSA)
256 SHA256:lVtwxE0No+RZNyOXpf64JBCnMYIk9YaMw43clCV92hk jlarvers@MacBook-Pro.lan (ED25519)
256 SHA256:HAHGVQ2Afy6vGJpLhJ2vftXonwV31QNOiFHH6t5BfB4 modou-mbp (ED25519)
Configuration effective SSH :
permitrootlogin prohibit-password
pubkeyauthentication yes
passwordauthentication yes
kbdinteractiveauthentication no
Règles sudo pour ajlsm :
User ajlsm may run the following commands on mercure3.ajlsm.com:
    (ALL : ALL) ALL
Etat du mot de passe ajlsm :
ajlsm P 2026-05-22 0 99999 7 -1
[OK] Connexion ajlsm par clé vérifiée.
Appliquer PasswordAuthentication no et root par clé seulement [oui/non] : oui
[OK] SSH sécurisé ; root reste autorisé par clé.
[OK] Connexions root et ajlsm par clé toujours fonctionnelles.
=== ÉTAPE 10/11 : mot-de-passe ===
/usr/bin/python3 /root/ajlsm-deploy/recettes/20261016/ajlsm-deploy-cycle/ajlsm-deploy /etc/ajlsm/deploy/projets/mercure3.yaml --password-ajlsm --agent-timeout 300
Ouvrir passwd ajlsm sur MERCURE3 [oui/non] : oui
Le mot de passe sera demandé deux fois par passwd sur la VM.
Il ne sera pas enregistré dans le script. Le reporter manuellement dans le fichier ODS.
New password:
Retype new password:
passwd: password updated successfully
Connection to 10.0.0.43 closed.
[OK] Mot de passe ajlsm modifié ; vérifier ensuite sudo -i depuis ajlsm.
=== ÉTAPE 11/11 : tls ===
/usr/bin/python3 /root/ajlsm-deploy/recettes/20261016/ajlsm-deploy-cycle/ajlsm-deploy /etc/ajlsm/deploy/projets/mercure3.yaml --tls-apply --agent-timeout 300
mercure3.ajlsm.com
subject=CN=clone-89aea8cb-9fd.internal
X509v3 Subject Alternative Name:
    DNS:clone-89aea8cb-9fd.internal
Initialiser le certificat TLS interne [oui/non] : oui
Initialisation TLS pour : mercure3.ajlsm.com
...+......+.+..+.......+...+.....+......++++++++++++++++++++++++++++++++++++++++++*.+....+...+..+......+.++++++++++++++++++++++++++++++++++++++++++*....+...............+.....+....+............+..+......+........................+.+.........+.....+......+....+...+++++
...+..........+...++++++++++++++++++++++++++++++++++++++++++*.+....+...+...+..............+............+.+........+.+...............+...........++++++++++++++++++++++++++++++++++++++++++*...+......+...+....+.................+....+..+...+....+.....+..........+......+.....................+...+...+.....+...+.+...+........+...+.......+..+..........+..+....+..+....+.........+...........+...................+......+.....+.............+..+.+...............+............+......+.....+.+.........+....................+.......+............+...+..+......+.+.........+..+.......+...+.................+.+.....+.+..............+.+...............+........+......+.........+.......+.....+....+..+.......+......+...........+...+......+.........+............+.+..+.......+......+.....+....+.....+.............+........+.........+.+............+......+.....+..........+......+.....+....+......+.....+.+...+..+............+......+......+....+...........+.+..+.+..............+............................+...+.....+.......+..+..........+.....+.......+....................+....+..+.......+..+....+.........+...........+.+.........+...........+....+.........+...........+..........+.....+......+.+.....+.......+..+......+...+++++
-----
Syntax OK
Initialisation TLS terminée.
Sauvegarde : /etc/ssl/ajlsm/backup.ZSmJKspN
subject=CN=mercure3.ajlsm.com
notBefore=Oct 16 14:58:53 2026 GMT
notAfter=Oct 13 14:58:53 2036 GMT
subject=CN=mercure3.ajlsm.com
X509v3 Subject Alternative Name:
    DNS:mercure3.ajlsm.com
active
[OK] Cycle technique terminé ; procéder aux vérifications finales.
root@Saturne3:~/ajlsm-deploy/recettes/20261016/ajlsm-deploy-cycle# ssh ajlsm@10.0.0.43
sudo -i
hostname
df -hT /
Welcome to Ubuntu 26.04.1 LTS (GNU/Linux 7.0.0-38-generic x86_64)
* Documentation:  https://docs.ubuntu.com
* Management:    https://landscape.canonical.com
* Support:        https://ubuntu.com/pro
System information as of Fri Oct 16 05:00:42 PM CEST 2026
  System load:  0.09              Processes:              193
  Usage of /:  8.2% of 96.34GB  Users logged in:        0
  Memory usage: 3%                IPv4 address for ens18: 10.0.0.43
  Swap usage:  0%
* Canonical Workshop gives developers fast, composable, reproducible, and
  secure developer environments that are perfect for agentic workflows.
  https://ubuntu.com/workshop
Expanded Security Maintenance for Applications is not enabled.
1 update can be applied immediately.
To see these additional updates run: apt list --upgradable
9 additional security updates can be applied with ESM Apps.
Learn more about enabling ESM Apps service at https://ubuntu.com/esm
You have new mail.
Last login: Thu Oct 15 08:18:27 2026 from 10.40.0.2
ajlsm@mercure3:~$ sudo -i
[sudo: authenticate] Password:                   
root@mercure3:~# hostname
df -hT /
mercure3.ajlsm.com
Filesystem                        Type  Size  Used Avail Use% Mounted on
/dev/mapper/ubuntu--vg-ubuntu--lv ext4  97G  8.0G  85G  9% /
root@mercure3:~# exit
logout
ajlsm@mercure3:~$ exit
logout
Connection to 10.0.0.43 closed.
root@Saturne3:~# python3 -m zipfile -e \
  /root/ajlsm-deploy/archives/ajlsm-deploy-assistant.zip \
  /root/ajlsm-deploy/recettes/20261016
root@Saturne3:~# install -m 750 \
  /root/ajlsm-deploy/recettes/20261016/ajlsm-deploy-assistant/ajlsm-deploy-yaml \
  /root/ajlsm-deploy/recettes/20261016/ajlsm-deploy-cycle/ajlsm-deploy-yaml
root@Saturne3:~# cd /root/ajlsm-deploy/recettes/20261016/ajlsm-deploy-cycle &&
./ajlsm-deploy-yaml /etc/ajlsm/deploy/projets/mercure3.yaml --check
[OK] Valeurs YAML valides. Aucun fichier modifié, aucun contrôle d’infrastructure effectué.
root@Saturne3:~/ajlsm-deploy/recettes/20261016/ajlsm-deploy-cycle# ./ajlsm-deploy-yaml /etc/ajlsm/deploy/projets/mercure3.yaml --review \
  --output /root/ajlsm-deploy/recettes/20261016/mercure3-relecture.yaml
Assistant local : ANNULER permet de quitter sans enregistrer.
Les commentaires du fichier source restent dans l’original ; la copie sera réécrite en YAML.
projet.code — texte obligatoire ; syntaxe : [a-z0-9][a-z0-9_-]*
Valeur actuelle : mercure3
Nouvelle valeur (Entrée = conserver) :
projet.nom — texte obligatoire
Valeur actuelle : MERCURE3
Nouvelle valeur (Entrée = conserver) :
projet.environnement — interne, client ou prod
Valeur actuelle : interne
Nouvelle valeur (Entrée = conserver) :
proxmox.serveur — texte obligatoire ; syntaxe : [A-Za-z0-9][A-Za-z0-9.-]*
Valeur actuelle : Saturne3
Nouvelle valeur (Entrée = conserver) :
proxmox.template_vmid — entier strictement positif
Valeur actuelle : 506
Nouvelle valeur (Entrée = conserver) :
proxmox.vmid — null ou auto = automatique ; sinon entier positif
Valeur actuelle : null
Nouvelle valeur (Entrée = conserver) :
proxmox.nom_vm — texte obligatoire ; syntaxe : [A-Za-z0-9][A-Za-z0-9.-]*
Valeur actuelle : MERCURE3
Nouvelle valeur (Entrée = conserver) :
proxmox.cpu.sockets — entier strictement positif
Valeur actuelle : 1
Nouvelle valeur (Entrée = conserver) :
proxmox.cpu.cores — entier strictement positif
Valeur actuelle : 8
Nouvelle valeur (Entrée = conserver) :
proxmox.memoire.maximale_mib — entier strictement positif
Valeur actuelle : 24576
Nouvelle valeur (Entrée = conserver) :
proxmox.memoire.minimale_mib — entier strictement positif
Valeur actuelle : 16384
Nouvelle valeur (Entrée = conserver) :
proxmox.disque_systeme.stockage — texte obligatoire ; syntaxe : [A-Za-z0-9][A-Za-z0-9_.-]*
Valeur actuelle : local-zfs
Nouvelle valeur (Entrée = conserver) :
proxmox.disque_systeme.taille_gib — entier strictement positif
Valeur actuelle : 100
Nouvelle valeur (Entrée = conserver) :
proxmox.disque_systeme.etendre_volume_racine — true ou false
Valeur actuelle : true
Nouvelle valeur (Entrée = conserver) :
proxmox.demarrage_auto — true ou false
Valeur actuelle : true
Nouvelle valeur (Entrée = conserver) :
proxmox.tags — interne, client, prod séparés par virgules ; [] = aucun
Valeur actuelle : [interne]
Nouvelle valeur (Entrée = conserver) :
systeme.hostname — nom DNS en minuscules
Valeur actuelle : mercure3.ajlsm.com
Nouvelle valeur (Entrée = conserver) :
reseau.interfaces[0].nom — texte obligatoire ; syntaxe : net[0-9]+
Valeur actuelle : net0
Nouvelle valeur (Entrée = conserver) :
reseau.interfaces[0].bridge — texte obligatoire ; syntaxe : [A-Za-z0-9_.-]{1,15}
Valeur actuelle : vmbr2
Nouvelle valeur (Entrée = conserver) :
reseau.interfaces[0].systeme — texte obligatoire ; syntaxe : ens[0-9]+
Valeur actuelle : ens18
Nouvelle valeur (Entrée = conserver) :
reseau.interfaces[0].ipv4 — IPv4/CIDR, ex. 10.0.0.43/24
Valeur actuelle : 10.0.0.43/24
Nouvelle valeur (Entrée = conserver) :
reseau.interfaces[1].nom — texte obligatoire ; syntaxe : net[0-9]+
Valeur actuelle : net1
Nouvelle valeur (Entrée = conserver) :
reseau.interfaces[1].bridge — texte obligatoire ; syntaxe : [A-Za-z0-9_.-]{1,15}
Valeur actuelle : vmbr1
Nouvelle valeur (Entrée = conserver) :
reseau.interfaces[1].systeme — texte obligatoire ; syntaxe : ens[0-9]+
Valeur actuelle : ens19
Nouvelle valeur (Entrée = conserver) :
reseau.interfaces[1].ipv4 — IPv4/CIDR, ex. 10.0.0.43/24
Valeur actuelle : 192.168.123.27/24
Nouvelle valeur (Entrée = conserver) :
reseau.loopback.ipv4 — IPv4/CIDR, ex. 10.0.0.43/24
Valeur actuelle : 51.83.117.113/32
Nouvelle valeur (Entrée = conserver) :
reseau.passerelle.ipv4 — IPv4 sans préfixe
Valeur actuelle : 10.0.0.4
Nouvelle valeur (Entrée = conserver) :
reseau.passerelle.interface — texte obligatoire ; syntaxe : ens[0-9]+
Valeur actuelle : ens18
Nouvelle valeur (Entrée = conserver) :
reseau.dns — IPv4 sans préfixes, séparées par virgules
Valeur actuelle : [10.0.0.4]
Nouvelle valeur (Entrée = conserver) :
=== PROJET PROPOSÉ ===
projet:
  code: mercure3
  nom: MERCURE3
  environnement: interne
proxmox:
  serveur: Saturne3
  template_vmid: 506
  vmid: null
  nom_vm: MERCURE3
  cpu:
    sockets: 1
    cores: 8
  memoire:
    maximale_mib: 24576
    minimale_mib: 16384
  disque_systeme:
    stockage: local-zfs
    taille_gib: 100
    etendre_volume_racine: true
  demarrage_auto: true
  tags:
  - interne
systeme:
  hostname: mercure3.ajlsm.com
reseau:
  interfaces:
  - nom: net0
    bridge: vmbr2
    systeme: ens18
    ipv4: 10.0.0.43/24
  - nom: net1
    bridge: vmbr1
    systeme: ens19
    ipv4: 192.168.123.27/24
  loopback:
    ipv4: 51.83.117.113/32
  passerelle:
    ipv4: 10.0.0.4
    interface: ens18
  dns:
  - 10.0.0.4
[OK] Valeurs et cohérence YAML validées par le validateur du déploiement.
[NON VÉRIFIÉS] DNS, OPNsense, Ansible, objets Proxmox et disponibilité des IP.
Enregistrer la nouvelle copie dans /root/ajlsm-deploy/recettes/20261016/mercure3-relecture.yaml ? OUI/NON : oui
[ENREGISTRÉ] /root/ajlsm-deploy/recettes/20261016/mercure3-relecture.yaml
Contrôle Proxmox en lecture seule, à lancer sur le nœud cible avant un nouveau déploiement :
/root/ajlsm-deploy/recettes/20261016/ajlsm-deploy-cycle/ajlsm-deploy-check /root/ajlsm-deploy/recettes/20261016/mercure3-relecture.yaml
root@Saturne3:~/ajlsm-deploy/recettes/20261016/ajlsm-deploy-cycle# Read from remote host 141.95.206.118: Connection reset by peer
Connection to 141.95.206.118 closed.
client_loop: send disconnect: Broken pipe
jlarvers@MacBook-Pro ~ % ssh saturne3
Linux Saturne3 7.0.14-23-pve #1 SMP PREEMPT_DYNAMIC PMX 7.0.14-23 (2026-10-07T20:25Z) x86_64
The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.
Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
Last login: Fri Oct 16 16:43:10 2026 from 109.190.129.96
root@Saturne3:~# man -w ajlsm-deploy
/usr/local/man/man8/ajlsm-deploy.8
root@Saturne3:~# man -w ajlsm-deploy
/usr/local/man/man8/ajlsm-deploy.8
root@Saturne3:~# scp root@141.95.206.118:/usr/local/man/man8/ajlsm-deploy.8 ~/Downloads/ajlsm-deploy-existant.8
The authenticity of host '141.95.206.118 (141.95.206.118)' can't be established.
ED25519 key fingerprint is SHA256:GaOnRcly/RWj3rX8/2/Y/gdlagmDypNNvo0xRK1kQaE.
This host key is known by the following other names/addresses:
    ~/.ssh/known_hosts:21: [hashed name]
    ~/.ssh/known_hosts:26: [hashed name]
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '141.95.206.118' (ED25519) to the list of known hosts.
scp: open local "/root/Downloads/ajlsm-deploy-existant.8": No such file or directory
root@Saturne3:~# python3 -m zipfile -e \
  /root/ajlsm-deploy/archives/ajlsm-deploy-man.zip \
  /root/ajlsm-deploy/recettes/20261016 &&
cd /root/ajlsm-deploy/recettes/20261016/ajlsm-deploy-man
root@Saturne3:~/ajlsm-deploy/recettes/20261016/ajlsm-deploy-man# SAUVEGARDE_MAN=$(mktemp -d /root/ajlsm-deploy/archives/man-avant-20261016.XXXXXX)
for NOM_MAN in ajlsm-deploy ajlsm-deploy-cycle ajlsm-deploy-yaml ajlsm-deploy-check ajlsm-deploy-resources; do
  for SUFFIXE_MAN in .8 .8.gz; do
    PAGE_MAN="/usr/local/man/man8/$NOM_MAN$SUFFIXE_MAN"
    if [ -e "$PAGE_MAN" ] || [ -L "$PAGE_MAN" ]; then
      cp -a "$PAGE_MAN" "$SAUVEGARDE_MAN/" || break 2
    fi
  done
done
printf 'Sauvegarde : %s\n' "$SAUVEGARDE_MAN"
Sauvegarde : /root/ajlsm-deploy/archives/man-avant-20261016.WiJHQn
root@Saturne3:~/ajlsm-deploy/recettes/20261016/ajlsm-deploy-man# install -d -m 755 /usr/local/man/man8
for NOM_MAN in ajlsm-deploy ajlsm-deploy-cycle ajlsm-deploy-yaml ajlsm-deploy-check ajlsm-deploy-resources; do
  install -m 644 "man8/$NOM_MAN.8" "/usr/local/man/man8/$NOM_MAN.8" || break
done
if command -v mandb >/dev/null 2>&1; then
  mandb
fi
Purging old database entries in /usr/share/man...
Processing manual pages under /usr/share/man...
Checking for stray cats under /usr/share/man...
Checking for stray cats under /var/cache/man...
Purging old database entries in /usr/share/man/pl...
Processing manual pages under /usr/share/man/pl...
Checking for stray cats under /usr/share/man/pl...
Checking for stray cats under /var/cache/man/pl...
Purging old database entries in /usr/share/man/ru...
Processing manual pages under /usr/share/man/ru...
Checking for stray cats under /usr/share/man/ru...
Checking for stray cats under /var/cache/man/ru...
Purging old database entries in /usr/share/man/id...
Processing manual pages under /usr/share/man/id...
Checking for stray cats under /usr/share/man/id...
Checking for stray cats under /var/cache/man/id...
Purging old database entries in /usr/share/man/es...
Processing manual pages under /usr/share/man/es...
Checking for stray cats under /usr/share/man/es...
Checking for stray cats under /var/cache/man/es...
Purging old database entries in /usr/share/man/zh_TW...
Processing manual pages under /usr/share/man/zh_TW...
Checking for stray cats under /usr/share/man/zh_TW...
Checking for stray cats under /var/cache/man/zh_TW...
Purging old database entries in /usr/share/man/sl...
Processing manual pages under /usr/share/man/sl...
Checking for stray cats under /usr/share/man/sl...
Checking for stray cats under /var/cache/man/sl...
Purging old database entries in /usr/share/man/pt...
Processing manual pages under /usr/share/man/pt...
Checking for stray cats under /usr/share/man/pt...
Checking for stray cats under /var/cache/man/pt...
Purging old database entries in /usr/share/man/hr...
Processing manual pages under /usr/share/man/hr...
Checking for stray cats under /usr/share/man/hr...
Checking for stray cats under /var/cache/man/hr...
Purging old database entries in /usr/share/man/pt_BR...
Processing manual pages under /usr/share/man/pt_BR...
Checking for stray cats under /usr/share/man/pt_BR...
Checking for stray cats under /var/cache/man/pt_BR...
Purging old database entries in /usr/share/man/hu...
Processing manual pages under /usr/share/man/hu...
Checking for stray cats under /usr/share/man/hu...
Checking for stray cats under /var/cache/man/hu...
Purging old database entries in /usr/share/man/da...
Processing manual pages under /usr/share/man/da...
Checking for stray cats under /usr/share/man/da...
Checking for stray cats under /var/cache/man/da...
Purging old database entries in /usr/share/man/cs...
Processing manual pages under /usr/share/man/cs...
Checking for stray cats under /usr/share/man/cs...
Checking for stray cats under /var/cache/man/cs...
Purging old database entries in /usr/share/man/tr...
Processing manual pages under /usr/share/man/tr...
Checking for stray cats under /usr/share/man/tr...
Checking for stray cats under /var/cache/man/tr...
Purging old database entries in /usr/share/man/fr...
Processing manual pages under /usr/share/man/fr...
Checking for stray cats under /usr/share/man/fr...
Checking for stray cats under /var/cache/man/fr...
Purging old database entries in /usr/share/man/nl...
Processing manual pages under /usr/share/man/nl...
Checking for stray cats under /usr/share/man/nl...
Checking for stray cats under /var/cache/man/nl...
Purging old database entries in /usr/share/man/ko...
Processing manual pages under /usr/share/man/ko...
Checking for stray cats under /usr/share/man/ko...
Checking for stray cats under /var/cache/man/ko...
Purging old database entries in /usr/share/man/zh_CN...
Processing manual pages under /usr/share/man/zh_CN...
Checking for stray cats under /usr/share/man/zh_CN...
Checking for stray cats under /var/cache/man/zh_CN...
Purging old database entries in /usr/share/man/sv...
Processing manual pages under /usr/share/man/sv...
Checking for stray cats under /usr/share/man/sv...
Checking for stray cats under /var/cache/man/sv...
Purging old database entries in /usr/share/man/ro...
Processing manual pages under /usr/share/man/ro...
Checking for stray cats under /usr/share/man/ro...
Checking for stray cats under /var/cache/man/ro...
Purging old database entries in /usr/share/man/uk...
Processing manual pages under /usr/share/man/uk...
Checking for stray cats under /usr/share/man/uk...
Checking for stray cats under /var/cache/man/uk...
Purging old database entries in /usr/share/man/sr...
Processing manual pages under /usr/share/man/sr...
Checking for stray cats under /usr/share/man/sr...
Checking for stray cats under /var/cache/man/sr...
Purging old database entries in /usr/share/man/ja...
Processing manual pages under /usr/share/man/ja...
Checking for stray cats under /usr/share/man/ja...
Checking for stray cats under /var/cache/man/ja...
Purging old database entries in /usr/share/man/de...
Processing manual pages under /usr/share/man/de...
Checking for stray cats under /usr/share/man/de...
Checking for stray cats under /var/cache/man/de...
Purging old database entries in /usr/share/man/fi...
Processing manual pages under /usr/share/man/fi...
Checking for stray cats under /usr/share/man/fi...
Checking for stray cats under /var/cache/man/fi...
Purging old database entries in /usr/share/man/it...
Processing manual pages under /usr/share/man/it...
Checking for stray cats under /usr/share/man/it...
Checking for stray cats under /var/cache/man/it...
Purging old database entries in /usr/local/man...
Processing manual pages under /usr/local/man...
Updating index cache for path `/usr/local/man/man8'. Wait...done.
Checking for stray cats under /usr/local/man...
Checking for stray cats under /var/cache/man/oldlocal...
1 man subdirectory contained newer manual pages.
5 manual pages were added.
0 stray cats were added.
0 old database entries were purged.
root@Saturne3:~/ajlsm-deploy/recettes/20261016/ajlsm-deploy-man# man -w ajlsm-deploy
man 8 ajlsm-deploy
man 8 ajlsm-deploy-cycle
man 8 ajlsm-deploy-yaml
/usr/local/man/man8/ajlsm-deploy.8
AJLSM-DEPLOY(8)                                    Administration système                                    AJLSM-DEPLOY(8)
NOM
      ajlsm-deploy - déployer une VM Proxmox par phases contrôlées
SYNOPSIS
      ajlsm-deploy projet.yaml PHASE [--agent-timeout secondes]
      ajlsm-deploy-check projet.yaml [--phase proxmox] [--yaml-only]
      ajlsm-deploy-resources projet.yaml (--dry-run | --apply)
DESCRIPTION
      Programme  à  exécuter  sur  le  nœud Proxmox cible, avec les droits administrateur. Chaque invocation traite une seule
      phase.  Le YAML est validé avant les commandes externes.
      Après succès, les suggestions affichent les commandes de simulation et d'exécution de la prochaine étape, ou de l'étape
      simulée.  Les étapes sans simulation dédiée le signalent explicitement.  Ces suggestions ne sont jamais  exécutées  au‐
      tomatiquement.  Elles décrivent l'ordre théorique, sans mémoriser l'état du cycle.
      Pour  enchaîner les onze étapes sans en oublier, utiliser ajlsm-deploy-cycle(8).  Ce lanceur conserve les confirmations
      et les saisies interactives.
ORDRE DES PHASES
      1. --clone
              Créer le clone complet, désactiver onboot, isoler les interfaces, vérifier l'arrêt et les  adresses  MAC.  Aucun
              démarrage.  Simulation : --dry-run, qui comprend les précontrôles.
      2. --configure-resources
              Configurer  et vérifier CPU, mémoire, balloon et disque scsi0.  Exige une VM arrêtée, onboot désactivé et inter‐
              faces isolées.  La réduction du disque est interdite.  Simulation : --resources-dry-run.
      3. --first-boot-apply
              Démarrer le clone isolé, attendre l'agent QEMU et ajlsm-clone-init, puis vérifier les identités  attendues.  Si
              la VM tourne déjà, reprendre les contrôles sans redémarrage.  Simulation : --first-boot-dry-run.
      4. --root-grow-apply
              Après  le  premier démarrage et avant la personnalisation système, étendre la partition, le PV LVM, le LV racine
              et ext4.  Cette étape dépend de etendre_volume_racine dans le YAML.  Simulation : --root-grow-dry-run.
      5. --system-apply
              Personnaliser hostname, hosts et machine-id, redémarrer isolé et vérifier l'identité active. Respecter le  jour‐
              nal de transaction.  Simulation : --system-dry-run.
      6. --network-apply
              Sauvegarder  et  écrire Netplan dans l'invité, puis exécuter netplan generate. Les liens Proxmox restent isolés.
              Simulation : --network-dry-run.
      7. --network-enable
              Contrôler identité, configuration et conflits ARP, activer les liens, vérifier adresses, loopback, route, DNS et
              passerelle, puis appliquer demarrage_auto.  Un mécanisme de repli tente de rétablir l'isolation en cas  d'échec.
              Simulation : --network-enable-dry-run.
      8. --ssh-audit
              Comparer  la  clé  ED25519 lue via QEMU à celle exposée sur le réseau, actualiser known_hosts après concordance,
              puis vérifier les accès, clés autorisées, sudo et état du compte ajlsm.  Aucune simulation dédiée.
      9. --ssh-secure
              Après audit et confirmation, désactiver l'authentification SSH par mot de passe, conserver root par  clé,  véri‐
              fier  la  configuration,  recharger  SSH  et  contrôler les connexions root et ajlsm par clé.  Aucune simulation
              dédiée.
      10. --password-ajlsm
              Ouvrir passwd pour ajlsm dans la VM avec double saisie native masquée.  Un terminal interactif est  obligatoire.
              Le mot de passe n'est pas placé dans le YAML ni la ligne de commande.  Aucune simulation dédiée.
      11. --tls-apply
              Vérifier  le  certificat TLS interne. Si CN et SAN correspondent déjà au hostname, ne pas réinitialiser.  Sinon,
              après confirmation, appeler ajlsm-init-tls.sh dans la VM, puis vérifier certificat, syntaxe  Apache  et  service
              actif.  Aucune simulation dédiée.
OPTIONS COMMUNES
      --agent-timeout secondes
              Entier  strictement  positif,  défaut 300.  Délai transmis aux attentes utilisant l'agent QEMU.  Il ne constitue
Manual page ajlsm-deploy(8) line 1/219 32% (press h for help or q to quit)
</syntaxhighlight>


== 12. État des validations et limites ==
== 12. État des validations et limites ==

Version du 16 octobre 2026 à 16:37

AJLSM-DEPLOY — Déploiement automatisé des VM Proxmox

Document consolidé au 16 octobre 2026. Cette procédure réunit la page du 15 octobre et la recette actuelle. Elle remplace leurs indications opérationnelles divergentes. L’original du 15 octobre reste archivé séparément.

Référence technique : scripts reçus de Saturne3, puis lot de recette avec lanceur du cycle et assistant YAML.

1. Périmètre et résultat de la recette

Le cycle technique a été exécuté sur MERCURE3 sans erreur signalée. Les vérifications finales transmises confirment :

  • connexion SSH avec le compte ajlsm ;
  • élévation sudo avec le mot de passe défini pendant le cycle ;
  • hostname mercure3.ajlsm.com ;
  • volume racine ext4 de 97 Gio, dont 85 Gio disponibles lors du contrôle.

Le cycle couvre le clonage, les ressources, l’initialisation du clone, l’extension de la racine, l’identité système, le réseau, SSH, le mot de passe et le certificat TLS interne.

NFS, les configurations applicatives Apache2, Pleade, Drupal et Matomo ne font pas encore partie de ce cycle. Certains logiciels peuvent déjà être présents dans le modèle : leur présence ne constitue pas une configuration applicative du projet.

2. Où exécuter les commandes

Machine Rôle Exemple d’invite
Mac de l’administrateur Transfert des archives par scp Invite locale du Mac
Saturne3 Préparation YAML, scripts Proxmox et cycle root@Saturne3
MERCURE3 Vérifications dans la VM ajlsm@mercure3 ou root@mercure3

Les scripts de déploiement sont exécutés sur Saturne3, pas dans MERCURE3. Après « ssh ajlsm@10.0.0.43 », attendre l’invite de la VM avant de saisir les commandes suivantes. Pour revenir de root@mercure3 à Saturne3 : un exit quitte sudo, puis un second exit ferme SSH.

3. Organisation des fichiers

/root/ajlsm-deploy/
  archives/                         Archives reçues, conservées comme références
  recettes/20261016/
    ajlsm-deploy-cycle/             Lot technique validé et assistant ajouté
    ajlsm-deploy-assistant/         Distribution de l’assistant et tests
    ajlsm-deploy-documentation/     Présent guide et modèles YAML

/etc/ajlsm/deploy/projets/mercure3.yaml   Configuration actuellement utilisée
/usr/local/sbin/                        Scripts installés antérieurement

Le lot de recette contient ajlsm-deploy, ajlsm-deploy-check, ajlsm-deploy-resources, ajlsm-deploy-cycle et les modules ajlsm_deploy_common.py, ajlsm_deploy_rootgrow.py et ajlsm_deploy_postconfig.py. L’assistant ajlsm-deploy-yaml a été ajouté à ce même dossier.

Conserver exécutables et modules ensemble. Utiliser les chemins ./ depuis le dossier de recette pour ne pas appeler une ancienne version de /usr/local/sbin. Les anciennes archives « ajlsm-deploy-revise » et « correction-suggestions » ne sont pas la référence courante : elles précèdent les phases supplémentaires reçues dans l’archive serveur.

Prérequis : Python 3.9 ou supérieur, PyYAML 6, outils Proxmox sur le nœud cible et prérequis du modèle AJLSM. Les phases invitées utilisent notamment l’agent QEMU, ajlsm-clone-init, Python, systemd et Netplan. L’extension actuelle cible ext4/LVM sur /dev/sda3, avec un seul PV et un seul LV.

4. Les deux fichiers de préconfiguration

4.1. projet-vierge.yaml

Ce modèle reprend toute la structure actuelle sans valeur opérationnelle préremplie. Chaque champ doit être renseigné. Seul proxmox.vmid peut rester null : il signifie alors attribution automatique.

Le modèle comporte deux interfaces dont les valeurs sont null. Adapter le nombre d’interfaces avant la saisie si nécessaire. Pour déterminer ce nombre par les questions de l’assistant, utiliser plutôt le mode --new.

Un modèle vierge est volontairement refusé par --check. Il ne doit jamais être passé directement au lanceur du cycle.

4.2. mercure3-reference.yaml

Ce fichier conserve les valeurs du projet validé : modèle 506 sur Saturne3, nom MERCURE3, 8 vCPU, 24576 Mio de RAM maximale, 16384 Mio minimale, disque 100 Gio, extension racine activée et paramètres réseau du projet.

Il permet de reconstruire une nouvelle VM avec la même configuration technique si le modèle, le stockage, les bridges et les préparatifs externes sont toujours disponibles. Il ne sauvegarde ni les données de l’ancienne VM, ni ses UUID, machine-id, clés hôte SSH ou mots de passe. Ces identités sont traitées par le cycle et ne sont pas à recopier.

Avec vmid: null, le VMID de remplacement peut différer de celui de l’ancienne VM. Le VMID 505 observé pendant la recette n’est pas une réservation permanente.

Ne pas lancer cette référence tant que MERCURE3 existe encore. Le clonage refuse un nom déjà présent. Pour tester une deuxième VM en parallèle, définir un autre nom, hostname, des IP distinctes et préparer DNS/OPNsense/Ansible en conséquence.

4.3. Valeurs acceptées

  • projet.environnement et tags : interne, client, prod. Les tags sont une liste sans doublons ; [] est admis.
  • CPU, mémoire et taille du disque : entiers strictement positifs ; mémoire minimale inférieure ou égale à la maximale.
  • Booléens : utiliser true ou false sans guillemets.
  • Interfaces Proxmox : net suivi de chiffres ; interfaces invitées : ens suivi de chiffres.
  • Adresses d’interfaces : IPv4/CIDR. Loopback : IPv4/32. Passerelle et DNS : IPv4 sans préfixe.
  • Passerelle : interface déclarée et adresse appartenant à son sous-réseau, distincte des adresses de la VM.
  • Hostname : nom DNS en minuscules.
  • Serveur, bridge et stockage : valeurs adaptées à l’infrastructure ; aucune liste fermée inventée.

Les clés inconnues ou répétées sont refusées. Ne pas ajouter de sections applicatives avant l’évolution coordonnée du schéma et des scripts. Ne pas utiliser [à renseigner] : les crochets créent une liste YAML.

5. Préparer et valider le YAML

Sur Saturne3, se placer dans le lot de recette :

cd /root/ajlsm-deploy/recettes/20261016/ajlsm-deploy-cycle

5.1. Vérifier un fichier existant sans le modifier

./ajlsm-deploy-yaml /etc/ajlsm/deploy/projets/mercure3.yaml --check

Le message de succès signifie que les valeurs et leur cohérence locale sont conformes. Il ne certifie pas la préparation des services externes.

Voici un exemple :

projet:
  code: mercure3
  nom: MERCURE3
  environnement: interne

proxmox:
  serveur: Saturne3
  template_vmid: 506
  vmid: null
  nom_vm: MERCURE3

  cpu:
    sockets: 1
    cores: 8

  memoire:
    maximale_mib: 24576
    minimale_mib: 16384

  disque_systeme:
    stockage: local-zfs
    taille_gib: 100
    etendre_volume_racine: true

  demarrage_auto: true

  tags:
    - interne

systeme:
  hostname: mercure3.ajlsm.com

reseau:
  interfaces:
    - nom: net0
      bridge: vmbr2
      systeme: ens18
      ipv4: 10.0.0.43/24

    - nom: net1
      bridge: vmbr1
      systeme: ens19
      ipv4: 192.168.123.27/24

  loopback:
    ipv4: 51.83.117.113/32

  passerelle:
    ipv4: 10.0.0.4
    interface: ens18

  dns:
    - 10.0.0.4

5.2. Compléter le modèle vierge

Après extraction du présent lot documentaire :

./ajlsm-deploy-yaml \
  /root/ajlsm-deploy/recettes/20261016/ajlsm-deploy-documentation/projet-vierge.yaml \
  --output /root/ajlsm-deploy/recettes/20261016/nouveau-projet.yaml

Toutes les valeurs obligatoires seront demandées. Pour saisir de nouveau le projet MERCURE3, consulter mercure3-reference.yaml comme fiche de paramètres, sans lancer de déploiement.

# Préconfiguration AJLSM vierge : aucune valeur d’infrastructure préremplie.
# Compléter avec ajlsm-deploy-yaml ; ne pas déployer ce modèle tel quel.
# null = champ à renseigner, SAUF proxmox.vmid où null = attribution automatique.
# Les crochets [à renseigner] sont interdits : ils représenteraient une liste YAML.
# Deux interfaces sont proposées : adapter leur nombre avant la saisie.
projet:
  code: null  # Obligatoire : minuscules/chiffres, tiret et souligné ; ex. mercure3.
  nom: null  # Obligatoire : nom lisible du projet.
  environnement: null  # Liste fermée : interne, client, prod.

proxmox:
  serveur: null  # Obligatoire : nom du nœud Proxmox, ex. Saturne3.
  template_vmid: null  # Obligatoire : entier positif, VM modèle existante et arrêtée.
  vmid: null  # Automatique ; sinon entier positif différent de template_vmid.
  nom_vm: null  # Obligatoire : nom de VM, lettres/chiffres/point/tiret.
  cpu:
    sockets: null  # Obligatoire : entier positif.
    cores: null  # Obligatoire : entier positif ; vCPU = sockets × cores.
  memoire:
    maximale_mib: null  # Obligatoire : entier positif, en Mio.
    minimale_mib: null  # Obligatoire : entier positif, inférieur ou égal au maximum.
  disque_systeme:
    stockage: null  # Obligatoire : identifiant de stockage Proxmox existant.
    taille_gib: null  # Obligatoire : entier positif en Gio ; aucune réduction de disque.
    etendre_volume_racine: null  # Obligatoire : true ou false ; active la phase racine.
  demarrage_auto: null  # Obligatoire : true ou false ; appliqué à l’activation réseau.
  tags: null  # Obligatoire : liste ; interne/client/prod uniquement, sans doublons ; [] admis.

systeme:
  hostname: null  # Obligatoire : nom DNS en minuscules ; vérifier sa déclaration en amont.

reseau:
  interfaces:
    - nom: null  # Obligatoire : net suivi de chiffres, conforme à la VM modèle.
      bridge: null  # Obligatoire : bridge existant, au plus 15 caractères.
      systeme: null  # Obligatoire : ens suivi de chiffres, conforme au modèle actuel.
      ipv4: null  # Obligatoire : IPv4/CIDR, ex. 10.0.0.43/24 ; adresse unique.
    - nom: null
      bridge: null
      systeme: null
      ipv4: null
  loopback:
    ipv4: null  # Obligatoire : IPv4 avec préfixe /32, distincte des interfaces.
  passerelle:
    ipv4: null  # Obligatoire : IPv4 seule, dans le sous-réseau de son interface.
    interface: null  # Obligatoire : un des noms systeme déclarés ci-dessus.
  dns: null  # Obligatoire : liste non vide d’IPv4 sans préfixe, ex. [10.0.0.4].

5.3. Créer sans modèle

./ajlsm-deploy-yaml /root/ajlsm-deploy/recettes/20261016/nouveau-projet.yaml --new

Cette commande est une alternative à la précédente : le chemin doit être inexistant. L’assistant pose les questions, y compris le nombre d’interfaces, sans reprendre implicitement les valeurs de MERCURE3.

5.4. Revoir un projet renseigné

./ajlsm-deploy-yaml /etc/ajlsm/deploy/projets/mercure3.yaml --review \
  --output /root/ajlsm-deploy/recettes/20261016/mercure3-relecture.yaml
  • Entrée conserve une valeur existante valide.
  • ANNULER, Ctrl-C ou fin d’entrée abandonnent sans enregistrer.
  • Tags et DNS sont saisis séparés par des virgules ; [] ou aucun signifie tags vides.
  • Saisir auto ou null pour un VMID automatique.
  • Après une incohérence, donner le chemin du champ à corriger ; ? affiche les chemins.
  • Le résumé complet est présenté avant confirmation OUI/NON d’enregistrement.

L’original reste intact, avec ses commentaires. La copie est réécrite en YAML, sans reprise des commentaires. Aucun fichier existant n’est écrasé. Si une destination existe, choisir un nouveau nom avec --output.

5.5. Préparatifs externes

Avant une création, vérifier séparément la réservation des IP, les déclarations DNS, les règles/routes/NAT nécessaires dans OPNsense et l’inventaire ou les préparatifs Ansible. Ne pas inscrire de mots de passe dans le YAML ; conserver les secrets dans le dispositif prévu pour leur gestion.

L’assistant actuel ne vérifie pas automatiquement ces services et ne marque pas un projet « prêt à déployer » sur cette seule base. Leur intégration reste à réaliser.

Le contrôle Proxmox autonome examine notamment le modèle, ses ressources, le stockage et les bridges. Il concerne une nouvelle création et peut refuser un projet déjà déployé :

./ajlsm-deploy-check /chemin/vers/projet.yaml

6. Afficher le plan puis lancer le cycle

6.1. Plan sans exécution

./ajlsm-deploy-cycle /chemin/vers/projet.yaml --plan

Le plan valide le YAML et affiche les commandes, sans exécuter les phases ni vérifier l’infrastructure. Il doit contenir les 11 étapes, toutes dans le dossier de recette.

6.2. Cycle réel pour une nouvelle VM

./ajlsm-deploy-cycle /chemin/vers/projet.yaml

Le lanceur exécute les phases réelles, sans simulation automatique. Il attend seulement les confirmations, les saisies nécessaires et la fin de chaque commande. Il s’arrête sur refus ou erreur. Il ne répond pas à la place de l’administrateur et ne capture pas les mots de passe.

N° Étape Commande réelle Simulation facultative
1 Clonage --clone --dry-run
2 Ressources --configure-resources --resources-dry-run
3 Premier démarrage isolé --first-boot-apply --first-boot-dry-run
4 Extension partition/LVM/ext4 --root-grow-apply --root-grow-dry-run
5 Identité système --system-apply --system-dry-run
6 Préparation Netplan --network-apply --network-dry-run
7 Activation réseau --network-enable --network-enable-dry-run
8 Audit SSH --ssh-audit Aucune option dédiée
9 Sécurisation SSH --ssh-secure Aucune option dédiée
10 Mot de passe ajlsm --password-ajlsm Aucune option dédiée
11 Certificat TLS interne --tls-apply Aucune option dédiée

L’extension racine est indispensable quand etendre_volume_racine vaut true. Agrandir le disque Proxmox ne suffit pas : la partition, le PV LVM, le LV et ext4 doivent aussi être étendus. Cette phase doit figurer après le premier démarrage, avant la personnalisation système. Avec false, la phase annonce sa désactivation.

Le démarrage et la personnalisation se font réseau isolé. Netplan est préparé avant activation des liens. La phase d’activation contrôle le réseau et applique demarrage_auto.

Le certificat TLS interne ne constitue pas, à lui seul, une configuration des applications du projet ou un certificat publiquement reconnu.

6.3. Mode manuel

Chaque phase peut être lancée séparément avec ./ajlsm-deploy suivi du YAML et de son option. Après succès, le lot courant affiche deux lignes pour l’étape suivante : Simulation et Exécution. Si la simulation n’existe pas, il le signale. Aucune suggestion n’est exécutée automatiquement.

Les simulations peuvent consulter l’invité et émettre des sondes ARP selon la phase : elles ne sont pas toutes des contrôles hors ligne. L’absence de réponse ARP ne remplace pas la réservation des adresses dans l’inventaire réseau.

7. Erreur, annulation et reprise

Conserver la sortie complète et diagnostiquer la phase fautive avant de reprendre. Une phase peut être partiellement effectuée ; le lanceur n’effectue ni suppression de VM ni restauration globale automatique.

./ajlsm-deploy-cycle /chemin/vers/projet.yaml --from extension-racine

--from inclut l’étape indiquée et saute les précédentes à la demande de l’administrateur. Il ne certifie pas leur état. Les contrôles propres aux phases restent actifs. Le lanceur ne possède pas de journal persistant global de progression.

Ne pas relancer le cycle depuis le clonage sur une VM existante pour terminer une étape. Ne pas relancer des étapes déjà terminées uniquement parce qu’une commande manuelle les suggère. Les suggestions suivent l’ordre théorique et ne constituent pas un inventaire de l’état de la VM.

Codes de sortie : 0 succès, 1 annulation, 2 erreur. Le lanceur normalise les autres codes d’échec de ses sous-processus en erreur et ne poursuit pas.

8. Vérifications finales

Sur Saturne3, avec le VMID réellement annoncé au clonage :

qm list
qm status VMID
qm config VMID

Remplacer VMID par l’identifiant vérifié. Contrôler le nom, les CPU, la RAM, le disque, les liens réseau et onboot selon le YAML.

Depuis Saturne3, ouvrir la connexion et attendre l’invite de la VM :

ssh ajlsm@10.0.0.43

Dans MERCURE3, saisir sudo -i, attendre l’authentification et l’invite root, puis :

hostname
lsblk
df -hT /
ip -br addr
ip route
resolvectl status

Résultat vérifié pendant la recette : hostname mercure3.ajlsm.com, racine ext4 97 Gio. Les tailles disponibles évoluent avec l’utilisation. Les commandes SSH et TLS du cycle vérifient leurs propres résultats ; compléter par les tests d’accès attendus dans le réseau cible.

9. Reconstruire MERCURE3 ultérieurement

  1. Conserver le fichier mercure3-reference.yaml, le lot de scripts validé et l’identification du modèle utilisé.
  2. Comparer la référence au YAML effectivement utilisé avant reconstruction ; actualiser les changements d’infrastructure.
  3. Identifier et sauvegarder les données à conserver : le YAML n’est pas une sauvegarde de VM.
  4. Vérifier explicitement l’identité de l’ancienne VM et traiter séparément son arrêt et sa suppression volontaire. Le cycle ne détruit jamais automatiquement une VM existante.
  5. Contrôler DNS, OPNsense, Ansible et les réservations d’IP. Ne pas laisser deux VM actives avec les mêmes adresses.
  6. Valider la référence avec --check, afficher le --plan, puis lancer le cycle sur la référence après libération de la cible.
  7. Relever le nouveau VMID et effectuer les vérifications finales.

On retrouve ainsi les paramètres de la VM, sans chercher à reproduire ses anciennes identités techniques.

10. Protections et détails techniques

10.1. Isolation, identité et journal de personnalisation

Le clone est arrêté après création, avec onboot désactivé et les interfaces isolées. Le premier démarrage s’effectue dans cet état d’isolation. Les phases système et réseau vérifient l’identité de la cible et l’UUID attendu selon leurs contrôles propres.

La personnalisation système conserve dans l’invité :

/var/lib/ajlsm/system-personalisation/state.json
/var/lib/ajlsm/system-personalisation/backup/

Ce journal décrit la transaction d’identité, pas l’ensemble du cycle. Ne pas le supprimer pour forcer une nouvelle exécution. Après interruption, conserver les sauvegardes et examiner l’état réel avant reprise.

La VM 515 est signalée comme hors périmètre par la documentation historique. Elle ne fait pas partie de la recette MERCURE3 et ne doit pas être ciblée par cette procédure.

10.2. Audit SSH : lecture dans la VM, écriture possible sur Saturne3

La phase --ssh-audit commence par synchroniser l’identité SSH :

  1. Lire la clé publique /etc/ssh/ssh_host_ed25519_key.pub dans la VM via l’agent QEMU.
  2. Valider le format ED25519 et sa structure binaire attendue.
  3. Lire indépendamment la clé exposée sur le réseau avec ssh-keyscan -T 8 -t ed25519.
  4. Comparer les clés : une divergence, une absence ou un format invalide provoque un refus.
  5. Après concordance seulement, sauvegarder /root/.ssh/known_hosts sur Saturne3, travailler sur une copie et remplacer le fichier avec la nouvelle entrée vérifiée pour l’IP cible.
  6. Contrôler les connexions par clé, les clés autorisées, sudo et l’état du compte ajlsm.

Les autres entrées d’hôtes sont conservées ; le traitement retire aussi les anciennes entrées hachées correspondant à l’IP cible. Les sauvegardes utilisent le préfixe known_hosts.ajlsm-backup. dans /root/.ssh/.

L’audit n’est donc pas entièrement sans écriture : ses lectures dans la VM sont accompagnées d’une mise à jour possible de known_hosts sur Saturne3. Ne jamais contourner une divergence en effaçant aveuglément known_hosts.

10.3. Sécurisation SSH et mot de passe

--ssh-secure effectue un audit préalable, prépare un fichier SSH dédié, vérifie la syntaxe et les valeurs effectives, puis recharge SSH. Il désactive l’authentification SSH par mot de passe et conserve root par clé. Les connexions root et ajlsm par clé sont revérifiées par le code reçu.

Le mot de passe local ajlsm reste utile pour sudo. --password-ajlsm utilise un terminal interactif et lance passwd dans la VM, avec sa double saisie masquée. Le secret n’est pas inscrit dans le YAML ni dans la ligne de commande. La procédure historique prévoit un report manuel dans le registre ODS d’administration ; appliquer les règles internes de gestion des secrets. Ne pas joindre ce registre à une documentation publique.

10.4. Certificat TLS interne et Apache

--tls-apply lit le certificat /etc/ssl/ajlsm/server.crt. Si le CN et le SAN correspondent déjà au hostname attendu, la phase termine sans réinitialisation. Sinon, après confirmation, elle appelle /usr/local/sbin/ajlsm-init-tls.sh dans la VM. Ce dernier script doit être présent dans le modèle ; son contenu n’était pas inclus dans l’archive des scripts de déploiement reçue.

Après une initialisation réussie, le module contrôle le certificat, apache2ctl configtest et systemctl is-active apache2. Ce contrôle technique d’Apache ne constitue pas une recette des VirtualHosts et des applications du projet.

La documentation historique désigne /home/ajlsm/README, hérité de TEMPLATE3, comme README applicatif Pleade/Drupal. Le conserver séparément du README-ajlsm-deploy de l’outil de déploiement ; ne pas remplacer l’un par l’autre.

10.5. Attente réseau au premier démarrage

La recette du 15 octobre signalait environ 60 secondes d’attente dans systemd-networkd-wait-online lorsque les interfaces étaient isolées. Ce constat historique n’a pas empêché l’agent QEMU ni ajlsm-clone-init de répondre. Une optimisation éventuelle du modèle reste distincte du déploiement ; ne pas désactiver le service sans vérifier ses dépendances.

11. Maintenance, sauvegardes et manuel

11.1. Identifier les fichiers réellement exécutés

La recette du 16 octobre utilise le dossier /root/ajlsm-deploy/recettes/20261016/ajlsm-deploy-cycle/. Elle ne démontre pas une mise à jour globale de /usr/local/sbin/. Toujours distinguer le lot validé et les programmes installés.

Dans le dossier de recette :

./ajlsm-deploy --help
./ajlsm-deploy-cycle --help
./ajlsm-deploy-yaml --help
python3 -m py_compile ajlsm-deploy ajlsm-deploy-check ajlsm-deploy-resources ajlsm-deploy-cycle ajlsm-deploy-yaml ajlsm_deploy_common.py ajlsm_deploy_rootgrow.py ajlsm_deploy_postconfig.py

Une compilation vérifie la syntaxe, pas le bon déroulement d’une phase ni les prérequis serveur.

11.2. Sauvegarder et restaurer un lot cohérent

Conserver ensemble programmes, modules et configuration de référence. Sauvegarder le lot complet avant une installation ou une correction. Exemple sur Saturne3 :

tar -czf "/root/ajlsm-deploy/archives/lot-recette-$(date +%Y%m%d-%H%M%S).tar.gz" \
  -C /root/ajlsm-deploy/recettes/20261016 ajlsm-deploy-cycle

Une restauration doit porter sur un ensemble compatible. Ne pas réinstaller uniquement ajlsm-deploy.bak-20261015 : ce fichier peut précéder les modules et phases nécessaires. L’ancienne sauvegarde et les répertoires de revue sont des références historiques à inventorier avant nettoyage.

Ne pas supprimer INSTRUCTIONS-TEST.txt ou d’autres fichiers de /root/ajlsm-deploy-review/ sur la seule base de l’ancienne page. Leur archivage et le nettoyage ne font pas partie de cette mise à jour documentaire.

11.3. Page man

La page du 15 octobre indique un manuel installé en /usr/local/man/man8/ajlsm-deploy.8 et une sauvegarde hors man8 dans /root/ajlsm-deploy-review/sauvegardes-man/. Ce sont des informations historiques, dont l’état actuel n’a pas été vérifié pendant la recette du 16 octobre.

Pour identifier la page disponible sur Saturne3 :

man -w ajlsm-deploy
man 8 ajlsm-deploy

Une page absente ne signifie pas que le script est absent : --help est l’aide intégrée de l’exécutable. Le manuel installé doit être réconcilié avec le cycle et l’assistant avant d’être considéré comme référence de cette version. En attendant, le présent guide et l’aide des fichiers du lot de recette décrivent le fonctionnement courant.

Last login: Fri Oct 16 15:21:06 on ttys000
jlarvers@MacBook-Pro ~ % ssh saturne3
Linux Saturne3 7.0.14-23-pve #1 SMP PREEMPT_DYNAMIC PMX 7.0.14-23 (2026-10-07T20:25Z) x86_64

The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
Last login: Fri Oct 16 09:46:02 2026 from 109.190.129.96
root@Saturne3:~# qm status 505
qm config 505
status: running
agent: 1
balloon: 16384
boot: order=scsi0;net0
cores: 8
cpu: x86-64-v2-AES
memory: 24576
meta: creation-qemu=11.0.0,ctime=1779439732
name: MERCURE3
net0: virtio=BC:24:11:D5:B4:C2,bridge=vmbr2,firewall=1,link_down=0
net1: virtio=BC:24:11:E8:F0:BD,bridge=vmbr1,firewall=1,link_down=0
numa: 0
onboot: 1
ostype: l26
scsi0: local-zfs:vm-505-disk-0,iothread=1,size=100G
scsihw: virtio-scsi-single
smbios1: uuid=f47653e5-e87f-4765-bd41-46bb2eaac990
sockets: 1
tags: interne
vmgenid: d0cfe3f4-9292-4c03-81d9-662131e54889
root@Saturne3:~# qm set 505 --onboot 0
qm shutdown 505 --timeout 120
qm status 505
update VM 505: -onboot 0
status: stopped
root@Saturne3:~# PROJET_YAML=/etc/ajlsm/deploy/projets/mercure3.yaml
root@Saturne3:~# ./ajlsm-deploy "$PROJET_YAML" --clone
-bash: ./ajlsm-deploy: No such file or directory
root@Saturne3:~# history
    1  Ne pas lancer toutes les phases dans un script ou une chaîne de
    2  commandes.
    3  PHASE 1 - CLONAGE
    4  Simulation :
    5      ajlsm-deploy "$PROJET" --dry-run
    6  Clonage :
    7      ajlsm-deploy "$PROJET" --clone
    8  Le clone est créé sans démarrage.
    9  Vérifier le VMID réellement attribué.
   10  PHASE 2 - CONFIGURATION DES RESSOURCES
   11  Simulation :
   12      ajlsm-deploy "$PROJET" --resources-dry-run
   13  Application :
   14      ajlsm-deploy "$PROJET" --configure-resources
   15  Configuration des ressources CPU, RAM et disque.
   16  L'agrandissement du disque Proxmox ne suffit pas à agrandir le
   17  système de fichiers à l'intérieur de la VM.
   18  PHASE 3 - PREMIER DEMARRAGE ISOLE
   19  Simulation :
   20      ajlsm-deploy "$PROJET" --first-boot-dry-run
   21  Application :
   22      ajlsm-deploy "$PROJET" --first-boot-apply
   23  Le clone démarre avec ses interfaces réseau isolées.
   24  Le programme contrôle notamment l'agent QEMU et l'initialisation
   25  du clone.
   26  Ne pas activer manuellement les interfaces réseau.
   27  PHASE 4 - EXTENSION DU VOLUME RACINE
   28  Simulation :
   29      ajlsm-deploy "$PROJET" --root-grow-dry-run
   30  Application :
   31      ajlsm-deploy "$PROJET" --root-grow-apply
   32  Cette phase étend la partition, le volume LVM et le système de
   33  fichiers ext4 selon la configuration prévue.
   34  Elle doit être effectuée après le premier démarrage et avant la
   35  personnalisation système.
   36  En cas d'erreur, ne pas poursuivre sans diagnostic.
   37  PHASE 5 - PERSONNALISATION SYSTEME
   38  Simulation :
   39      ajlsm-deploy "$PROJET" --system-dry-run
   40  Application :
   41      ajlsm-deploy "$PROJET" --system-apply
   42  Personnalisation de l'identité système, notamment du hostname
   43  et du machine-id.
   44  La VM reste isolée du réseau.
   45  Les informations de transaction sont conservées dans :
   46      /var/lib/ajlsm/system-personalisation/
   47  Ne pas supprimer ces informations pour forcer une nouvelle opération.
   48  PHASE 6 - CONFIGURATION NETPLAN
   49  Simulation :
   50      ajlsm-deploy "$PROJET" --network-dry-run
   51  Application :
   52      ajlsm-deploy "$PROJET" --network-apply
   53  Préparation de Netplan et vérification de sa génération.
   54  Les interfaces Proxmox restent isolées.
   55  PHASE 7 - ACTIVATION DU RESEAU
   56  Simulation :
   57      ajlsm-deploy "$PROJET" --network-enable-dry-run
   58  Application :
   59      ajlsm-deploy "$PROJET" --network-enable
   60  Avant activation, le programme effectue les contrôles prévus,
   61  notamment la recherche de conflits d'adresses IPv4 par ARP.
   62  Après activation, vérifier :
   63  - Les adresses IPv4.
   64  - La route par défaut.
   65  - La passerelle.
   66  - Les DNS.
   67  - L'adresse loopback, si elle est configurée.
   68  - Le paramètre onboot de la VM.
   69  Le mécanisme de repli en cas d'échec réseau reste à valider
   70  par un test réel de panne.
   71  PHASE 8 - AUDIT SSH
   72      ajlsm-deploy "$PROJET" --ssh-audit
   73  Avant l'audit SSH, le programme synchronise l'identification
   74  du serveur dans /root/.ssh/known_hosts sur Saturne3.
   75  Il compare :
   76  - La clé publique ED25519 obtenue directement dans la VM
   77    via l'agent QEMU.
   78  - La clé ED25519 présentée sur le réseau via ssh-keyscan.
   79  Si les clés diffèrent, l'opération est refusée.
   80  Si elles correspondent, known_hosts peut être actualisé après
   81  sauvegarde.
   82  L'audit ne modifie pas la configuration SSH de la VM.
   83  ATTENTION :
   84  Bien que l'audit soit sans modification de la configuration SSH
   85  invitée, la synchronisation préalable peut modifier le fichier
   86  known_hosts de Saturne3.
   87  PHASE 9 - SECURISATION SSH
   88      ajlsm-deploy "$PROJET" --ssh-secure
   89  Cette phase désactive l'authentification SSH par mot de passe
   90  et conserve l'accès root par clé publique.
   91  Vérifier impérativement les accès par clé avant de confirmer.
   92  Après application, refaire un audit :
   93      ajlsm-deploy "$PROJET" --ssh-audit
   94  PHASE 10 - MOT DE PASSE DU COMPTE AJLSM
   95      ajlsm-deploy "$PROJET" --password-ajlsm
   96  Le mot de passe est demandé interactivement avec double saisie.
   97  Ne pas inscrire de mot de passe dans le YAML ou dans une commande.
   98  PHASE 11 - CERTIFICAT TLS INTERNE
   99      ajlsm-deploy "$PROJET" --tls-apply
  100  Initialisation ou vérification du certificat TLS interne.
  101  Vérifier le résultat et le fonctionnement du service concerné.
  102  6. VERIFICATIONS FINALES
  103  ------------------------
  104  Sur Saturne3, avec le VMID réellement attribué :
  105      qm status VMID
  106      qm config VMID
  107  Dans la VM :
  108      hostnamectl
  109      ip -br addr
  110      ip route
  111      resolvectl status
  112  Pour vérifier le volume racine :
  113      lsblk
  114      df -hT /
  115      pvs
  116      vgs
  117      lvs
  118  Pour vérifier SSH depuis Saturne3 :
  119      ssh root@ADRESSE_IP_VM
  120  Adapter VMID et ADRESSE_IP_VM au projet.
  121  Ne jamais accepter aveuglément une empreinte SSH différente.
  122  7. CONFIRMATIONS ET CODES DE RETOUR
  123  -----------------------------------
  124  Chaque modification nécessite une confirmation.
  125  La réponse par défaut est NON.
  126  Respecter la confirmation réellement demandée par la version
  127  installée du programme.
  128  Codes de retour :
  129      0 : succès
  130      1 : annulation
  131      2 : erreur
  132  Une erreur impose un diagnostic avant de poursuivre.
  133  8. REPRISE APRES INCIDENT
  134  -------------------------
  135  En cas d'échec :
  136  1. Ne pas lancer la phase suivante.
  137  2. Conserver la sortie complète du programme.
  138  3. Vérifier le VMID et l'identité de la VM.
  139  4. Contrôler son état dans Proxmox.
  140  5. Vérifier que le réseau est toujours isolé si nécessaire.
  141  6. Examiner les sauvegardes et informations de transaction.
  142  7. Corriger la cause avant de reprendre.
  143  Ne jamais supprimer une VM pour recommencer sans avoir vérifié
  144  son identité et ses données.
  145  Ne jamais modifier manuellement known_hosts pour contourner
  146  une erreur de correspondance de clés SSH.
  147  9. MAINTENANCE DES SCRIPTS
  148  --------------------------
  149  Vérifier la syntaxe Python :
  150      python3 -m py_compile \
  151          /usr/local/sbin/ajlsm-deploy \
  152          /usr/local/sbin/ajlsm_deploy_rootgrow.py \
  153          /usr/local/sbin/ajlsm_deploy_postconfig.py
  154  Les trois scripts forment un ensemble cohérent.
  155  Effectuer une sauvegarde avant toute modification.
  156  Ne pas restaurer un module isolément sans vérifier sa
  157  compatibilité avec les autres.
  158  10. ETAT DES VALIDATIONS AU 15 OCTOBRE 2026
  159  -------------------------------------------
  160  Recette MERCURE3 :
  161  - Clonage depuis TEMPLATE3.
  162  - Configuration des ressources.
  163  - Premier démarrage isolé.
  164  - Personnalisation système.
  165  - Configuration Netplan.
  166  - Contrôle ARP.
  167  - Activation réseau.
  168  - Vérifications réseau.
  169  Tests fonctionnels isolés du 15 octobre :
  170  - Validation de la comparaison des clés ED25519.
  171  - Acceptation de deux clés identiques.
  172  - Refus de clés différentes.
  173  - Refus de clés malformées.
  174  - Préservation de known_hosts en cas de refus.
  175  - Conservation des autres entrées de known_hosts.
  176  - Compilation Python des trois scripts.
  177  Restent à confirmer lors d'un déploiement complet avec les
  178  dernières versions des scripts :
  179  - Extension du volume racine.
  180  - Enchaînement complet des phases.
  181  - Synchronisation SSH avec une nouvelle VM réelle.
  182  - Sécurisation SSH et postconfiguration.
  183  - Repli en cas d'échec réseau.
  184  11. PRECAUTIONS
  185  ---------------
  186  TEMPLATE3 : VMID 506, modèle de clonage.
  187  MERCURE3 : VMID 505, VM utilisée pour la recette.
  188  Ces identifiants ne doivent jamais être réutilisés aveuglément.
  189  La VM 515 est indépendante de cette procédure et ne doit pas
  190  être modifiée.
  191  Le README applicatif présent sur TEMPLATE3 et MERCURE3 ne doit
  192  pas être remplacé par ce document.
  193  12. DOCUMENTATION COMPLEMENTAIRE
  194  --------------------------------
  195  Aide rapide :
  196      ajlsm-deploy --help
  197  Manuel système :
  198      man ajlsm-deploy
  199  Documentation technique complète :
  200      AJLSM-DEPLOY - Déploiement automatisé des VM Proxmox
  201      (documentation MediaWiki AJLSM)
  202  Le manuel et la documentation MediaWiki doivent être maintenus
  203  en cohérence avec les scripts.
  204  FIN DU README
  205  =============
  206  FIN_README
  207        chmod 644 /usr/local/sbin/README-ajlsm-deploy;     echo "README créé : /usr/local/sbin/README-ajlsm-deploy"; fi
  208  ls -l /usr/local/sbin/README-ajlsm-deploy
  209  head -20 /usr/local/sbin/README-ajlsm-deploy
  210  ls -l /usr/local/sbin/README-ajlsm-deploy
  211  head -20 /usr/local/sbin/README-ajlsm-deploy
  212  vim /usr/local/sbin/README-ajlsm-deploy
  213  man -w ajlsm-deploy
  214  cat /usr/local/man/man8/ajlsm-deploy.8
  215  python3 - <<'PY'
  216  from pathlib import Path
  217  from datetime import datetime
  218  import shutil
  219  path = Path("/usr/local/man/man8/ajlsm-deploy.8")
  220  original = path.read_text(encoding="utf-8")
  221  updated = original
  222  old_audit = r""".TP
  223  .B \-\-ssh-audit
  224  Contrôler en lecture seule les empreintes de clés autorisées, la configuration
  225  SSH, sudo et l'accès par clé au compte ajlsm.
  226  """
  227  new_audit = r""".TP
  228  .B \-\-ssh-audit
  229  Identifier la VM Proxmox concernée, synchroniser sa clé d'hôte SSH ED25519
  230  dans /root/.ssh/known_hosts sur Saturne3, puis contrôler les clés autorisées,
  231  la configuration SSH, sudo et l'accès par clé au compte ajlsm.
  232  .PP
  233  Avant l'audit, la clé publique ED25519 est récupérée directement dans
  234  l'invité via l'agent QEMU, puis comparée à la clé présentée sur le réseau
  235  par ssh-keyscan. La structure de la clé est vérifiée. Une clé malformée,
  236  une divergence ou une récupération impossible provoque un refus.
  237  .PP
  238  Lorsque les clés correspondent, le programme peut actualiser
  239  /root/.ssh/known_hosts après sauvegarde. Les anciennes entrées associées
  240  à l'adresse IP, y compris les entrées hachées, sont supprimées de la copie
  241  de travail avant insertion de la clé vérifiée. Les autres entrées sont
  242  conservées. Le remplacement est atomique.
  243  .PP
  244  L'audit de la configuration SSH dans l'invité est en lecture seule,
  245  mais la synchronisation préalable peut modifier known_hosts sur Saturne3.
  246  """
  247  old_examples = r"""\&./ajlsm-deploy projet-test.yaml --root-grow-apply
  248  \&./ajlsm-deploy projet-test.yaml --ssh-audit
  249  \&./ajlsm-deploy projet-test.yaml --ssh-secure
  250  \&./ajlsm-deploy projet-test.yaml --password-ajlsm
  251  \&./ajlsm-deploy projet-test.yaml --tls-apply
  252  \&./ajlsm-deploy projet-test.yaml --system-dry-run
  253  \&./ajlsm-deploy projet-test.yaml --system-apply
  254  \&./ajlsm-deploy projet-test.yaml --network-dry-run
  255  \&./ajlsm-deploy projet-test.yaml --network-apply
  256  \&./ajlsm-deploy projet-test.yaml --network-enable-dry-run
  257  \&./ajlsm-deploy projet-test.yaml --network-enable
  258  """
  259  new_examples = r"""\&./ajlsm-deploy projet-test.yaml --root-grow-apply
  260  \&./ajlsm-deploy projet-test.yaml --system-dry-run
  261  \&./ajlsm-deploy projet-test.yaml --system-apply
  262  \&./ajlsm-deploy projet-test.yaml --network-dry-run
  263  \&./ajlsm-deploy projet-test.yaml --network-apply
  264  \&./ajlsm-deploy projet-test.yaml --network-enable-dry-run
  265  \&./ajlsm-deploy projet-test.yaml --network-enable
  266  \&./ajlsm-deploy projet-test.yaml --ssh-audit
  267  \&./ajlsm-deploy projet-test.yaml --ssh-secure
  268  \&./ajlsm-deploy projet-test.yaml --ssh-audit
  269  \&./ajlsm-deploy projet-test.yaml --password-ajlsm
  270  \&./ajlsm-deploy projet-test.yaml --tls-apply
  271  """
  272  old_limit = r"""L'absence de réponse ARP ne garantit pas qu'une IP est libre, et ne
  273  remplace
  274  pas l'inventaire réseau. Le repli réseau nécessite
  275  une recette sur une VM dédiée.
  276  """
  277  new_limit = r"""L'absence de réponse ARP ne garantit pas qu'une IP est libre, et ne
  278  remplace
  279  pas l'inventaire réseau. Le repli réseau nécessite
  280  une recette sur une VM dédiée.
  281  .PP
  282  La synchronisation des clés SSH a été validée par tests fonctionnels
  283  isolés le 15 octobre 2026 : clés concordantes, divergentes et malformées,
  284  préservation de known_hosts en cas de refus. Elle reste à confirmer
  285  lors d'un nouveau déploiement complet sur une VM réelle.
  286  """
  287  replacements = [
  288      ("section SSH", old_audit, new_audit),
  289      ("ordre des exemples", old_examples, new_examples),
  290      ("limites et validation", old_limit, new_limit),
  291  ]
  292  for label, old, new in replacements:
  293      count = updated.count(old)
  294      if count != 1:
  295          raise SystemExit(
  296              f"ERREUR : section '{label}' trouvée {count} fois. "
  297              "Aucune modification effectuée."
  298          )
  299      updated = updated.replace(old, new, 1)
  300  backup = path.with_name(
  301      path.name + ".bak-" + datetime.now().strftime("%Y%m%d-%H%M%S")
  302  )
  303  shutil.copy2(path, backup)
  304  path.write_text(updated, encoding="utf-8")
  305  print("Manuel actualisé :", path)
  306  print("Sauvegarde       :", backup)
  307  print("Sections modifiées : SSH, exemples, limites.")
  308  PY
  309  man 8 ajlsm-deploy
  310  man 8 ajlsm-deploy | col -b | grep -n -E   'known_hosts|ssh-keyscan|ED25519|déploiement complet'
  311  mkdir -p /root/ajlsm-deploy-review/sauvegardes-man
  312  mv /usr/local/man/man8/ajlsm-deploy.8.bak-20261015-235157    /root/ajlsm-deploy-review/sauvegardes-man/
  313  man 8 ajlsm-deploy >/dev/null
  314  echo "=== INTERFACES RESEAU ==="
  315  ip -br -4 addr
  316  echo
  317  echo "=== ROUTE VERS EOLE3 ==="
  318  ip route get 192.168.123.202
  319  ip route get 51.178.110.230
  320  echo
  321  echo "=== MONTAGES NFS ==="
  322  findmnt -t nfs,nfs4 -o SOURCE,TARGET,FSTYPE,OPTIONS
  323  echo
  324  echo "=== CONNEXIONS ACTIVES VERS EOLE3 ==="
  325  ss -tn state established | grep -E   '192\.168\.123\.202|51\.178\.110\.230' || true
  326  echo
  327  echo "=== STOCKAGES PROXMOX ==="
  328  pvesm status
  329  echo "=== REFERENCES A EOLE3 DANS LES TACHES CRON ==="
  330  grep -RInE   'eole3|51\.178\.110\.230|192\.168\.123\.202'   /etc/cron.d /etc/crontab /var/spool/cron/crontabs   2>/dev/null || true
  331  echo
  332  echo "=== REFERENCES A EOLE3 DANS LES SCRIPTS LOCAUX ==="
  333  grep -RInE   'eole3|51\.178\.110\.230|192\.168\.123\.202'   /usr/local/sbin /usr/local/bin   2>/dev/null | head -60
  334  echo
  335  echo "=== TIMERS SYSTEMD ==="
  336  systemctl list-timers --all --no-pager
  337  exit
  338  qm status 505
  339  qm config 505
  340  qm set 505 --onboot 0
  341  qm shutdown 505 --timeout 120
  342  qm status 505
  343  PROJET_YAML=/etc/ajlsm/deploy/projets/mercure3.yaml
  344  ./ajlsm-deploy "$PROJET_YAML" --clone
  345  history
root@Saturne3:~# cd  /usr/local/sbin
root@Saturne3:/usr/local/sbin# ls -la
total 216
drwxr-xr-x  3 root root  4096 Oct 15 23:50 .
drwxr-xr-x 11 root root  4096 Mar 27  2026 ..
-rw-r--r--  1 root root 10453 Oct 15 23:44 README-ajlsm-deploy
drwxr-xr-x  2 root root  4096 Oct 15 23:26 __pycache__
-rwxr-x---  1 root root 66119 Oct 15 23:17 ajlsm-deploy
-rwxr-xr-x  1 root root 11954 Oct 15 21:41 ajlsm-deploy-check
-rwxr-xr-x  1 root root  6874 Oct 15 21:41 ajlsm-deploy-resources
-rwxr-xr-x  1 root root  2945 Oct 15 11:19 ajlsm-deploy.avant-clonage
-rwxr-xr-x  1 root root 10383 Oct 15 12:05 ajlsm-deploy.avant-first-boot
-rwxr-xr-x  1 root root  9664 Oct 15 11:51 ajlsm-deploy.avant-integration-ressources
-rwxr-x---  1 root root 18851 Oct 15 12:51 ajlsm-deploy.bak-20261015
-rw-r--r--  1 root root 10349 Oct 15 21:41 ajlsm_deploy_common.py
-rw-r--r--  1 root root  9595 Oct 15 23:26 ajlsm_deploy_postconfig.py
-rw-r--r--  1 root root  6192 Oct 15 22:14 ajlsm_deploy_rootgrow.py
-rwx------  1 root root   863 Apr 20 11:03 backup_pbs_saturne3.sh
-rwx------  1 root root  5289 Oct 14 12:55 supervision_rapport.sh
-rwxr-x---  1 root root  4112 Oct 14 12:23 supervision_updates.sh
-rw-r--r--  1 root root  1673 Oct 13 17:15 supervision_updates_collect.py
root@Saturne3:/usr/local/sbin# ./ajlsm-deploy "$PROJET_YAML" --clone

=== PRÉCONTRÔLES ===
[OK] Configuration YAML chargée

=== CONTRÔLES PROXMOX ===
[OK] VM source 506 présente
[OK] VM source 506 arrêtée
[OK] QEMU Guest Agent activé dans la configuration
[OK] Disque source scsi0 : 32 Gio
[OK] Prochain VMID proposé : 511 (non réservé)
[OK] CPU : 1 socket(s) × 8 cœur(s) = 8 vCPU
[OK] RAM : 16384 à 24576 Mio
[OK] Stockage local-zfs actif
[OK] Disque demandé : 100 Gio
[OK] Tags : interne

=== CONTRÔLES RÉSEAU ===
[OK] Bridge vmbr2 présent
[OK] net0 / ens18 : 10.0.0.43/24
[OK] Bridge vmbr1 présent
[OK] net1 / ens19 : 192.168.123.27/24
[OK] IP loopback : 51.83.117.113/32
[OK] Passerelle : 10.0.0.4 via ens18
[OK] DNS : 10.0.0.4
[AVERTISSEMENT] Disponibilité réelle des IP non vérifiée sur le réseau

=== BILAN ===
Erreurs : 0
Avertissements : 1
Précontrôles satisfaits. Aucune modification effectuée.

Commande suggérée (à lancer manuellement) :
/usr/local/sbin/ajlsm-deploy /etc/ajlsm/deploy/projets/mercure3.yaml --dry-run

[ERREUR] Une VM nommée MERCURE3 existe déjà :
  VMID 505 : stopped
root@Saturne3:/usr/local/sbin# qm destroy 505
qm config 505
Configuration file 'nodes/Saturne3/qemu-server/505.conf' does not exist
root@Saturne3:/usr/local/sbin# ./ajlsm-deploy /etc/ajlsm/deploy/projets/mercure3.yaml --clone

=== PRÉCONTRÔLES ===
[OK] Configuration YAML chargée

=== CONTRÔLES PROXMOX ===
[OK] VM source 506 présente
[OK] VM source 506 arrêtée
[OK] QEMU Guest Agent activé dans la configuration
[OK] Disque source scsi0 : 32 Gio
[OK] Prochain VMID proposé : 505 (non réservé)
[OK] CPU : 1 socket(s) × 8 cœur(s) = 8 vCPU
[OK] RAM : 16384 à 24576 Mio
[OK] Stockage local-zfs actif
[OK] Disque demandé : 100 Gio
[OK] Tags : interne

=== CONTRÔLES RÉSEAU ===
[OK] Bridge vmbr2 présent
[OK] net0 / ens18 : 10.0.0.43/24
[OK] Bridge vmbr1 présent
[OK] net1 / ens19 : 192.168.123.27/24
[OK] IP loopback : 51.83.117.113/32
[OK] Passerelle : 10.0.0.4 via ens18
[OK] DNS : 10.0.0.4
[AVERTISSEMENT] Disponibilité réelle des IP non vérifiée sur le réseau

=== BILAN ===
Erreurs : 0
Avertissements : 1
Précontrôles satisfaits. Aucune modification effectuée.

Commande suggérée (à lancer manuellement) :
/usr/local/sbin/ajlsm-deploy /etc/ajlsm/deploy/projets/mercure3.yaml --dry-run

=== PLAN DE CLONAGE ===
Source   : VM 506
Clone    : MERCURE3
VMID     : 505
Stockage : local-zfs
Type     : clone complet
Réseau   : isolation avant premier démarrage
Onboot   : désactivé
Démarrage: aucun

Pour créer la VM 505, confirmer (OUI/NON) : oui

[ACTION] Clonage en cours...
[OK] VM 505 créée
[ACTION] Isolation de net0
[ACTION] Isolation de net1
[OK] Adresses MAC du clone distinctes de TEMPLATE3
[OK] Clone arrêté
[OK] Démarrage automatique désactivé
[OK] Toutes les interfaces réseau isolées

=== CLONAGE TERMINÉ ===
VM 505 : MERCURE3
État : arrêtée, réseau isolé, onboot=0
Aucun démarrage effectué.
Prochaine phase : ressources CPU/RAM/disque.

Commande suggérée (à lancer manuellement) :
/usr/local/sbin/ajlsm-deploy /etc/ajlsm/deploy/projets/mercure3.yaml --resources-dry-run
root@Saturne3:/usr/local/sbin# /usr/local/sbin/ajlsm-deploy /etc/ajlsm/deploy/projets/mercure3.yaml --resources-dry-run

=== RESSOURCES : MERCURE3 (VM 505) ===
[OK] VM arrêtée, réseau isolé, onboot=0
[MODIFICATION] CPU : 2 x 4 -> 1 x 8
[MODIFICATION] RAM : 8192 -> 24576 Mio ; balloon : non défini -> 16384 Mio
[MODIFICATION] Disque scsi0 : 32 -> 100 Gio

[DRY-RUN] Aucune modification effectuée.

Commande suggérée (à lancer manuellement) :
/usr/local/sbin/ajlsm-deploy /etc/ajlsm/deploy/projets/mercure3.yaml --configure-resources
root@Saturne3:/usr/local/sbin# /usr/local/sbin/ajlsm-deploy /etc/ajlsm/deploy/projets/mercure3.yaml --configure-resources

=== RESSOURCES : MERCURE3 (VM 505) ===
[OK] VM arrêtée, réseau isolé, onboot=0
[MODIFICATION] CPU : 2 x 4 -> 1 x 8
[MODIFICATION] RAM : 8192 -> 24576 Mio ; balloon : non défini -> 16384 Mio
[MODIFICATION] Disque scsi0 : 32 -> 100 Gio

Pour appliquer les ressources à la VM 505, confirmer (OUI/NON) : oui
[ACTION] CPU : 2 x 4 -> 1 x 8
[ACTION] RAM : 8192 -> 24576 Mio ; balloon : non défini -> 16384 Mio
[ACTION] Disque scsi0 : 32 -> 100 Gio

[OK] Ressources configurées et vérifiées.
[OK] VM toujours arrêtée et réseau isolé.

Commande suggérée (à lancer manuellement) :
/usr/local/sbin/ajlsm-deploy /etc/ajlsm/deploy/projets/mercure3.yaml --first-boot-dry-run
root@Saturne3:/usr/local/sbin# /usr/local/sbin/ajlsm-deploy /etc/ajlsm/deploy/projets/mercure3.yaml --first-boot-apply

=== PREMIER DÉMARRAGE : MERCURE3 (VM 505) ===
[OK] Démarrage automatique désactivé, interfaces isolées
État actuel : stopped

Pour démarrer la VM 505 avec le réseau isolé, confirmer (OUI/NON) : oui
[ACTION] Démarrage de la VM 505 avec interfaces isolées
[OK] Agent QEMU disponible
[OK] ajlsm-clone-init terminé avec succès
[OK] UUID matériel conforme : ab93f3d0-c137-428c-acad-81f3196329c6
[OK] Phase de premier démarrage validée ; interfaces toujours isolées

Commande suggérée (à lancer manuellement) :
/usr/local/sbin/ajlsm-deploy /etc/ajlsm/deploy/projets/mercure3.yaml --system-dry-run
root@Saturne3:/usr/local/sbin# /usr/local/sbin/ajlsm-deploy /etc/ajlsm/deploy/projets/mercure3.yaml --system-dry-run
[OK] Agent QEMU disponible
[OK] ajlsm-clone-init terminé avec succès
Cible : MERCURE3 VM505, UUID ab93f3d0-c137-428c-acad-81f3196329c6, hostname mercure3.ajlsm.com
État de reprise : nouvelle transaction
[DRY-RUN] Sauvegarder hostname, hosts et les deux machine-id dans l'invité
[DRY-RUN] Préparer une identité aléatoire persistante, puis redémarrer isolé
[DRY-RUN] Vérifier boot_id, identité PID1, hostname, hosts et isolation

Commande suggérée (à lancer manuellement) :
/usr/local/sbin/ajlsm-deploy /etc/ajlsm/deploy/projets/mercure3.yaml --system-apply
root@Saturne3:/usr/local/sbin# /usr/local/sbin/ajlsm-deploy /etc/ajlsm/deploy/projets/mercure3.yaml --system-apply
[OK] Agent QEMU disponible
[OK] ajlsm-clone-init terminé avec succès
Cible : MERCURE3 VM505, UUID ab93f3d0-c137-428c-acad-81f3196329c6, hostname mercure3.ajlsm.com
État de reprise : nouvelle transaction

Cible : VM505 — mercure3.ajlsm.com
Cette opération modifiera l’identité système et redémarrera la VM avec le réseau isolé.
Confirmer (OUI/NON) : oui
[ACTION] Identité disque préparée ; identité active non encore validée
[OK] Agent QEMU disponible
[OK] ajlsm-clone-init terminé avec succès
[OK] Nouveau démarrage et identité active vérifiés ; VM505 toujours isolée

Commande suggérée (à lancer manuellement) :
/usr/local/sbin/ajlsm-deploy /etc/ajlsm/deploy/projets/mercure3.yaml --network-dry-run
root@Saturne3:/usr/local/sbin# /usr/local/sbin/ajlsm-deploy /etc/ajlsm/deploy/projets/mercure3.yaml --network-dry
[OK] Agent QEMU disponible
[OK] ajlsm-clone-init terminé avec succès
Cible : MERCURE3 VM505 ; reseau Proxmox isole
  ens18: 10.0.0.43/24
  ens19: 192.168.123.27/24
  lo: 51.83.117.113/32 ; passerelle: 10.0.0.4 (ens18) ; DNS: 10.0.0.4
[DRY-RUN] Sauvegarder le Netplan initial, ecrire la configuration et executer netplan generate
[DRY-RUN] Aucune modification ni activation reseau
[OK] Déploiement terminé ; procéder aux vérifications finales du manuel.
root@Saturne3:/usr/local/sbin# /usr/local/sbin/ajlsm-deploy /etc/ajlsm/deploy/projets/mercure3.yaml --network-apply
[OK] Agent QEMU disponible
[OK] ajlsm-clone-init terminé avec succès
Cible : MERCURE3 VM505 ; reseau Proxmox isole
  ens18: 10.0.0.43/24
  ens19: 192.168.123.27/24
  lo: 51.83.117.113/32 ; passerelle: 10.0.0.4 (ens18) ; DNS: 10.0.0.4
Cette operation remplace Netplan dans l'invite, sans activer les interfaces Proxmox.
Confirmer (OUI/NON) : oui
[OK] Netplan ecrit et netplan generate valide : {"changed": true, "backup": true}
[OK] VM505 toujours isolee ; aucune activation des liens

Commande suggérée (à lancer manuellement) :
/usr/local/sbin/ajlsm-deploy /etc/ajlsm/deploy/projets/mercure3.yaml --network-enable-dry-run
root@Saturne3:/usr/local/sbin# /usr/local/sbin/ajlsm-deploy /etc/ajlsm/deploy/projets/mercure3.yaml --network-enable
[OK] Agent QEMU disponible
[OK] ajlsm-clone-init terminé avec succès
[OK] ARP DAD 10.0.0.43 sur vmbr2 (aucune reponse)
[OK] ARP DAD 192.168.123.27 sur vmbr1 (aucune reponse)
[OK] VM505 UUID=ab93f3d0-c137-428c-acad-81f3196329c6, clone et Netplan valides, reseau isole
Activer le reseau de cette VM (OUI/NON) : oui
[OK] ARP DAD 10.0.0.43 sur vmbr2 (aucune reponse)
[OK] ARP DAD 192.168.123.27 sur vmbr1 (aucune reponse)
[OK] Adresses, loopback, route, DNS et ping passerelle valides
[OK] VM505 : reseau actif et controle, onboot conforme au YAML

Commande suggérée (à lancer manuellement) :
/usr/local/sbin/ajlsm-deploy /etc/ajlsm/deploy/projets/mercure3.yaml --ssh-audit
root@Saturne3:/usr/local/sbin# /usr/local/sbin/ajlsm-deploy /etc/ajlsm/deploy/projets/mercure3.yaml --ssh-audit
[OK] Clé ED25519 vérifiée via QEMU : 10.0.0.43
[OK] known_hosts actualisé avec sauvegarde conservée
=== Contrôle SSH, sans modification ===
Identité : mercure3.ajlsm.com

Clés autorisées ajlsm :
4096 SHA256:zGdW2VjyzL/p30BjtNy6dzXIahBWTH9djZLc62IKCAk siva@MacBook-Pro-de-Sivakavi.local (RSA)
256 SHA256:lVtwxE0No+RZNyOXpf64JBCnMYIk9YaMw43clCV92hk jlarvers@MacBook-Pro.lan (ED25519)
256 SHA256:HAHGVQ2Afy6vGJpLhJ2vftXonwV31QNOiFHH6t5BfB4 modou-mbp (ED25519)

Configuration effective SSH :
permitrootlogin prohibit-password
pubkeyauthentication yes
passwordauthentication yes
kbdinteractiveauthentication no

Règles sudo pour ajlsm :
User ajlsm may run the following commands on mercure3.ajlsm.com:
    (ALL : ALL) ALL

Etat du mot de passe ajlsm :
ajlsm P 2026-05-22 0 99999 7 -1
[OK] Connexion ajlsm par clé vérifiée.

Commande suggérée (à lancer manuellement) :
/usr/local/sbin/ajlsm-deploy /etc/ajlsm/deploy/projets/mercure3.yaml --ssh-secure
root@Saturne3:/usr/local/sbin# /usr/local/sbin/ajlsm-deploy /etc/ajlsm/deploy/projets/mercure3.yaml --ssh-secure
=== Contrôle SSH, sans modification ===
Identité : mercure3.ajlsm.com

Clés autorisées ajlsm :
4096 SHA256:zGdW2VjyzL/p30BjtNy6dzXIahBWTH9djZLc62IKCAk siva@MacBook-Pro-de-Sivakavi.local (RSA)
256 SHA256:lVtwxE0No+RZNyOXpf64JBCnMYIk9YaMw43clCV92hk jlarvers@MacBook-Pro.lan (ED25519)
256 SHA256:HAHGVQ2Afy6vGJpLhJ2vftXonwV31QNOiFHH6t5BfB4 modou-mbp (ED25519)

Configuration effective SSH :
permitrootlogin prohibit-password
pubkeyauthentication yes
passwordauthentication yes
kbdinteractiveauthentication no

Règles sudo pour ajlsm :
User ajlsm may run the following commands on mercure3.ajlsm.com:
    (ALL : ALL) ALL

Etat du mot de passe ajlsm :
ajlsm P 2026-05-22 0 99999 7 -1
[OK] Connexion ajlsm par clé vérifiée.
Appliquer PasswordAuthentication no et root par clé seulement [oui/non] : oui
[OK] SSH sécurisé ; root reste autorisé par clé.
[OK] Connexions root et ajlsm par clé toujours fonctionnelles.

Commande suggérée (à lancer manuellement) :
/usr/local/sbin/ajlsm-deploy /etc/ajlsm/deploy/projets/mercure3.yaml --password-ajlsm
root@Saturne3:/usr/local/sbin# /usr/local/sbin/ajlsm-deploy /etc/ajlsm/deploy/projets/mercure3.yaml --password-ajlsm
Ouvrir passwd ajlsm sur MERCURE3 [oui/non] : oui
Le mot de passe sera demandé deux fois par passwd sur la VM.
Il ne sera pas enregistré dans le script. Le reporter manuellement dans le fichier ODS.
New password: 
Retype new password: 
passwd: password updated successfully
Connection to 10.0.0.43 closed.
[OK] Mot de passe ajlsm modifié ; vérifier ensuite sudo -i depuis ajlsm.

Commande suggérée (à lancer manuellement) :
/usr/local/sbin/ajlsm-deploy /etc/ajlsm/deploy/projets/mercure3.yaml --tls-apply
root@Saturne3:/usr/local/sbin# /usr/local/sbin/ajlsm-deploy /etc/ajlsm/deploy/projets/mercure3.yaml --tls-apply
mercure3.ajlsm.com
subject=CN=clone-ab93f3d0-c13.internal
X509v3 Subject Alternative Name: 
    DNS:clone-ab93f3d0-c13.internal

Initialiser le certificat TLS interne [oui/non] : oui
Initialisation TLS pour : mercure3.ajlsm.com
....++++++++++++++++++++++++++++++++++++++++++*..+...++++++++++++++++++++++++++++++++++++++++++*........+............+...+.............+..+.......+.....................+..+............+.+.....+.+...+..+.+...+...........+.+...............+..............+.........+....+.....+.+.........+....................+...+..........+..............+.+.....+...+++++
...........+..+...+.............+.....+....+..+......+.........+......+.......++++++++++++++++++++++++++++++++++++++++++*.........++++++++++++++++++++++++++++++++++++++++++*....................+................+...+......+.....+....+.....+.........+...+....+...+..+..........+.........+.........+..+....+++++
-----
Syntax OK

Initialisation TLS terminée.
Sauvegarde : /etc/ssl/ajlsm/backup.8vB54QHP
subject=CN=mercure3.ajlsm.com
notBefore=Oct 16 13:54:38 2026 GMT
notAfter=Oct 13 13:54:38 2036 GMT
subject=CN=mercure3.ajlsm.com
X509v3 Subject Alternative Name: 
    DNS:mercure3.ajlsm.com
active

[OK] Phases techniques terminées ; les opérations applicatives seront traitées séparément.
root@Saturne3:/usr/local/sbin# 
root@Saturne3:/usr/local/sbin# 
root@Saturne3:/usr/local/sbin# 
root@Saturne3:/usr/local/sbin# 
root@Saturne3:/usr/local/sbin# 
root@Saturne3:/usr/local/sbin# 
root@Saturne3:/usr/local/sbin# 
root@Saturne3:/usr/local/sbin# 
root@Saturne3:/usr/local/sbin# 
root@Saturne3:/usr/local/sbin# ssh ajlsm@10.0.0.43
sudo -i
hostname
lsblk
df -hT /
Welcome to Ubuntu 26.04.1 LTS (GNU/Linux 7.0.0-38-generic x86_64)

 * Documentation:  https://docs.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/pro

 System information as of Fri Oct 16 03:56:00 PM CEST 2026

  System load:  0.35               Processes:              190
  Usage of /:   54.2% of 14.66GB   Users logged in:        0
  Memory usage: 3%                 IPv4 address for ens18: 10.0.0.43
  Swap usage:   0%

 * Canonical Workshop gives developers fast, composable, reproducible, and
   secure developer environments that are perfect for agentic workflows.

   https://ubuntu.com/workshop

Expanded Security Maintenance for Applications is not enabled.

1 update can be applied immediately.
To see these additional updates run: apt list --upgradable

9 additional security updates can be applied with ESM Apps.
Learn more about enabling ESM Apps service at https://ubuntu.com/esm


You have new mail.
Last login: Thu Oct 15 08:18:27 2026 from 10.40.0.2
ajlsm@mercure3:~$ sudo -i
[sudo: authenticate] Password:                     
root@mercure3:~# hostname
lsblk
df -hT /
mercure3.ajlsm.com
NAME                      MAJ:MIN RM  SIZE RO TYPE MOUNTPOINTS
sda                         8:0    0  100G  0 disk 
├─sda1                      8:1    0    1M  0 part 
├─sda2                      8:2    0    2G  0 part /boot
└─sda3                      8:3    0   30G  0 part 
  └─ubuntu--vg-ubuntu--lv 252:0    0   15G  0 lvm  /
Filesystem                        Type  Size  Used Avail Use% Mounted on
/dev/mapper/ubuntu--vg-ubuntu--lv ext4   15G  8.0G  6.0G  58% /
root@mercure3:~# pvs
vgs
lvs -o lv_path,lv_size,vg_name
findmnt -no SOURCE,FSTYPE /
command -v growpart
  PV         VG        Fmt  Attr PSize   PFree 
  /dev/sda3  ubuntu-vg lvm2 a--  <30.00g 15.00g
  VG        #PV #LV #SN Attr   VSize   VFree 
  ubuntu-vg   1   1   0 wz--n- <30.00g 15.00g
  Path                     LSize   VG       
  /dev/ubuntu-vg/ubuntu-lv <15.00g ubuntu-vg
/dev/mapper/ubuntu--vg-ubuntu--lv ext4
/usr/bin/growpart
root@mercure3:~# 
root@mercure3:~# lsblk
pvs
vgs
df -hT /
NAME                      MAJ:MIN RM  SIZE RO TYPE MOUNTPOINTS
sda                         8:0    0  100G  0 disk 
├─sda1                      8:1    0    1M  0 part 
├─sda2                      8:2    0    2G  0 part /boot
└─sda3                      8:3    0   30G  0 part 
  └─ubuntu--vg-ubuntu--lv 252:0    0   15G  0 lvm  /
  PV         VG        Fmt  Attr PSize   PFree 
  /dev/sda3  ubuntu-vg lvm2 a--  <30.00g 15.00g
  VG        #PV #LV #SN Attr   VSize   VFree 
  ubuntu-vg   1   1   0 wz--n- <30.00g 15.00g
Filesystem                        Type  Size  Used Avail Use% Mounted on
/dev/mapper/ubuntu--vg-ubuntu--lv ext4   15G  8.0G  6.0G  58% /
root@mercure3:~# growpart /dev/sda 3
CHANGED: partition=3 start=4198400 old: size=62908416 end=67106815 new: size=205516767 end=209715166
root@mercure3:~# /usr/local/sbin/ajlsm-deploy --help
-bash: /usr/local/sbin/ajlsm-deploy: No such file or directory
root@mercure3:~# exit
logout
ajlsm@mercure3:~$ exit
logout
Connection to 10.0.0.43 closed.
root@Saturne3:~# /usr/local/sbin/ajlsm-deploy /etc/ajlsm/deploy/projets/mercure3.yaml --root-grow-apply
=== EXTENSION RACINE : VM 505 (APPLY) ===
Étendre la partition, le LVM et ext4 de la VM 505 [OUI/NON] : oui
[ETAT] {"disk_bytes": 107374182400, "grow_partition": false, "lv": "/dev/ubuntu-vg/ubuntu-lv", "partition_free_bytes_approx": 16896, "pv": "/dev/sda3", "root": "/dev/mapper/ubuntu--vg-ubuntu--lv ext4", "vg": "ubuntu-vg", "vg_free_bytes": 89120571392}
[ACTION] pvresize /dev/sda3
[ACTION] lvextend -r -l +100%FREE /dev/ubuntu-vg/ubuntu-lv
[OK] Extension racine vérifiée : Filesystem                        Type  Size  Used Avail Use% Mounted on
/dev/mapper/ubuntu--vg-ubuntu--lv ext4   97G  8.0G   85G   9% /


Commande suggérée (à lancer manuellement) :
/usr/local/sbin/ajlsm-deploy /etc/ajlsm/deploy/projets/mercure3.yaml --system-apply
[OK] Déploiement terminé ; procéder aux vérifications finales du manuel.
root@Saturne3:~# Read from remote host 141.95.206.118: Connection reset by peer
Connection to 141.95.206.118 closed.
client_loop: send disconnect: Broken pipe
jlarvers@MacBook-Pro ~ % ssh saturne3
Linux Saturne3 7.0.14-23-pve #1 SMP PREEMPT_DYNAMIC PMX 7.0.14-23 (2026-10-07T20:25Z) x86_64

The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
Last login: Fri Oct 16 16:02:53 2026 from 109.190.129.96
root@Saturne3:~# ls -la
total 208
drwx------  9 root root  4096 Oct 16 16:44  .
drwxr-xr-x 18 root root  4096 Apr  1  2026  ..
-rw-------  1 root root 14581 Oct 16 16:36  .bash_history
-rw-r--r--  1 root root   607 Mar  2  2026  .bashrc
drwxr-xr-x  3 root root  4096 Apr  2  2026  .cache
drwx------  5 root root  4096 Apr 20 10:28  .config
-rw-r--r--  1 root root    35 Apr 30 11:01  .forward
-rw-------  1 root root    28 Oct 15 23:52  .lesshst
drwxr-xr-x  3 root root  4096 Apr  1  2026  .local
-rw-r--r--  1 root root    50 Apr  1  2026  .ovhrc
-rw-------  1 root root    37 Apr 20 11:05  .pbs_token_saturne3
-rw-r--r--  1 root root   132 Mar  2  2026  .profile
-rw-------  1 root root  1024 Apr  1  2026  .rnd
-rw-r--r--  1 root root    75 Apr 20 10:24  .selected_editor
drwx------  2 root root  4096 Oct 16 15:53  .ssh
-rw-------  1 root root 16696 Oct 15 23:50  .viminfo
-rw-r--r--  1 root root 32718 Oct 16 16:06  ajlsm-deploy-actuel.tar.gz
-rw-r--r--  1 root root 46186 Oct 16 16:44  ajlsm-deploy-cycle.zip
drwxr-x---  8 root root  4096 Oct 15 23:53  ajlsm-deploy-review
-rw-------  1 root root   161 Apr  2  2026  dead.letter
drwxr-xr-x  6 root root  4096 Oct 14 13:16  export-supervision-svn
-rw-r--r--  1 root root 12216 Oct 15 23:52 'm-deploy | col -b | grep -n -E '
-rw-r--r--  1 root root  4680 Oct 14 13:19  supervision-ajlsm-2026-10-14.tar.gz
drwxr-xr-x  2 root root  4096 Oct 13 17:15  supervision-test
root@Saturne3:~# mkdir -p /root/ajlsm-deploy/archives
mkdir -p /root/ajlsm-deploy/recettes/20261016

mv /root/ajlsm-deploy-actuel.tar.gz /root/ajlsm-deploy/archives/
mv /root/ajlsm-deploy-cycle.zip /root/ajlsm-deploy/archives/

unzip /root/ajlsm-deploy/archives/ajlsm-deploy-cycle.zip \
  -d /root/ajlsm-deploy/recettes/20261016

cd /root/ajlsm-deploy/recettes/20261016/ajlsm-deploy-cycle
chmod 750 ajlsm-deploy ajlsm-deploy-check ajlsm-deploy-resources ajlsm-deploy-cycle
-bash: unzip: command not found
-bash: cd: /root/ajlsm-deploy/recettes/20261016/ajlsm-deploy-cycle: No such file or directory
chmod: cannot access 'ajlsm-deploy-check': No such file or directory
chmod: cannot access 'ajlsm-deploy-resources': No such file or directory
chmod: cannot access 'ajlsm-deploy-cycle': No such file or directory
root@Saturne3:~# mkdir -p /root/ajlsm-deploy/archives
mkdir -p /root/ajlsm-deploy/recettes/20261016

mv /root/ajlsm-deploy-actuel.tar.gz /root/ajlsm-deploy/archives/
mv /root/ajlsm-deploy-cycle.zip /root/ajlsm-deploy/archives/

unzip /root/ajlsm-deploy/archives/ajlsm-deploy-cycle.zip \
  -d /root/ajlsm-deploy/recettes/20261016

cd /root/ajlsm-deploy/recettes/20261016/ajlsm-deploy-cycle
chmod 750 ajlsm-deploy ajlsm-deploy-check ajlsm-deploy-resources ajlsm-deploy-cycle
mv: cannot stat '/root/ajlsm-deploy-actuel.tar.gz': No such file or directory
mv: cannot stat '/root/ajlsm-deploy-cycle.zip': No such file or directory
-bash: unzip: command not found
-bash: cd: /root/ajlsm-deploy/recettes/20261016/ajlsm-deploy-cycle: No such file or directory
chmod: cannot access 'ajlsm-deploy-check': No such file or directory
chmod: cannot access 'ajlsm-deploy-resources': No such file or directory
chmod: cannot access 'ajlsm-deploy-cycle': No such file or directory
root@Saturne3:~# python3 -m zipfile -e \
  /root/ajlsm-deploy/archives/ajlsm-deploy-cycle.zip \
  /root/ajlsm-deploy/recettes/20261016 &&
cd /root/ajlsm-deploy/recettes/20261016/ajlsm-deploy-cycle &&
chmod 750 ajlsm-deploy ajlsm-deploy-check ajlsm-deploy-resources ajlsm-deploy-cycle &&
./ajlsm-deploy-cycle /etc/ajlsm/deploy/projets/mercure3.yaml --plan

=== ÉTAPE 1/11 : clonage ===
/usr/bin/python3 /root/ajlsm-deploy/recettes/20261016/ajlsm-deploy-cycle/ajlsm-deploy /etc/ajlsm/deploy/projets/mercure3.yaml --clone --agent-timeout 300

=== ÉTAPE 2/11 : ressources ===
/usr/bin/python3 /root/ajlsm-deploy/recettes/20261016/ajlsm-deploy-cycle/ajlsm-deploy /etc/ajlsm/deploy/projets/mercure3.yaml --configure-resources --agent-timeout 300

=== ÉTAPE 3/11 : premier-demarrage ===
/usr/bin/python3 /root/ajlsm-deploy/recettes/20261016/ajlsm-deploy-cycle/ajlsm-deploy /etc/ajlsm/deploy/projets/mercure3.yaml --first-boot-apply --agent-timeout 300

=== ÉTAPE 4/11 : extension-racine ===
/usr/bin/python3 /root/ajlsm-deploy/recettes/20261016/ajlsm-deploy-cycle/ajlsm-deploy /etc/ajlsm/deploy/projets/mercure3.yaml --root-grow-apply --agent-timeout 300

=== ÉTAPE 5/11 : identite ===
/usr/bin/python3 /root/ajlsm-deploy/recettes/20261016/ajlsm-deploy-cycle/ajlsm-deploy /etc/ajlsm/deploy/projets/mercure3.yaml --system-apply --agent-timeout 300

=== ÉTAPE 6/11 : netplan ===
/usr/bin/python3 /root/ajlsm-deploy/recettes/20261016/ajlsm-deploy-cycle/ajlsm-deploy /etc/ajlsm/deploy/projets/mercure3.yaml --network-apply --agent-timeout 300

=== ÉTAPE 7/11 : activation-reseau ===
/usr/bin/python3 /root/ajlsm-deploy/recettes/20261016/ajlsm-deploy-cycle/ajlsm-deploy /etc/ajlsm/deploy/projets/mercure3.yaml --network-enable --agent-timeout 300

=== ÉTAPE 8/11 : audit-ssh ===
/usr/bin/python3 /root/ajlsm-deploy/recettes/20261016/ajlsm-deploy-cycle/ajlsm-deploy /etc/ajlsm/deploy/projets/mercure3.yaml --ssh-audit --agent-timeout 300

=== ÉTAPE 9/11 : securisation-ssh ===
/usr/bin/python3 /root/ajlsm-deploy/recettes/20261016/ajlsm-deploy-cycle/ajlsm-deploy /etc/ajlsm/deploy/projets/mercure3.yaml --ssh-secure --agent-timeout 300

=== ÉTAPE 10/11 : mot-de-passe ===
/usr/bin/python3 /root/ajlsm-deploy/recettes/20261016/ajlsm-deploy-cycle/ajlsm-deploy /etc/ajlsm/deploy/projets/mercure3.yaml --password-ajlsm --agent-timeout 300

=== ÉTAPE 11/11 : tls ===
/usr/bin/python3 /root/ajlsm-deploy/recettes/20261016/ajlsm-deploy-cycle/ajlsm-deploy /etc/ajlsm/deploy/projets/mercure3.yaml --tls-apply --agent-timeout 300

[PLAN] Aucune phase exécutée.
root@Saturne3:~/ajlsm-deploy/recettes/20261016/ajlsm-deploy-cycle# 
root@Saturne3:~/ajlsm-deploy/recettes/20261016/ajlsm-deploy-cycle# 
root@Saturne3:~/ajlsm-deploy/recettes/20261016/ajlsm-deploy-cycle# qm config 505
agent: 1
balloon: 16384
boot: order=scsi0;net0
cores: 8
cpu: x86-64-v2-AES
memory: 24576
meta: creation-qemu=11.0.0,ctime=1779439732
name: MERCURE3
net0: virtio=BC:24:11:F6:BC:A4,bridge=vmbr2,firewall=1,link_down=0
net1: virtio=BC:24:11:A5:17:8E,bridge=vmbr1,firewall=1,link_down=0
numa: 0
onboot: 1
ostype: l26
scsi0: local-zfs:vm-505-disk-0,iothread=1,size=100G
scsihw: virtio-scsi-single
smbios1: uuid=ab93f3d0-c137-428c-acad-81f3196329c6
sockets: 1
tags: interne
vmgenid: d71326df-130f-4394-bd68-6f8c493047e1
root@Saturne3:~/ajlsm-deploy/recettes/20261016/ajlsm-deploy-cycle# qm set 505 --onboot 0 &&
qm shutdown 505 --timeout 120 &&
qm destroy 505 &&
./ajlsm-deploy-cycle /etc/ajlsm/deploy/projets/mercure3.yaml
update VM 505: -onboot 0

=== ÉTAPE 1/11 : clonage ===
/usr/bin/python3 /root/ajlsm-deploy/recettes/20261016/ajlsm-deploy-cycle/ajlsm-deploy /etc/ajlsm/deploy/projets/mercure3.yaml --clone --agent-timeout 300

=== PRÉCONTRÔLES ===
[OK] Configuration YAML chargée

=== CONTRÔLES PROXMOX ===
[OK] VM source 506 présente
[OK] VM source 506 arrêtée
[OK] QEMU Guest Agent activé dans la configuration
[OK] Disque source scsi0 : 32 Gio
[OK] Prochain VMID proposé : 505 (non réservé)
[OK] CPU : 1 socket(s) × 8 cœur(s) = 8 vCPU
[OK] RAM : 16384 à 24576 Mio
[OK] Stockage local-zfs actif
[OK] Disque demandé : 100 Gio
[OK] Tags : interne

=== CONTRÔLES RÉSEAU ===
[OK] Bridge vmbr2 présent
[OK] net0 / ens18 : 10.0.0.43/24
[OK] Bridge vmbr1 présent
[OK] net1 / ens19 : 192.168.123.27/24
[OK] IP loopback : 51.83.117.113/32
[OK] Passerelle : 10.0.0.4 via ens18
[OK] DNS : 10.0.0.4
[AVERTISSEMENT] Disponibilité réelle des IP non vérifiée sur le réseau

=== BILAN ===
Erreurs : 0
Avertissements : 1
Précontrôles satisfaits. Aucune modification effectuée.

=== PLAN DE CLONAGE ===
Source   : VM 506
Clone    : MERCURE3
VMID     : 505
Stockage : local-zfs
Type     : clone complet
Réseau   : isolation avant premier démarrage
Onboot   : désactivé
Démarrage: aucun

Pour créer la VM 505, confirmer (OUI/NON) : oui

[ACTION] Clonage en cours...
[OK] VM 505 créée
[ACTION] Isolation de net0
[ACTION] Isolation de net1
[OK] Adresses MAC du clone distinctes de TEMPLATE3
[OK] Clone arrêté
[OK] Démarrage automatique désactivé
[OK] Toutes les interfaces réseau isolées

=== CLONAGE TERMINÉ ===
VM 505 : MERCURE3
État : arrêtée, réseau isolé, onboot=0
Aucun démarrage effectué.
Prochaine phase : ressources CPU/RAM/disque.

=== ÉTAPE 2/11 : ressources ===
/usr/bin/python3 /root/ajlsm-deploy/recettes/20261016/ajlsm-deploy-cycle/ajlsm-deploy /etc/ajlsm/deploy/projets/mercure3.yaml --configure-resources --agent-timeout 300

=== RESSOURCES : MERCURE3 (VM 505) ===
[OK] VM arrêtée, réseau isolé, onboot=0
[MODIFICATION] CPU : 2 x 4 -> 1 x 8
[MODIFICATION] RAM : 8192 -> 24576 Mio ; balloon : non défini -> 16384 Mio
[MODIFICATION] Disque scsi0 : 32 -> 100 Gio

Pour appliquer les ressources à la VM 505, confirmer (OUI/NON) : oui
[ACTION] CPU : 2 x 4 -> 1 x 8
[ACTION] RAM : 8192 -> 24576 Mio ; balloon : non défini -> 16384 Mio
[ACTION] Disque scsi0 : 32 -> 100 Gio

[OK] Ressources configurées et vérifiées.
[OK] VM toujours arrêtée et réseau isolé.

=== ÉTAPE 3/11 : premier-demarrage ===
/usr/bin/python3 /root/ajlsm-deploy/recettes/20261016/ajlsm-deploy-cycle/ajlsm-deploy /etc/ajlsm/deploy/projets/mercure3.yaml --first-boot-apply --agent-timeout 300

=== PREMIER DÉMARRAGE : MERCURE3 (VM 505) ===
[OK] Démarrage automatique désactivé, interfaces isolées
État actuel : stopped

Pour démarrer la VM 505 avec le réseau isolé, confirmer (OUI/NON) : oui
[ACTION] Démarrage de la VM 505 avec interfaces isolées
[OK] Agent QEMU disponible
[OK] ajlsm-clone-init terminé avec succès
[OK] UUID matériel conforme : 89aea8cb-9fd5-4b3b-9e06-a80cfa014f5b
[OK] Phase de premier démarrage validée ; interfaces toujours isolées

=== ÉTAPE 4/11 : extension-racine ===
/usr/bin/python3 /root/ajlsm-deploy/recettes/20261016/ajlsm-deploy-cycle/ajlsm-deploy /etc/ajlsm/deploy/projets/mercure3.yaml --root-grow-apply --agent-timeout 300
=== EXTENSION RACINE : VM 505 (APPLY) ===
Étendre la partition, le LVM et ext4 de la VM 505 [OUI/NON] : oui
[ETAT] {"disk_bytes": 107374182400, "grow_partition": true, "lv": "/dev/ubuntu-vg/ubuntu-lv", "partition_free_bytes_approx": 73015492608, "pv": "/dev/sda3", "root": "/dev/mapper/ubuntu--vg-ubuntu--lv ext4", "vg": "ubuntu-vg", "vg_free_bytes": 16106127360}
[ACTION] growpart /dev/sda 3
[ACTION] pvresize /dev/sda3
[ACTION] lvextend -r -l +100%FREE /dev/ubuntu-vg/ubuntu-lv
[OK] Extension racine vérifiée : Filesystem                        Type  Size  Used Avail Use% Mounted on
/dev/mapper/ubuntu--vg-ubuntu--lv ext4   97G  8.0G   85G   9% /


=== ÉTAPE 5/11 : identite ===
/usr/bin/python3 /root/ajlsm-deploy/recettes/20261016/ajlsm-deploy-cycle/ajlsm-deploy /etc/ajlsm/deploy/projets/mercure3.yaml --system-apply --agent-timeout 300
[OK] Agent QEMU disponible
[OK] ajlsm-clone-init terminé avec succès
Cible : MERCURE3 VM505, UUID 89aea8cb-9fd5-4b3b-9e06-a80cfa014f5b, hostname mercure3.ajlsm.com
État de reprise : nouvelle transaction

Cible : VM505 — mercure3.ajlsm.com
Cette opération modifiera l’identité système et redémarrera la VM avec le réseau isolé.
Confirmer (OUI/NON) : oui
[ACTION] Identité disque préparée ; identité active non encore validée
[OK] Agent QEMU disponible
[OK] ajlsm-clone-init terminé avec succès
[OK] Nouveau démarrage et identité active vérifiés ; VM505 toujours isolée

=== ÉTAPE 6/11 : netplan ===
/usr/bin/python3 /root/ajlsm-deploy/recettes/20261016/ajlsm-deploy-cycle/ajlsm-deploy /etc/ajlsm/deploy/projets/mercure3.yaml --network-apply --agent-timeout 300
[OK] Agent QEMU disponible
[OK] ajlsm-clone-init terminé avec succès
Cible : MERCURE3 VM505 ; reseau Proxmox isole
  ens18: 10.0.0.43/24
  ens19: 192.168.123.27/24
  lo: 51.83.117.113/32 ; passerelle: 10.0.0.4 (ens18) ; DNS: 10.0.0.4
Cette operation remplace Netplan dans l'invite, sans activer les interfaces Proxmox.
Confirmer (OUI/NON) : oui
[OK] Netplan ecrit et netplan generate valide : {"changed": true, "backup": true}
[OK] VM505 toujours isolee ; aucune activation des liens

=== ÉTAPE 7/11 : activation-reseau ===
/usr/bin/python3 /root/ajlsm-deploy/recettes/20261016/ajlsm-deploy-cycle/ajlsm-deploy /etc/ajlsm/deploy/projets/mercure3.yaml --network-enable --agent-timeout 300
[OK] Agent QEMU disponible
[OK] ajlsm-clone-init terminé avec succès
[OK] ARP DAD 10.0.0.43 sur vmbr2 (aucune reponse)
[OK] ARP DAD 192.168.123.27 sur vmbr1 (aucune reponse)
[OK] VM505 UUID=89aea8cb-9fd5-4b3b-9e06-a80cfa014f5b, clone et Netplan valides, reseau isole
Activer le reseau de cette VM (OUI/NON) : oui
[OK] ARP DAD 10.0.0.43 sur vmbr2 (aucune reponse)
[OK] ARP DAD 192.168.123.27 sur vmbr1 (aucune reponse)
[OK] Adresses, loopback, route, DNS et ping passerelle valides
[OK] VM505 : reseau actif et controle, onboot conforme au YAML

=== ÉTAPE 8/11 : audit-ssh ===
/usr/bin/python3 /root/ajlsm-deploy/recettes/20261016/ajlsm-deploy-cycle/ajlsm-deploy /etc/ajlsm/deploy/projets/mercure3.yaml --ssh-audit --agent-timeout 300
[OK] Clé ED25519 vérifiée via QEMU : 10.0.0.43
[OK] known_hosts actualisé avec sauvegarde conservée
=== Contrôle SSH, sans modification ===
Identité : mercure3.ajlsm.com

Clés autorisées ajlsm :
4096 SHA256:zGdW2VjyzL/p30BjtNy6dzXIahBWTH9djZLc62IKCAk siva@MacBook-Pro-de-Sivakavi.local (RSA)
256 SHA256:lVtwxE0No+RZNyOXpf64JBCnMYIk9YaMw43clCV92hk jlarvers@MacBook-Pro.lan (ED25519)
256 SHA256:HAHGVQ2Afy6vGJpLhJ2vftXonwV31QNOiFHH6t5BfB4 modou-mbp (ED25519)

Configuration effective SSH :
permitrootlogin prohibit-password
pubkeyauthentication yes
passwordauthentication yes
kbdinteractiveauthentication no

Règles sudo pour ajlsm :
User ajlsm may run the following commands on mercure3.ajlsm.com:
    (ALL : ALL) ALL

Etat du mot de passe ajlsm :
ajlsm P 2026-05-22 0 99999 7 -1
[OK] Connexion ajlsm par clé vérifiée.

=== ÉTAPE 9/11 : securisation-ssh ===
/usr/bin/python3 /root/ajlsm-deploy/recettes/20261016/ajlsm-deploy-cycle/ajlsm-deploy /etc/ajlsm/deploy/projets/mercure3.yaml --ssh-secure --agent-timeout 300
=== Contrôle SSH, sans modification ===
Identité : mercure3.ajlsm.com

Clés autorisées ajlsm :
4096 SHA256:zGdW2VjyzL/p30BjtNy6dzXIahBWTH9djZLc62IKCAk siva@MacBook-Pro-de-Sivakavi.local (RSA)
256 SHA256:lVtwxE0No+RZNyOXpf64JBCnMYIk9YaMw43clCV92hk jlarvers@MacBook-Pro.lan (ED25519)
256 SHA256:HAHGVQ2Afy6vGJpLhJ2vftXonwV31QNOiFHH6t5BfB4 modou-mbp (ED25519)

Configuration effective SSH :
permitrootlogin prohibit-password
pubkeyauthentication yes
passwordauthentication yes
kbdinteractiveauthentication no

Règles sudo pour ajlsm :
User ajlsm may run the following commands on mercure3.ajlsm.com:
    (ALL : ALL) ALL

Etat du mot de passe ajlsm :
ajlsm P 2026-05-22 0 99999 7 -1
[OK] Connexion ajlsm par clé vérifiée.
Appliquer PasswordAuthentication no et root par clé seulement [oui/non] : oui
[OK] SSH sécurisé ; root reste autorisé par clé.
[OK] Connexions root et ajlsm par clé toujours fonctionnelles.

=== ÉTAPE 10/11 : mot-de-passe ===
/usr/bin/python3 /root/ajlsm-deploy/recettes/20261016/ajlsm-deploy-cycle/ajlsm-deploy /etc/ajlsm/deploy/projets/mercure3.yaml --password-ajlsm --agent-timeout 300
Ouvrir passwd ajlsm sur MERCURE3 [oui/non] : oui
Le mot de passe sera demandé deux fois par passwd sur la VM.
Il ne sera pas enregistré dans le script. Le reporter manuellement dans le fichier ODS.
New password: 
Retype new password: 
passwd: password updated successfully
Connection to 10.0.0.43 closed.
[OK] Mot de passe ajlsm modifié ; vérifier ensuite sudo -i depuis ajlsm.

=== ÉTAPE 11/11 : tls ===
/usr/bin/python3 /root/ajlsm-deploy/recettes/20261016/ajlsm-deploy-cycle/ajlsm-deploy /etc/ajlsm/deploy/projets/mercure3.yaml --tls-apply --agent-timeout 300
mercure3.ajlsm.com
subject=CN=clone-89aea8cb-9fd.internal
X509v3 Subject Alternative Name: 
    DNS:clone-89aea8cb-9fd.internal

Initialiser le certificat TLS interne [oui/non] : oui
Initialisation TLS pour : mercure3.ajlsm.com
...+......+.+..+.......+...+.....+......++++++++++++++++++++++++++++++++++++++++++*.+....+...+..+......+.++++++++++++++++++++++++++++++++++++++++++*....+...............+.....+....+............+..+......+........................+.+.........+.....+......+....+...+++++
...+..........+...++++++++++++++++++++++++++++++++++++++++++*.+....+...+...+..............+............+.+........+.+...............+...........++++++++++++++++++++++++++++++++++++++++++*...+......+...+....+.................+....+..+...+....+.....+..........+......+.....................+...+...+.....+...+.+...+........+...+.......+..+..........+..+....+..+....+.........+...........+...................+......+.....+.............+..+.+...............+............+......+.....+.+.........+....................+.......+............+...+..+......+.+.........+..+.......+...+.................+.+.....+.+..............+.+...............+........+......+.........+.......+.....+....+..+.......+......+...........+...+......+.........+............+.+..+.......+......+.....+....+.....+.............+........+.........+.+............+......+.....+..........+......+.....+....+......+.....+.+...+..+............+......+......+....+...........+.+..+.+..............+............................+...+.....+.......+..+..........+.....+.......+....................+....+..+.......+..+....+.........+...........+.+.........+...........+....+.........+...........+..........+.....+......+.+.....+.......+..+......+...+++++
-----
Syntax OK

Initialisation TLS terminée.
Sauvegarde : /etc/ssl/ajlsm/backup.ZSmJKspN
subject=CN=mercure3.ajlsm.com
notBefore=Oct 16 14:58:53 2026 GMT
notAfter=Oct 13 14:58:53 2036 GMT
subject=CN=mercure3.ajlsm.com
X509v3 Subject Alternative Name: 
    DNS:mercure3.ajlsm.com
active


[OK] Cycle technique terminé ; procéder aux vérifications finales.
root@Saturne3:~/ajlsm-deploy/recettes/20261016/ajlsm-deploy-cycle# ssh ajlsm@10.0.0.43
sudo -i
hostname
df -hT /
Welcome to Ubuntu 26.04.1 LTS (GNU/Linux 7.0.0-38-generic x86_64)

 * Documentation:  https://docs.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/pro

 System information as of Fri Oct 16 05:00:42 PM CEST 2026

  System load:  0.09              Processes:              193
  Usage of /:   8.2% of 96.34GB   Users logged in:        0
  Memory usage: 3%                IPv4 address for ens18: 10.0.0.43
  Swap usage:   0%

 * Canonical Workshop gives developers fast, composable, reproducible, and
   secure developer environments that are perfect for agentic workflows.

   https://ubuntu.com/workshop

Expanded Security Maintenance for Applications is not enabled.

1 update can be applied immediately.
To see these additional updates run: apt list --upgradable

9 additional security updates can be applied with ESM Apps.
Learn more about enabling ESM Apps service at https://ubuntu.com/esm


You have new mail.
Last login: Thu Oct 15 08:18:27 2026 from 10.40.0.2
ajlsm@mercure3:~$ sudo -i
[sudo: authenticate] Password:                     
root@mercure3:~# hostname
df -hT /
mercure3.ajlsm.com
Filesystem                        Type  Size  Used Avail Use% Mounted on
/dev/mapper/ubuntu--vg-ubuntu--lv ext4   97G  8.0G   85G   9% /
root@mercure3:~# exit
logout
ajlsm@mercure3:~$ exit
logout
Connection to 10.0.0.43 closed.
root@Saturne3:~# python3 -m zipfile -e \
  /root/ajlsm-deploy/archives/ajlsm-deploy-assistant.zip \
  /root/ajlsm-deploy/recettes/20261016
root@Saturne3:~# install -m 750 \
  /root/ajlsm-deploy/recettes/20261016/ajlsm-deploy-assistant/ajlsm-deploy-yaml \
  /root/ajlsm-deploy/recettes/20261016/ajlsm-deploy-cycle/ajlsm-deploy-yaml
root@Saturne3:~# cd /root/ajlsm-deploy/recettes/20261016/ajlsm-deploy-cycle &&
./ajlsm-deploy-yaml /etc/ajlsm/deploy/projets/mercure3.yaml --check
[OK] Valeurs YAML valides. Aucun fichier modifié, aucun contrôle d’infrastructure effectué.
root@Saturne3:~/ajlsm-deploy/recettes/20261016/ajlsm-deploy-cycle# ./ajlsm-deploy-yaml /etc/ajlsm/deploy/projets/mercure3.yaml --review \
  --output /root/ajlsm-deploy/recettes/20261016/mercure3-relecture.yaml
Assistant local : ANNULER permet de quitter sans enregistrer.
Les commentaires du fichier source restent dans l’original ; la copie sera réécrite en YAML.

projet.code — texte obligatoire ; syntaxe : [a-z0-9][a-z0-9_-]*
Valeur actuelle : mercure3
Nouvelle valeur (Entrée = conserver) : 

projet.nom — texte obligatoire
Valeur actuelle : MERCURE3
Nouvelle valeur (Entrée = conserver) : 

projet.environnement — interne, client ou prod
Valeur actuelle : interne
Nouvelle valeur (Entrée = conserver) : 

proxmox.serveur — texte obligatoire ; syntaxe : [A-Za-z0-9][A-Za-z0-9.-]*
Valeur actuelle : Saturne3
Nouvelle valeur (Entrée = conserver) : 

proxmox.template_vmid — entier strictement positif
Valeur actuelle : 506
Nouvelle valeur (Entrée = conserver) : 

proxmox.vmid — null ou auto = automatique ; sinon entier positif
Valeur actuelle : null
Nouvelle valeur (Entrée = conserver) : 

proxmox.nom_vm — texte obligatoire ; syntaxe : [A-Za-z0-9][A-Za-z0-9.-]*
Valeur actuelle : MERCURE3
Nouvelle valeur (Entrée = conserver) : 

proxmox.cpu.sockets — entier strictement positif
Valeur actuelle : 1
Nouvelle valeur (Entrée = conserver) : 

proxmox.cpu.cores — entier strictement positif
Valeur actuelle : 8
Nouvelle valeur (Entrée = conserver) : 

proxmox.memoire.maximale_mib — entier strictement positif
Valeur actuelle : 24576
Nouvelle valeur (Entrée = conserver) : 

proxmox.memoire.minimale_mib — entier strictement positif
Valeur actuelle : 16384
Nouvelle valeur (Entrée = conserver) : 

proxmox.disque_systeme.stockage — texte obligatoire ; syntaxe : [A-Za-z0-9][A-Za-z0-9_.-]*
Valeur actuelle : local-zfs
Nouvelle valeur (Entrée = conserver) : 

proxmox.disque_systeme.taille_gib — entier strictement positif
Valeur actuelle : 100
Nouvelle valeur (Entrée = conserver) : 

proxmox.disque_systeme.etendre_volume_racine — true ou false
Valeur actuelle : true
Nouvelle valeur (Entrée = conserver) : 

proxmox.demarrage_auto — true ou false
Valeur actuelle : true
Nouvelle valeur (Entrée = conserver) : 

proxmox.tags — interne, client, prod séparés par virgules ; [] = aucun
Valeur actuelle : [interne]
Nouvelle valeur (Entrée = conserver) : 

systeme.hostname — nom DNS en minuscules
Valeur actuelle : mercure3.ajlsm.com
Nouvelle valeur (Entrée = conserver) : 

reseau.interfaces[0].nom — texte obligatoire ; syntaxe : net[0-9]+
Valeur actuelle : net0
Nouvelle valeur (Entrée = conserver) : 

reseau.interfaces[0].bridge — texte obligatoire ; syntaxe : [A-Za-z0-9_.-]{1,15}
Valeur actuelle : vmbr2
Nouvelle valeur (Entrée = conserver) : 

reseau.interfaces[0].systeme — texte obligatoire ; syntaxe : ens[0-9]+
Valeur actuelle : ens18
Nouvelle valeur (Entrée = conserver) : 

reseau.interfaces[0].ipv4 — IPv4/CIDR, ex. 10.0.0.43/24
Valeur actuelle : 10.0.0.43/24
Nouvelle valeur (Entrée = conserver) : 

reseau.interfaces[1].nom — texte obligatoire ; syntaxe : net[0-9]+
Valeur actuelle : net1
Nouvelle valeur (Entrée = conserver) : 

reseau.interfaces[1].bridge — texte obligatoire ; syntaxe : [A-Za-z0-9_.-]{1,15}
Valeur actuelle : vmbr1
Nouvelle valeur (Entrée = conserver) : 

reseau.interfaces[1].systeme — texte obligatoire ; syntaxe : ens[0-9]+
Valeur actuelle : ens19
Nouvelle valeur (Entrée = conserver) : 

reseau.interfaces[1].ipv4 — IPv4/CIDR, ex. 10.0.0.43/24
Valeur actuelle : 192.168.123.27/24
Nouvelle valeur (Entrée = conserver) : 

reseau.loopback.ipv4 — IPv4/CIDR, ex. 10.0.0.43/24
Valeur actuelle : 51.83.117.113/32
Nouvelle valeur (Entrée = conserver) : 

reseau.passerelle.ipv4 — IPv4 sans préfixe
Valeur actuelle : 10.0.0.4
Nouvelle valeur (Entrée = conserver) : 

reseau.passerelle.interface — texte obligatoire ; syntaxe : ens[0-9]+
Valeur actuelle : ens18
Nouvelle valeur (Entrée = conserver) : 

reseau.dns — IPv4 sans préfixes, séparées par virgules
Valeur actuelle : [10.0.0.4]
Nouvelle valeur (Entrée = conserver) : 

=== PROJET PROPOSÉ ===
projet:
  code: mercure3
  nom: MERCURE3
  environnement: interne
proxmox:
  serveur: Saturne3
  template_vmid: 506
  vmid: null
  nom_vm: MERCURE3
  cpu:
    sockets: 1
    cores: 8
  memoire:
    maximale_mib: 24576
    minimale_mib: 16384
  disque_systeme:
    stockage: local-zfs
    taille_gib: 100
    etendre_volume_racine: true
  demarrage_auto: true
  tags:
  - interne
systeme:
  hostname: mercure3.ajlsm.com
reseau:
  interfaces:
  - nom: net0
    bridge: vmbr2
    systeme: ens18
    ipv4: 10.0.0.43/24
  - nom: net1
    bridge: vmbr1
    systeme: ens19
    ipv4: 192.168.123.27/24
  loopback:
    ipv4: 51.83.117.113/32
  passerelle:
    ipv4: 10.0.0.4
    interface: ens18
  dns:
  - 10.0.0.4

[OK] Valeurs et cohérence YAML validées par le validateur du déploiement.
[NON VÉRIFIÉS] DNS, OPNsense, Ansible, objets Proxmox et disponibilité des IP.
Enregistrer la nouvelle copie dans /root/ajlsm-deploy/recettes/20261016/mercure3-relecture.yaml ? OUI/NON : oui
[ENREGISTRÉ] /root/ajlsm-deploy/recettes/20261016/mercure3-relecture.yaml
Contrôle Proxmox en lecture seule, à lancer sur le nœud cible avant un nouveau déploiement :
/root/ajlsm-deploy/recettes/20261016/ajlsm-deploy-cycle/ajlsm-deploy-check /root/ajlsm-deploy/recettes/20261016/mercure3-relecture.yaml
root@Saturne3:~/ajlsm-deploy/recettes/20261016/ajlsm-deploy-cycle# Read from remote host 141.95.206.118: Connection reset by peer
Connection to 141.95.206.118 closed.
client_loop: send disconnect: Broken pipe
jlarvers@MacBook-Pro ~ % ssh saturne3
Linux Saturne3 7.0.14-23-pve #1 SMP PREEMPT_DYNAMIC PMX 7.0.14-23 (2026-10-07T20:25Z) x86_64

The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
Last login: Fri Oct 16 16:43:10 2026 from 109.190.129.96
root@Saturne3:~# man -w ajlsm-deploy
/usr/local/man/man8/ajlsm-deploy.8
root@Saturne3:~# man -w ajlsm-deploy
/usr/local/man/man8/ajlsm-deploy.8
root@Saturne3:~# scp root@141.95.206.118:/usr/local/man/man8/ajlsm-deploy.8 ~/Downloads/ajlsm-deploy-existant.8
The authenticity of host '141.95.206.118 (141.95.206.118)' can't be established.
ED25519 key fingerprint is SHA256:GaOnRcly/RWj3rX8/2/Y/gdlagmDypNNvo0xRK1kQaE.
This host key is known by the following other names/addresses:
    ~/.ssh/known_hosts:21: [hashed name]
    ~/.ssh/known_hosts:26: [hashed name]
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '141.95.206.118' (ED25519) to the list of known hosts.
scp: open local "/root/Downloads/ajlsm-deploy-existant.8": No such file or directory
root@Saturne3:~# python3 -m zipfile -e \
  /root/ajlsm-deploy/archives/ajlsm-deploy-man.zip \
  /root/ajlsm-deploy/recettes/20261016 &&
cd /root/ajlsm-deploy/recettes/20261016/ajlsm-deploy-man
root@Saturne3:~/ajlsm-deploy/recettes/20261016/ajlsm-deploy-man# SAUVEGARDE_MAN=$(mktemp -d /root/ajlsm-deploy/archives/man-avant-20261016.XXXXXX)

for NOM_MAN in ajlsm-deploy ajlsm-deploy-cycle ajlsm-deploy-yaml ajlsm-deploy-check ajlsm-deploy-resources; do
  for SUFFIXE_MAN in .8 .8.gz; do
    PAGE_MAN="/usr/local/man/man8/$NOM_MAN$SUFFIXE_MAN"
    if [ -e "$PAGE_MAN" ] || [ -L "$PAGE_MAN" ]; then
      cp -a "$PAGE_MAN" "$SAUVEGARDE_MAN/" || break 2
    fi
  done
done

printf 'Sauvegarde : %s\n' "$SAUVEGARDE_MAN"
Sauvegarde : /root/ajlsm-deploy/archives/man-avant-20261016.WiJHQn
root@Saturne3:~/ajlsm-deploy/recettes/20261016/ajlsm-deploy-man# install -d -m 755 /usr/local/man/man8

for NOM_MAN in ajlsm-deploy ajlsm-deploy-cycle ajlsm-deploy-yaml ajlsm-deploy-check ajlsm-deploy-resources; do
  install -m 644 "man8/$NOM_MAN.8" "/usr/local/man/man8/$NOM_MAN.8" || break
done

if command -v mandb >/dev/null 2>&1; then
  mandb
fi
Purging old database entries in /usr/share/man...
Processing manual pages under /usr/share/man...
Checking for stray cats under /usr/share/man...
Checking for stray cats under /var/cache/man...
Purging old database entries in /usr/share/man/pl...
Processing manual pages under /usr/share/man/pl...
Checking for stray cats under /usr/share/man/pl...
Checking for stray cats under /var/cache/man/pl...
Purging old database entries in /usr/share/man/ru...
Processing manual pages under /usr/share/man/ru...
Checking for stray cats under /usr/share/man/ru...
Checking for stray cats under /var/cache/man/ru...
Purging old database entries in /usr/share/man/id...
Processing manual pages under /usr/share/man/id...
Checking for stray cats under /usr/share/man/id...
Checking for stray cats under /var/cache/man/id...
Purging old database entries in /usr/share/man/es...
Processing manual pages under /usr/share/man/es...
Checking for stray cats under /usr/share/man/es...
Checking for stray cats under /var/cache/man/es...
Purging old database entries in /usr/share/man/zh_TW...
Processing manual pages under /usr/share/man/zh_TW...
Checking for stray cats under /usr/share/man/zh_TW...
Checking for stray cats under /var/cache/man/zh_TW...
Purging old database entries in /usr/share/man/sl...
Processing manual pages under /usr/share/man/sl...
Checking for stray cats under /usr/share/man/sl...
Checking for stray cats under /var/cache/man/sl...
Purging old database entries in /usr/share/man/pt...
Processing manual pages under /usr/share/man/pt...
Checking for stray cats under /usr/share/man/pt...
Checking for stray cats under /var/cache/man/pt...
Purging old database entries in /usr/share/man/hr...
Processing manual pages under /usr/share/man/hr...
Checking for stray cats under /usr/share/man/hr...
Checking for stray cats under /var/cache/man/hr...
Purging old database entries in /usr/share/man/pt_BR...
Processing manual pages under /usr/share/man/pt_BR...
Checking for stray cats under /usr/share/man/pt_BR...
Checking for stray cats under /var/cache/man/pt_BR...
Purging old database entries in /usr/share/man/hu...
Processing manual pages under /usr/share/man/hu...
Checking for stray cats under /usr/share/man/hu...
Checking for stray cats under /var/cache/man/hu...
Purging old database entries in /usr/share/man/da...
Processing manual pages under /usr/share/man/da...
Checking for stray cats under /usr/share/man/da...
Checking for stray cats under /var/cache/man/da...
Purging old database entries in /usr/share/man/cs...
Processing manual pages under /usr/share/man/cs...
Checking for stray cats under /usr/share/man/cs...
Checking for stray cats under /var/cache/man/cs...
Purging old database entries in /usr/share/man/tr...
Processing manual pages under /usr/share/man/tr...
Checking for stray cats under /usr/share/man/tr...
Checking for stray cats under /var/cache/man/tr...
Purging old database entries in /usr/share/man/fr...
Processing manual pages under /usr/share/man/fr...
Checking for stray cats under /usr/share/man/fr...
Checking for stray cats under /var/cache/man/fr...
Purging old database entries in /usr/share/man/nl...
Processing manual pages under /usr/share/man/nl...
Checking for stray cats under /usr/share/man/nl...
Checking for stray cats under /var/cache/man/nl...
Purging old database entries in /usr/share/man/ko...
Processing manual pages under /usr/share/man/ko...
Checking for stray cats under /usr/share/man/ko...
Checking for stray cats under /var/cache/man/ko...
Purging old database entries in /usr/share/man/zh_CN...
Processing manual pages under /usr/share/man/zh_CN...
Checking for stray cats under /usr/share/man/zh_CN...
Checking for stray cats under /var/cache/man/zh_CN...
Purging old database entries in /usr/share/man/sv...
Processing manual pages under /usr/share/man/sv...
Checking for stray cats under /usr/share/man/sv...
Checking for stray cats under /var/cache/man/sv...
Purging old database entries in /usr/share/man/ro...
Processing manual pages under /usr/share/man/ro...
Checking for stray cats under /usr/share/man/ro...
Checking for stray cats under /var/cache/man/ro...
Purging old database entries in /usr/share/man/uk...
Processing manual pages under /usr/share/man/uk...
Checking for stray cats under /usr/share/man/uk...
Checking for stray cats under /var/cache/man/uk...
Purging old database entries in /usr/share/man/sr...
Processing manual pages under /usr/share/man/sr...
Checking for stray cats under /usr/share/man/sr...
Checking for stray cats under /var/cache/man/sr...
Purging old database entries in /usr/share/man/ja...
Processing manual pages under /usr/share/man/ja...
Checking for stray cats under /usr/share/man/ja...
Checking for stray cats under /var/cache/man/ja...
Purging old database entries in /usr/share/man/de...
Processing manual pages under /usr/share/man/de...
Checking for stray cats under /usr/share/man/de...
Checking for stray cats under /var/cache/man/de...
Purging old database entries in /usr/share/man/fi...
Processing manual pages under /usr/share/man/fi...
Checking for stray cats under /usr/share/man/fi...
Checking for stray cats under /var/cache/man/fi...
Purging old database entries in /usr/share/man/it...
Processing manual pages under /usr/share/man/it...
Checking for stray cats under /usr/share/man/it...
Checking for stray cats under /var/cache/man/it...
Purging old database entries in /usr/local/man...
Processing manual pages under /usr/local/man...
Updating index cache for path `/usr/local/man/man8'. Wait...done.
Checking for stray cats under /usr/local/man...
Checking for stray cats under /var/cache/man/oldlocal...
1 man subdirectory contained newer manual pages.
5 manual pages were added.
0 stray cats were added.
0 old database entries were purged.
root@Saturne3:~/ajlsm-deploy/recettes/20261016/ajlsm-deploy-man# man -w ajlsm-deploy
man 8 ajlsm-deploy
man 8 ajlsm-deploy-cycle
man 8 ajlsm-deploy-yaml
/usr/local/man/man8/ajlsm-deploy.8

AJLSM-DEPLOY(8)                                     Administration système                                     AJLSM-DEPLOY(8)

NOM
       ajlsm-deploy - déployer une VM Proxmox par phases contrôlées

SYNOPSIS
       ajlsm-deploy projet.yaml PHASE [--agent-timeout secondes]
       ajlsm-deploy-check projet.yaml [--phase proxmox] [--yaml-only]
       ajlsm-deploy-resources projet.yaml (--dry-run | --apply)

DESCRIPTION
       Programme  à  exécuter  sur  le  nœud Proxmox cible, avec les droits administrateur. Chaque invocation traite une seule
       phase.  Le YAML est validé avant les commandes externes.

       Après succès, les suggestions affichent les commandes de simulation et d'exécution de la prochaine étape, ou de l'étape
       simulée.  Les étapes sans simulation dédiée le signalent explicitement.  Ces suggestions ne sont jamais  exécutées  au‐
       tomatiquement.  Elles décrivent l'ordre théorique, sans mémoriser l'état du cycle.

       Pour  enchaîner les onze étapes sans en oublier, utiliser ajlsm-deploy-cycle(8).  Ce lanceur conserve les confirmations
       et les saisies interactives.

ORDRE DES PHASES
       1. --clone
              Créer le clone complet, désactiver onboot, isoler les interfaces, vérifier l'arrêt et les  adresses  MAC.  Aucun
              démarrage.  Simulation : --dry-run, qui comprend les précontrôles.

       2. --configure-resources
              Configurer  et vérifier CPU, mémoire, balloon et disque scsi0.  Exige une VM arrêtée, onboot désactivé et inter‐
              faces isolées.  La réduction du disque est interdite.  Simulation : --resources-dry-run.

       3. --first-boot-apply
              Démarrer le clone isolé, attendre l'agent QEMU et ajlsm-clone-init, puis vérifier les identités  attendues.   Si
              la VM tourne déjà, reprendre les contrôles sans redémarrage.  Simulation : --first-boot-dry-run.

       4. --root-grow-apply
              Après  le  premier démarrage et avant la personnalisation système, étendre la partition, le PV LVM, le LV racine
              et ext4.  Cette étape dépend de etendre_volume_racine dans le YAML.  Simulation : --root-grow-dry-run.

       5. --system-apply
              Personnaliser hostname, hosts et machine-id, redémarrer isolé et vérifier l'identité active. Respecter le  jour‐
              nal de transaction.  Simulation : --system-dry-run.

       6. --network-apply
              Sauvegarder  et  écrire Netplan dans l'invité, puis exécuter netplan generate. Les liens Proxmox restent isolés.
              Simulation : --network-dry-run.

       7. --network-enable
              Contrôler identité, configuration et conflits ARP, activer les liens, vérifier adresses, loopback, route, DNS et
              passerelle, puis appliquer demarrage_auto.  Un mécanisme de repli tente de rétablir l'isolation en cas  d'échec.
              Simulation : --network-enable-dry-run.

       8. --ssh-audit
              Comparer  la  clé  ED25519 lue via QEMU à celle exposée sur le réseau, actualiser known_hosts après concordance,
              puis vérifier les accès, clés autorisées, sudo et état du compte ajlsm.  Aucune simulation dédiée.

       9. --ssh-secure
              Après audit et confirmation, désactiver l'authentification SSH par mot de passe, conserver root par  clé,  véri‐
              fier  la  configuration,  recharger  SSH  et  contrôler les connexions root et ajlsm par clé.  Aucune simulation
              dédiée.

       10. --password-ajlsm
              Ouvrir passwd pour ajlsm dans la VM avec double saisie native masquée.  Un terminal interactif est  obligatoire.
              Le mot de passe n'est pas placé dans le YAML ni la ligne de commande.  Aucune simulation dédiée.

       11. --tls-apply
              Vérifier  le  certificat TLS interne. Si CN et SAN correspondent déjà au hostname, ne pas réinitialiser.  Sinon,
              après confirmation, appeler ajlsm-init-tls.sh dans la VM, puis vérifier certificat, syntaxe  Apache  et  service
              actif.  Aucune simulation dédiée.

OPTIONS COMMUNES
       --agent-timeout secondes
              Entier  strictement  positif,  défaut 300.  Délai transmis aux attentes utilisant l'agent QEMU.  Il ne constitue
 Manual page ajlsm-deploy(8) line 1/219 32% (press h for help or q to quit)

12. État des validations et limites

Date / source Vérification Portée
15/10/2026, page historique Déploiements initiaux jusqu’à l’activation réseau Résultats historiques conservés ; ne décrivent pas à eux seuls le cycle actuel
15/10/2026, page historique Comparaison ED25519, clés divergentes ou malformées, préservation de known_hosts Tests isolés rapportés dans la documentation reçue, non rejoués lors de cette consolidation
16/10/2026, tests locaux du lot cycle Ordre des 11 étapes, arrêt sur refus/erreur, reprise et suggestions 8 tests réussis, incluant des sous-cas ; sous-processus des phases simulés
16/10/2026, sorties Saturne3 transmises Cycle technique complet sur un nouveau clone MERCURE3 Terminé sans erreur signalée, extension racine incluse
16/10/2026, sorties invitées transmises SSH ajlsm, sudo, hostname et racine ext4 Confirmés ; mercure3.ajlsm.com et 97 Gio pour /
16/10/2026, tests locaux assistant Création, correction, copie, validation et annulation 14 tests réussis, saisies simulées
16/10/2026, sortie Saturne3 transmise Assistant --check sur mercure3.yaml Valeurs YAML valides ; aucune écriture ni validation externe
16/10/2026, vérification locale des modèles Modèle vierge complété par l’assistant Paramètres identiques à la référence MERCURE3 ; original intact
À réaliser Essai réel du mécanisme de repli après échec d’activation réseau Non confirmé ; le succès du parcours nominal ne valide pas ce scénario
À réaliser Vérifications automatiques DNS, OPNsense, Ansible et recette applicative Hors périmètre actuel

Le message de fin du cycle signifie que ses phases ont retourné un succès. Il ne vaut pas validation des applications ni détection de toutes les défaillances possibles. Conserver les vérifications finales et les limites propres aux phases.

13. Réconciliation avec la page du 15 octobre

L’original reçu est conservé intégralement dans historique/guide-20261015.mediawiki. Il sert de trace, pas de seconde procédure opérationnelle concurrente.

Le présent document remplace les indications opérationnelles anciennes :

  • confirmations CLONER/APPLIQUER/DEMARRER remplacées par OUI/NON ;
  • parcours manuel seul remplacé par le choix entre mode manuel et cycle interactif ;
  • liste des étapes incluant l’extension racine, SSH, mot de passe et TLS ;
  • extension racine et cycle complet désormais validés sur la recette du 16 octobre ;
  • suggestions manuelles affichant les deux commandes disponibles, sans oublier l’extension racine ;
  • création et relecture du YAML par l’assistant, sans écraser l’original ;
  • ajout du modèle vierge et de la référence MERCURE3 renseignée ;
  • séparation explicite des scripts installés, du lot de recette, du manuel historique et de la future installation.

Les détails encore utiles de l’ancienne page sur l’isolation, les transactions, ED25519, les sauvegardes, le README applicatif et les limites de validation sont repris ci-dessus. Une nouvelle mise à jour fonctionnelle doit modifier cette procédure directement plutôt que superposer une nouvelle section corrective à une ancienne procédure contradictoire.

14. Suites prévues

Prévoir les paramètres NFS, sites Apache2, Pleade, Drupal et Matomo dans le même YAML lorsque leurs exigences seront définies. Modifier ensemble le schéma, l’assistant, les modèles, les précontrôles, les phases et leur documentation. Documenter les références aux secrets plutôt que leurs valeurs.

L’intégration des contrôles DNS, OPNsense et Ansible précédera une déclaration automatisée de disponibilité du projet. Le modèle actuel ne contient pas encore ces nouvelles sections.