<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="fr">
<?xml-stylesheet type="text/css" href="https://inetdoc.net/styles/feed.css"?>
<title type="html">!netdoc.net</title>
<subtitle type="html"></subtitle>
<link rel="alternate" type="text/html"
href="https://inetdoc.net" />
<link rel="self" type="application/atom+xml"
href="https://inetdoc.net/atom.xml" />
<updated>2026-04-17T17:16:35+02:00</updated>
<author>
<name>Philippe Latu</name>
<uri>https://inetdoc.net</uri>
</author>
<id>https://inetdoc.net/</id>
<generator uri="http://nanoblogger.sourceforge.net"
version="3.5-RC1">NanoBlogger</generator>
<entry>
<title type="html">Automatisation d'infrastructure avec Ansible et
GitLab CI - Édition 2026</title>
<author>
<name>Philippe Latu</name>
</author>
<link rel="alternate" type="text/html"
href="https://inetdoc.net/archives/2026/03/28/automatisation_dinfrastructure_avec_ansible_et_gitlab_ci_-__dition_2026/index.html" />
<id>
https://inetdoc.net/archives/2026/03/28/automatisation_dinfrastructure_avec_ansible_et_gitlab_ci_-__dition_2026/index.html</id>
<published>2026-03-28T17:39:33+02:00</published>
<updated>2026-03-28T17:39:33+02:00</updated>
<category term="m2" />
<category term="formations" />
<category term="iac" />
<category term="travaux_pratiques" />
<category term="système" />
<category term="virtualisation" />
<content type="xhtml">
<div xmlns="http://www.w3.org/1999/xhtml">
<p>L'année 2026 marque une étape clé dans l'évolution de la série
de travaux pratiques consacrée à 
<strong>l'infrastructure en tant que code (IaC)</strong>. Alors que
l'édition 2025 posait les bases de l'automatisation avec des
pipelines d'intégration continue, cette nouvelle version se
concentre sur l'efficacité opérationnelle, la reproductibilité et
l'optimisation des traitements.</p>
<p>Que vous soyez habitué aux systèmes Debian GNU/Linux ou
administrateur réseau Cisco IOS XE, ces trois nouveaux supports de
TP vous plongent au cœur des pratiques DevOps modernes.</p>
<a href="https://inetdoc.net/images/IaC-GitLab+Ansible.png">
<img alt="Workflow IaC labs" src="/images/IaC-GitLab+Ansible.png"
width="80%" class="center-img" />
</a>
<h3>1. Une reproductibilité garantie avec Astral uv</h3>
<p>L'une des innovations majeures de cette année est l'adoption du
gestionnaire de paquets Astral 
<strong>
<tt>uv</tt>
</strong>.</p>
<ul>
<li>
<p>
<strong>Rapidité et fiabilité&#160;:</strong>
<br />Finis les problèmes de versions divergentes entre les
environnements de développement et de test. Grâce au fichier 
<tt>pyproject.toml</tt>, l'ensemble de la chaîne d'outils Ansible
est verrouillé de manière déterministe.</p>
</li>
<li>
<p>
<strong>Intégration CI/CD allégée&#160;:</strong>
<br />Les pipelines GitLab CI sont simplifiés. Au lieu d'alourdir
l'infrastructure avec des images Docker pour exécuter Ansible, nous
utilisons une chaîne allégée directement pilotée par 
<strong>
<tt>uv</tt>
</strong>. Cette approche garantit des traitements idempotents tout
en réduisant considérablement le temps de démarrage des tâches (
<i>jobs</i>).</p>
</li>
</ul>
<h3>2. Des playbooks optimisés et «&#160;data-driven&#160;»</h3>
<p>Le code des playbooks a été entièrement revu. L'objectif&#160;?
Une séparation stricte entre les données déclaratives et les
procédures d'exécution.</p>
<ul>
<li>
<p>
<strong>Modularité :</strong>
<br />Les configurations sont désormais plus lisibles et faciles à
maintenir.</p>
<pre>
<code>---
vrouter:
  vm_name: r2
  os: iosxe
  master_image: "{{ image_name }}"
  force_copy: false
  tapnumlist: [6, 7, 8]

router_host_id: "{{ vrouter.tapnumlist[0] | int }}"

interfaces:
  - interface_type: GigabitEthernet
    interface_id: 2
    description: --&gt; VLAN 230
    enabled: true
    vlan_id: 230
  - interface_type: GigabitEthernet
    interface_id: 3
    description: --&gt; VLAN 800
    enabled: true
    vlan_id: 800

default_routes: "{{ inband_vlans[0].default_routes }}"
</code>
</pre>
</li>
<li>
<p>
<strong>Calcul d'adressage intelligent :</strong>
<br />L'utilisation de modules avancés, comme 
<strong>nthost</strong>, permet de calculer automatiquement les
plans d'adressage IPv4 et IPv6, optimisant ainsi grandement les
traitements. Cette approche permet de réduire les erreurs humaines
et de déployer rapidement des topologies complexes (VM Linux ou
routeurs IOS XE), en modifiant simplement une variable de
groupe.</p>
<pre>
<code>---
inband_vlans:
  - vlan: 230
    subnet4: 10.0.228.0/22
    subnet6: 2001:678:3fc:e6::/64
    default_routes:
      ipv4_next_hop: 10.0.228.1
      ipv6_next_hop: 2001:678:3fc:e6::1
  - vlan: 800
    subnet6: 2001:db8:320::/64
</code>
</pre>
</li>
</ul>
<h3>3. Gestion des secrets : trouver l'équilibre entre sécurité et
simplicité</h3>
<p>Cette édition maintient volontairement une «&#160;entorse&#160;»
aux bonnes pratiques académiques concernant la gestion des secrets
pour cette édition.</p>
<ul>
<li>
<p>
<strong>Simplification pédagogique :</strong>
<br />Plutôt que d'introduire un coffre-fort numérique tiers (type
HashiCorp Vault), nous conservons l'usage d'Ansible Vault.</p>
</li>
<li>
<p>
<strong>Le coût du partage :</strong>
<br />Ce choix engendre toutefois un coût opérationnel, car les
secrets doivent être partagés entre le compte du développeur et
celui du GitLab Runner. En revanche, il permet de se concentrer sur
l'essentiel, c'est-à-dire la logique de déploiement de
l'infrastructure, sans multiplier les dépendances logicielles.</p>
</li>
</ul>
<h3>4. Pourquoi étudier ces supports&#160;?</h3>
<p>Que vous souhaitiez construire des machines Debian à partir
d'images cloud ou orchestrer des routeurs virtuels via des
pipelines CI/CD complets, cette série 2026 vous permettra
d'apprendre à passer d'une administration manuelle à une gestion
d'infrastructure entièrement automatisée.</p>
<p>Prêt à automatiser ? Découvrez les trois volets de la série
:</p>
<ul>
<li>
<a href="https://md.inetdoc.net/s/f-mfjs-kQ">Lab 1 – Construction
de VMs Debian avec Ansible</a>&#160;—&#160; 
<a href="https://gitlab.inetdoc.net/iac/lab01">GitLab
repository</a></li>
<li>
<a href="https://md.inetdoc.net/s/CPltj12uT">Lab 2 – Automatisation
GitLab CI pour les VMs Linux</a>&#160;—&#160; 
<a href="https://gitlab.inetdoc.net/iac/lab02">GitLab
repository</a></li>
<li>
<a href="https://md.inetdoc.net/s/ltLcEoVDG">Lab 3 – Déploiement de
routeurs IOS XE via GitLab CI</a>&#160;—&#160; 
<a href="https://gitlab.inetdoc.net/iac/lab03">GitLab
repository</a></li>
</ul>
</div>
</content>
</entry>
<entry>
<title type="html">Renforcez la protection de votre serveur avec le
fork Python de nft-blacklist</title>
<author>
<name>Philippe Latu</name>
</author>
<link rel="alternate" type="text/html"
href="https://inetdoc.net/archives/2026/03/08/renforcez_la_protection_de_votre_serveur_avec_le_fork_python_de_nft-blacklist/index.html" />
<id>
https://inetdoc.net/archives/2026/03/08/renforcez_la_protection_de_votre_serveur_avec_le_fork_python_de_nft-blacklist/index.html</id>
<published>2026-03-08T17:03:53+02:00</published>
<updated>2026-03-08T17:03:53+02:00</updated>
<category term="filtrage" />
<category term="système" />
<content type="xhtml">
<div xmlns="http://www.w3.org/1999/xhtml">
<p>Après avoir enfin réussi à migrer d’
<code>iptables</code>vers 
<code>nftables</code>sur les machines que j’exploite, j’ai utilisé
pendant plusieurs mois le script shell 
<strong>nft-blacklist</strong>tel qu’il est proposé à l’adresse 
<a href="https://github.com/leshniak/nft-blacklist">
https://github.com/leshniak/nft-blacklist</a>.</p>
<p>Récemment, ce script a commencé à produire des erreurs sur l’une
de mes passerelles sous Debian testing. Plutôt que de corriger les
expressions rationnelles et de multiplier les outils tiers, j’ai
choisi de m’appuyer sur le module standard 
<code>ipaddress</code>de Python pour manipuler proprement adresses
et réseaux IPv4/IPv6.</p>
<p>Après quelques heures de travail assisté par l’IA, j’ai le
plaisir de vous présenter un fork en Python, entièrement réécrit et
optimisé, de l’outil 
<code>nft-blacklist</code>. Ce code a pour objectif de gérer
rapidement et de manière robuste des listes noires de grande taille
d’adresses IP pour un pare-feu basé sur 
<code>nftables</code>.</p>
<h3>Pourquoi un fork&#160;? Genèse de la réécriture</h3>
<p>Avec la multiplication des tentatives d’attaques automatisées,
des outils comme 
<code>fail2ban</code>utilisés seuls ne suffisent plus. Il devient
nécessaire de mieux contrôler les performances et l’utilisation des
ressources sur les serveurs exposés à Internet (VPS, passerelles,
serveurs d’applications, etc.).</p>
<p>C’est dans ce contexte que j’ai réécrit l’intégralité du script
en Python&#160;3, en m’appuyant sur un fichier de configuration au
format TOML. L’objectif est triple&#160;: améliorer les
performances, renforcer la robustesse et rendre le code plus simple
à maintenir.</p>
<p>Voici le workflow synthétique du nouveau script&#160;:</p>
<a href="https://inetdoc.net/images/nft-blacklist.png">
<img alt="Workflow nft-blacklist" src="/images/nft-blacklist.png"
width="70%" class="center-img" />
</a>
<h3>Principales optimisations du fork Python</h3>
<p>Le fork, disponible à l’adresse 
<a href="https://github.com/platu/nft-blacklist">
https://github.com/platu/nft-blacklist</a>, se distingue par
plusieurs optimisations clés par rapport au script shell
initial.</p>
<h4>1. Parallélisation des téléchargements</h4>
<p>
<strong>Script shell initial&#160;:</strong>les listes de sources
sont téléchargées séquentiellement, l’une après l’autre. Si une
seule source est lente, tout le processus est ralenti.</p>
<p>
<strong>Fork Python&#160;:</strong>grâce au module 
<code>concurrent.futures</code>, le script télécharge toutes les
listes noires en parallèle. L’utilisation d’une unique 
<code>requests.Session()</code>permet en outre de réutiliser les
connexions TCP/TLS (
<em>connection pooling</em>), ce qui réduit fortement le temps
passé en I/O réseau, surtout avec de longues listes. On peut ainsi
obtenir un gain de performance de l’ordre de 10x à 50x sur cette
phase.</p>
<h4>2. Validation robuste des adresses</h4>
<p>
<strong>Script shell initial&#160;:</strong>l’analyse repose sur
des expressions régulières et des outils comme 
<code>awk</code>ou 
<code>grep</code>, sensibles aux variations de format des fichiers.
La validation des adresses IP reste assez basique.</p>
<p>
<strong>Fork Python&#160;:</strong>le module standard 
<code>ipaddress</code>assure une analyse et une validation
strictes. Chaque ligne est interprétée comme adresse ou réseau
IPv4/IPv6, et seules les entrées valides sont conservées. Les
lignes vides et les commentaires sont filtrés proprement, ce qui
évite les mauvaises surprises.</p>
<h4>3. Consolidation et déduplication des listes</h4>
<p>
<strong>Script shell initial&#160;:</strong>les doublons sont
généralement éliminés via un simple 
<code>sort | uniq</code>. Il n’y a pas de consolidation native des
réseaux (par exemple fusionner 
<code>1.2.3.0/24</code>et 
<code>1.2.3.4/32</code>qui se chevauchent).</p>
<p>
<strong>Fork Python&#160;:</strong>le script déduplique
instantanément toutes les adresses à l’aide d’un 
<code>set()</code>Python performant. Surtout, il utilise 
<code>ipaddress.collapse_addresses()</code>pour fusionner et
consolider les réseaux redondants. Le résultat est un jeu de règles

<code>nftables</code>beaucoup plus compact, qui consomme moins de
mémoire et réduit le nombre de comparaisons effectuées par le
pare-feu.</p>
<h4>4. Application atomique et rapidité</h4>
<p>
<strong>Script shell initial&#160;:</strong>beaucoup de scripts
shell appliquent les règles élément par élément, ou génèrent de
multiples fichiers temporaires. En cas d’erreur de type 
<code>File exists</code>, ils basculent dans un mode de secours (
<em>fallback</em>) souvent très lent.</p>
<p>
<strong>Fork Python&#160;:</strong>le script génère en mémoire (via

<code>stdin</code>) un fichier de configuration complet et
optimisé, puis l’applique en une seule transaction atomique avec la
commande 
<code>nft -f</code>. En cas de succès, la mise à jour du pare-feu
est instantanée et cohérente. En cas d’erreur, l’état précédent est
préservé. Le mode de secours a été réécrit pour ne traiter que les
blocs défaillants, faisant passer cette phase de plusieurs minutes
à quelques secondes.</p>
<h4>5. Code propre, typage et journalisation</h4>
<p>
<strong>Script shell initial&#160;:</strong>un script shell qui
grossit peut rapidement devenir difficile à lire et à faire
évoluer, avec des lignes mêlant 
<code>sed</code>, 
<code>awk</code>et substitutions diverses.</p>
<p>
<strong>Fork Python&#160;:</strong>le code est écrit en Python typé
(type hints) afin de faciliter la relecture et la détection
d’erreurs. Il s’appuie sur le module standard 
<code>logging</code>pour s’intégrer proprement avec le journal
système et offrir un diagnostic clair en cas de problème.</p>
<h3>Prérequis et intégration</h3>
<p>Le script cible principalement les environnements GNU/Linux
disposant de 
<code>nftables</code>(par exemple Debian/Ubuntu récentes) et d’un
Python&#160;3 à jour. Un exemple de fichier de configuration TOML
est fourni dans le dépôt Git, afin de faciliter l’intégration avec
votre propre jeu de règles.</p>
<h3>Conclusion</h3>
<p>Ce fork Python de 
<code>nft-blacklist</code>constitue une évolution importante du
projet initial. Il est plus rapide, plus robuste et génère des
règles 
<code>nftables</code>nettement plus optimisées, ce qui contribue à
préserver les ressources de votre serveur tout en améliorant votre
surface de défense.</p>
<p>N’hésitez pas à tester ce nouvel outil et à me faire part de vos
retours sur le dépôt GitHub&#160;: 
<a href="https://github.com/platu/nft-blacklist">
https://github.com/platu/nft-blacklist</a>.</p>
</div>
</content>
</entry>
<entry>
<title type="html">Enseignements Ops à l'ère du déclaratif : entre
progrès et dérives</title>
<author>
<name>Philippe Latu</name>
</author>
<link rel="alternate" type="text/html"
href="https://inetdoc.net/archives/2026/01/12/enseignements_ops___l_re_du_d_claratif__entre_progr_s_et_d_rives/index.html" />
<id>
https://inetdoc.net/archives/2026/01/12/enseignements_ops___l_re_du_d_claratif__entre_progr_s_et_d_rives/index.html</id>
<published>2026-01-12T17:42:40+02:00</published>
<updated>2026-01-12T17:42:40+02:00</updated>
<category term="incus" />
<category term="formations" />
<category term="travaux_pratiques" />
<category term="système" />
<content type="xhtml">
<div xmlns="http://www.w3.org/1999/xhtml">
<p>En bref&#160;:</p>
<ul class="half">
<li>L'adoption de pratiques déclaratives (YAML, Cloud-init, Incus)
améliore considérablement la reproductibilité des travaux
pratiques, mais crée un fossé entre les étudiants qui structurent
leur démarche et ceux qui se contentent de copier-coller des
configurations.</li>
<li>L'utilisation non contextualisée de l'IA, comme ChatGPT,
conduit certains étudiants à exécuter des commandes incohérentes et
déconnectées des énoncés.</li>
<li>Dans une logique inspirée de DevOps, les évaluations doivent
exiger le contexte complet d'exécution (environnements,
déclarations, artefacts de preuve) ainsi que des méthodes de
sélection et de validation des sources.</li>
</ul>
<hr />
<p>Après avoir migré la gestion des machines virtuelles vers le
mode déclaratif basé sur des fichiers YAML (voir le code du script 
<a href="https://gitlab.inetdoc.net/labs/startup-scripts/-/blob/main/lab-startup.py?ref_type=heads">
lab-startup.py</a>), j'ai ajouté l'utilisation de 
<a href="https://cloud-init.io/">Cloud-init</a>en septembre
dernier.</p>
<p>La dernière révision du support de travaux pratiques intitulé 
<strong>«&#160;
<a href="https://md.inetdoc.net/s/zL2STyrLf6">Start unprivileged
Incus containers on top of Open vSwitch in a few
steps</a>&#160;»</strong>illustre bien cette évolution. Les
premières parties proposent de réaliser les opérations de mise en
place de la topologie ci-dessous une à une, tandis que la dernière
partie les réalise en mode déclaratif.</p>
<a href="https://md.inetdoc.net/s/zL2STyrLf6">
<img alt="Incus containers on top of Open vSwitch topology"
src="https://md.inetdoc.net/uploads/254e3034-fc2e-46ad-bc66-734454b27d5e.png"
width="50%" class="center-img" />
</a>
<p>Les travaux pratiques ont beaucoup gagné en reproductibilité.
Cette évolution met toutefois en lumière un écart croissant entre
les étudiants qui structurent mieux le développement des
déclarations et ceux qui se contentent de copier-coller des
configurations sans comprendre les opérations d'administration
système attendues.</p>
<h4>Le paradoxe de l'abstraction déclarative</h4>
<p>Cette approche marque une rupture avec les pratiques impératives
classiques. Auparavant, chaque commande était exécutée en observant
son effet ; aujourd'hui, les fichiers YAML décrivent un état
attendu sans détailler les étapes. Cette abstraction constitue un
véritable progrès pour l'industrialisation et la
reproductibilité.</p>
<p>Sur le plan pédagogique, elle crée toutefois un piège. Les
étudiants les plus investis l'utilisent pour mieux structurer le
séquencement des opérations. D'autres, en revanche, utilisent les
salons Discord comme des «&#160;marketplaces YAML&#160;» et
récupèrent des configurations toutes faites, au détriment de
l'objectif central, à savoir analyser un problème, choisir les
actions nécessaires et construire une solution cohérente.</p>
<h4>L'IA conversationnelle&#160;: un faux ami
pédagogique&#160;!</h4>
<p>L'utilisation d'agents conversationnels tels que ChatGPT
amplifie cette dérive. L'analyse des logs des hyperviseurs révèle
des tentatives d'exécution de commandes incohérentes, totalement
déconnectées des énoncés des travaux pratiques. Le problème n'est
pas que les étudiants commettent des erreurs — l'erreur fait
pleinement partie du processus d'apprentissage —, mais qu'ils
exécutent des instructions sans rapport avec le contexte
pédagogique, ce qui témoigne d'une absence totale d'attention et de
réflexion.</p>
<p>Au lieu de l'utiliser comme assistant pour approfondir leur
compréhension, quelques étudiants sollicitent l'IA sans la moindre
contextualisation. Ils obtiennent ainsi des réponses génériques
(j'aurais envie d'écrire «&#160;hallucinées&#160;») qui ne
correspondent ni à l'environnement de formation ni aux objectifs
pédagogiques. L'IA devient alors un obstacle à l'apprentissage.</p>
<h4>Le contexte de la formation initiale ne facilite pas les
choses</h4>
<p>Les ressources documentaires sont largement accessibles en
ligne, et les solutions aux exercices pratiques sont disponibles
publiquement. Cette accessibilité, combinée à la facilité
d'interroger des agents conversationnels, supprime toute incitation
à fournir un effort de contextualisation et de sélection précise
des sources.</p>
<p>Il est donc nécessaire d'insister davantage sur deux
points&#160;: la sélection des documents et la validation de
l'applicabilité des réponses, notamment via des méthodologies
telles que la génération augmentée par recherche (RAG), qui ancrent
l'IA dans un corpus précis. C'est un axe de progression identifié
pour les prochains modules.</p>
<p>Je sais depuis longtemps que l'enseignement des opérations doit
privilégier des évaluations en conditions réelles, avec un temps
limité. En revanche, je suis beaucoup plus sceptique quant au
recours systématique au dépannage de systèmes volontairement
altérés. En effet, la restitution basée sur la justification des
choix techniques et la résolution de problèmes peut être réalisée
en totalité par une IA.</p>
<h4>Affaire à suivre...</h4>
<p>Dans le prolongement du paradigme DevOps, le code produit par
les étudiants dans le cadre d'un projet de développement doit
désormais être livré avec son contexte d'exécution complet
(environnements virtuels Python, dépendances et paramètres). La
restitution des opérations d'administration système doit quant à
elle inclure les éléments de preuve (artéfacts) permettant de
générer des tests unitaires, ainsi que les sources déclaratives
ayant conduit aux résultats observés. Jusqu'à présent, je demande
aux étudiants de fournir un compte rendu des résultats importants
au format Markdown sur un canal Mattermost. Il faut faire évoluer
cette pratique. Affaire à suivre donc.</p>
</div>
</content>
</entry>
<entry>
<title type="html">Introduction au système de fichiers réseau
NFSv4 - édition 2025</title>
<author>
<name>Philippe Latu</name>
</author>
<link rel="alternate" type="text/html"
href="https://inetdoc.net/archives/2025/10/06/introduction_au_syst_me_de_fichiers_r_seau_nfsv4_-__dition_2025/index.html" />
<id>
https://inetdoc.net/archives/2025/10/06/introduction_au_syst_me_de_fichiers_r_seau_nfsv4_-__dition_2025/index.html</id>
<published>2025-10-06T09:13:51+02:00</published>
<updated>2025-10-06T09:13:51+02:00</updated>
<category term="formations" />
<category term="m1" />
<category term="système" />
<content type="xhtml">
<div xmlns="http://www.w3.org/1999/xhtml">
<h4>NFS fête ses 40 ans</h4>
<p>Le protocole NFS (Network File System) vient de célébrer son 40e
anniversaire&#160;! Depuis 1984, il a profondément transformé
l'accès aux fichiers en réseau. Il est devenu incontournable pour
tous les administrateurs de systèmes Unix et Linux. À cette
occasion, le support de travaux pratiques 
<strong>
<a href='https://inetdoc.net/travaux_pratiques/sysadm-net.nfs/'>
«&#160;Introduction au système de fichiers réseau NFSv4&#160;»</a>
</strong>a été entièrement révisé et enrichi pour répondre aux
enjeux de la sécurité et de l'administration moderne.</p>
<img alt="NFS hardening"
src="https://inetdoc.net/travaux_pratiques/sysadm-net.set/images/nfs-hardening.png"
width="50%" />
<h4>Un support pédagogique complet, pensé pour la pratique</h4>
<p>Ce document propose une exploration progressive du protocole
NFSv4, des bases des appels RPC aux montages dynamiques sous Linux.
Le plan guide pas à pas à travers les étapes suivantes&#160;:</p>
<ul>
<li>l'identification et la configuration des services réseau
historiques, tels que rpcbind et portmapper&#160;;</li>
<li>la mise en place d'une maquette minimaliste de type NAS avec
exportation d'arborescences et création de comptes utilisateurs
locaux&#160;;</li>
<li>le paramétrage des montages manuels et automatisés via
autofs&#160;;</li>
<li>le contrôle des permissions et de la cohérence des identités
locales et distantes, à l'aide de tests sur différentes valeurs
UID/GID.</li>
</ul>
<h4>Nouveauté 2025&#160;: la sécurité avancée NFS, de bout en
bout</h4>
<p>Le cœur de cette nouvelle édition réside dans une nouvelle
section consacrée à la sécurité. Avec l’adoption croissante de NFS
dans des contextes sensibles (cloud, intelligence artificielle,
clusters scientifiques), la sécurisation n’est plus une option.</p>
<ul>
<li>La configuration de 
<strong>Kerberos V5</strong>est désormais détaillée pour permettre
une authentification stricte des identités avec la gestion des
éléments principaux (realm, keytab, etc.).</li>
<li>Le chiffrement TLS sur RPC (RFC 9289)&#160;: le guide explique
comment activer le chiffrement de bout en bout avec TLS grâce au
démon 
<strong>tlshd</strong>, offrant ainsi une protection contre les
interceptions de trafic réseau.</li>
<li>Les étapes de déploiement intégrées sont décrites, de la
génération des identités et des certificats à la configuration sur
le client et le serveur, allant jusqu'à la validation des
communications.</li>
</ul>
<p>Vous apprendrez à capturer et à analyser le trafic réseau afin
de distinguer un flux NFS en clair d'un flux protégé par Kerberos
et TLS, ainsi qu'à vérifier pas à pas l'authentification dans les
journaux Kerberos.</p>
<p>Enfin, la conclusion ouvre la voie au prochain défi
incontournable : la gestion centralisée des identités via un
annuaire LDAP – indispensable pour industrialiser NFS dans les
grandes infrastructures.</p>
<p>Pour développer vos compétences et découvrir NFS comme vous ne
l'avez jamais administré, (re)découvrez ce support de travaux
pratiques, un classique renouvelé à l'image des 40 ans d'innovation
du protocole NFS&#160;!</p>
<p>Le support 
<strong>
<a href='https://inetdoc.net/travaux_pratiques/sysadm-net.nfs/'>
«&#160;Introduction au système de fichiers réseau NFSv4&#160;»</a>
</strong>est disponible en version 
<strong>
<a href='https://inetdoc.net/pdf/sysadm-net.nfs.pdf'>PDF</a>
</strong>.</p>
<p>Relevez le défi ! L'association Kerberos et TLS permet de
décentraliser le stockage tout en le rapprochant de l'utilisateur,
sans compromettre la protection des données.</p>
</div>
</content>
</entry>
<entry>
<title type="html">Administration Système et Réseaux : l'écosystème
du stockage et de l'identité numérique</title>
<author>
<name>Philippe Latu</name>
</author>
<link rel="alternate" type="text/html"
href="https://inetdoc.net/archives/2025/09/01/administration_syst_me_et_r_seaux__l_cosyst_me_du_stockage_et_de_lidentit__num_rique/index.html" />
<id>
https://inetdoc.net/archives/2025/09/01/administration_syst_me_et_r_seaux__l_cosyst_me_du_stockage_et_de_lidentit__num_rique/index.html</id>
<published>2025-09-01T15:08:41+02:00</published>
<updated>2025-09-01T15:08:41+02:00</updated>
<category term="formations" />
<category term="m1" />
<category term="système" />
<content type="xhtml">
<div xmlns="http://www.w3.org/1999/xhtml">
<p>Alors que s'ouvre une nouvelle année universitaire, les
étudiants de première année de master Réseaux et Télécommunications
de l'université de Toulouse sont confrontés à des défis
technologiques majeurs : maîtriser l'évolution toujours plus rapide
des architectures de stockage et les enjeux cruciaux de la gestion
de l'identité numérique.</p>
<p>Voici une brève introduction aux trois supports de cours
utilisés dans le module Administration Système et Réseaux.</p>
<img alt="Module sysadm-net" src="/images/m1-sysadm-net.png"
width="30%" />
<h4>
<a href='https://inetdoc.net/pdf/c1-m1-asr.pdf'>
Présentation&#160;1&#160;: Bases du Stockage Réseau - Quand le
Stockage Devient une Fonction Réseau</a>
</h4>
<p>Ce premier support de cours pose les bases du stockage moderne
et explique comment cette fonction est passée d'un système local à
un service réseau à part entière.</p>
<p>Trois objectifs essentiels&#160;:</p>
<ul>
<li>
<strong>Maîtriser les familles de
stockage&#160;:</strong>comprendre les trois modes d'accès
fondamentaux (bloc, fichier et objet), ainsi que les technologies
associées (DAS, SAN et NAS), du SCSI traditionnel aux solutions
NVMe les plus récentes.</li>
<li>
<strong>Gérer les volumes logiques&#160;:</strong>développer une
compétence en matière d'abstraction du stockage physique avec les
solutions LVM, ZFS et Btrfs, afin d'assurer une flexibilité, une
résilience et des performances optimales.</li>
<li>
<strong>Évaluer les enjeux d'usage&#160;:</strong>analyser les
critères de choix (capacité, disponibilité, évolutivité) et
comprendre l'impact de la virtualisation sur les performances,
notamment l'effet «&#160;I/O Blender&#160;».</li>
</ul>
<h4>
<a href='https://inetdoc.net/pdf/c2-m1-asr.pdf'>
Présentation&#160;2&#160;: Systèmes de Fichiers Réseau et Stockage
Objet - L'Art du partage intelligent</a>
</h4>
<p>Cette deuxième présentation approfondit les mécanismes de
partage et d'accès aux données via les réseaux, en se concentrant
sur les protocoles NFS et SMB, ainsi que sur les architectures de
stockage objet.</p>
<p>Trois objectifs importants&#160;:</p>
<ul>
<li>
<strong>Comparer les systèmes de fichiers
distribués&#160;:</strong>décrire les protocoles NFSv4.2 et SMB
3.1.1, ainsi que leurs mécanismes de sécurité avancés (chiffrement
AES, authentification Kerberos) et les architectures parallèles
comme pNFS.</li>
<li>
<strong>Décrire le stockage objet&#160;:</strong>introduire
l'architecture Ceph avec la séparation données/métadonnées, les
algorithmes CRUSH de placement intelligent et la réplication
distribuée.</li>
<li>
<strong>Associer la sécurité et les
performances&#160;:</strong>intégrer le chiffrement en transit et
au repos, gérer les topologies backend/frontend et minimiser
l'impact de la latence réseau sur l'expérience utilisateur.</li>
</ul>
<h4>
<a href='https://inetdoc.net/pdf/c3-m1-asr.pdf'>
Présentation&#160;3&#160;: Gestion Réseau des Identités - Entrer
dans l'ère de l'identité numérique</a>
</h4>
<p>Trois objectifs à mettre en avant&#160;:</p>
<ul>
<li>
<strong>Moderniser l'authentification&#160;:</strong>migrer des
méthodes traditionnelles (mots de passe + SMS/TOTP) vers les
standards FIDO2 et l'authentification comportementale par IA, en
intégrant les protocoles OAuth 2.0 et OpenID Connect.</li>
<li>
<strong>Centraliser la gestion des
identités&#160;:</strong>déployer des solutions LDAP et Active
Directory avec SSSD pour unifier l'accès aux magasins d'identités
hétérogènes et assurer la continuité de service en mode
déconnecté.</li>
<li>
<strong>Découvrir la gestion des identités et des accès natifs au
cloud&#160;:</strong>présenter le 
<i>cloud-native IAM</i>avec fédération d'identités, tokens JWT et
conformité réglementaire (RGPD, NIS2) intégrée dès la
conception.</li>
</ul>
<p>La compréhension approfondie des briques fonctionnelles du 
<strong>stockage réseau</strong>et de la 
<strong>gestion d'identité</strong>s'impose aujourd'hui comme une
compétence stratégique pour les futurs ingénieurs. Disposer d'une
vision claire et précise de ces mécanismes permet non seulement de
consolider les bases techniques, mais aussi de gagner en autonomie
dans le choix, le déploiement et l'administration d'infrastructures
critiques. Cette démarche est d'autant plus cruciale dans une
perspective d'émancipation numérique, où l'ambition de bâtir des
solutions de 
<strong>cloud souverain</strong>– libres des dépendances vis-à-vis
des géants du secteur – devient un enjeu majeur pour assurer la
résilience, la sécurité et l'indépendance technologique des
organisations.</p>
</div>
</content>
</entry>
<entry>
<title type="html">Construire. Conteneuriser. Automatiser. De la
création d'une application web à la mise en place d'un pipeline
CI/CD fiable.</title>
<author>
<name>Philippe Latu</name>
</author>
<link rel="alternate" type="text/html"
href="https://inetdoc.net/archives/2025/06/03/construire__conteneuriser__automatiser__de_la_cr_ation_dune_application_web___la_mise_en_place_dun_pipeline_cicd_fiable/index.html" />
<id>
https://inetdoc.net/archives/2025/06/03/construire__conteneuriser__automatiser__de_la_cr_ation_dune_application_web___la_mise_en_place_dun_pipeline_cicd_fiable/index.html</id>
<published>2025-06-03T11:03:04+02:00</published>
<updated>2025-06-03T11:03:04+02:00</updated>
<category term="formations" />
<category term="m1" />
<category term="travaux_pratiques" />
<content type="xhtml">
<div xmlns="http://www.w3.org/1999/xhtml">
<p>Voici deux supports de travaux pratiques qui vous proposent une
immersion progressive dans l'intégration et le déploiement continu
: du script Bash à la création d’une application web Python
conteneurisée avec Podman (
<a href="https://md.inetdoc.net/s/xNCuzwbfX">
<strong>Lab 11</strong>
</a>), puis jusqu'à l'automatisation complète du cycle de vie
applicatif grâce à un pipeline CI/CD orchestré par Jenkins (
<a href="https://md.inetdoc.net/s/RJaDMrSM_">
<strong>Lab 12</strong>
</a>). L'objectif est d'acquérir les compétences nécessaires pour
industrialiser le déploiement d’applications, garantir leur
reproductibilité et leur robustesse à chaque modification du
code.</p>
<h4>Les 3 points forts du 
<a href="https://md.inetdoc.net/s/xNCuzwbfX">
<strong>Lab 11 – Build a Sample Web App in a Podman
Container</strong>
</a></h4>
<a href="https://md.inetdoc.net/s/xNCuzwbfX">
<img alt='Lab 11'
src='https://md.inetdoc.net/uploads/6e5bbf8e-da84-4449-8759-5c694cb31fe6.png'
width='30%' />
</a>
<br />
<ol>
<li>Maîtrise de l’automatisation avec Bash
<br />Le Lab 11 débute par un court rappel des bases du scripting
Bash, indispensable pour automatiser la création de fichiers, la
manipulation de répertoires et l'exécution de tâches
répétitives.</li>
<li>Développement et conteneurisation d’une application web Python
<br />Les étudiants développent une application web minimale en
Python/Flask, puis l'enrichissent avec des fichiers statiques
(HTML/CSS) afin de simuler une expérience utilisateur. La suite du
TP les guide dans la création d’un Dockerfile et l’utilisation de
Podman pour construire et exécuter l’application dans un conteneur,
ce qui permet de se familiariser avec le packaging
d’applications.</li>
<li>Cycle complet : build, run, inspect, clean
<br />Le TP ne se contente pas de la simple exécution : il propose
une démarche complète incluant la construction, l’inspection,
l'accès interactif au conteneur, l'arrêt et la suppression
contrôlée des ressources. Cette approche permet de découvrir le
cycle de vie d’une application conteneurisée ainsi que la
reproductibilité de sa construction.</li>
</ol>
<h4>Les 3 points forts du 
<a href="https://md.inetdoc.net/s/RJaDMrSM_">
<strong>Lab 12 – Build a Sample Web App CI/CD Pipeline Using
Jenkins</strong>
</a></h4>
<a href="https://md.inetdoc.net/s/RJaDMrSM_">
<img alt='Lab 12'
src='https://md.inetdoc.net/uploads/852929be-2644-441c-8756-a8afce4f2b12.png'
width='30%' />
</a>
<br />
<ol>
<li>Introduction pratique à CI/CD avec Jenkins
<br />Le Lab 12 s'appuie sur le travail réalisé dans le Lab 11 pour
aborder la gestion de code source avec GitLab, puis
l'automatisation des builds et des tests via Jenkins.
L'installation, la configuration et la sécurisation des accès
Jenkins/agent sont détaillées, ce qui permet de rendre
l'infrastructure reproductible et de se rapprocher des bonnes
pratiques.</li>
<li>Orchestration complète du pipeline : build, test et déploiement
persistant
<br />L’étudiant crée des jobs Jenkins pour construire et tester
l’application dans un conteneur Podman, puis intègre ces étapes
dans un pipeline déclenché à chaque modification du code.
L'utilisation d'un service Quadlet (systemd) garantit que le
conteneur reste actif après la fin du job Jenkins, assurant ainsi
la persistance du service.</li>
<li>Contrôle qualité automatisé et diagnostic intégré
<br />Le pipeline intègre des scripts de test automatisés qui
vérifient non seulement l'état du conteneur, mais aussi
l'accessibilité réelle de l'application web. Des diagnostics
détaillés (logs, statuts systemd, etc.) sont collectés en cas
d’échec, ce qui illustre l'importance du feedback rapide et de la
traçabilité dans une démarche DevOps.</li>
</ol>
<h4>L'importance d’une démarche CI/CD avec reconstruction complète
à chaque exécution</h4>
<p>La mise en place d’un pipeline CI/CD qui reconstruit
l'application et son environnement à chaque exécution garantit la
cohérence, la sécurité et la reproductibilité du déploiement. À
chaque modification du code source, le pipeline :</p>
<ul>
<li>Récupère la dernière version depuis le gestionnaire de sources
(GitLab)</li>
<li>Reconstruit intégralement l'image conteneurisée (Podman)</li>
<li>Déploie l'application dans un environnement propre, géré par
systemd (Quadlet)</li>
<li>Exécute des tests automatisés pour valider le bon
fonctionnement</li>
</ul>
<p>Cette approche élimine les effets de bord liés à des
environnements incomplets, réduit les risques d’erreurs humaines et
accélère la détection des régressions. Elle s’inscrit dans les
bonnes pratiques DevOps, où l'automatisation et la reconstruction
systématique sont des gages de qualité et de rapidité de
livraison.</p>
<h4>Pour conclure</h4>
<p>La progression proposée dans ces deux travaux pratiques illustre
l'équilibre à trouver entre les métiers du développement et des
opérations. Ils insistent sur la reconstruction complète, la
persistance des services, l'intégration des tests et la gestion des
erreurs. Cette démarche reflète les exigences du monde
professionnel, où la robustesse, la traçabilité et l'automatisation
sont des critères essentiels pour l'industrialisation des
applications.</p>
</div>
</content>
</entry>
<entry>
<title type="html">Maquettage et autohébergement : le VPN IPSec
BEET avec strongSwan</title>
<author>
<name>Philippe Latu</name>
</author>
<link rel="alternate" type="text/html"
href="https://inetdoc.net/archives/2025/05/05/maquettage_et_autoh_bergement__le_vpn_ipsec_beet_avec_strongswan/index.html" />
<id>
https://inetdoc.net/archives/2025/05/05/maquettage_et_autoh_bergement__le_vpn_ipsec_beet_avec_strongswan/index.html</id>
<published>2025-05-05T18:22:48+02:00</published>
<updated>2025-05-05T18:22:48+02:00</updated>
<category term="ipsec" />
<category term="système" />
<content type="xhtml">
<div xmlns="http://www.w3.org/1999/xhtml">
<p>Vous cherchez à mettre en place un VPN performant, sécurisé et
économique pour vos projets d'autohébergement ? Découvrez les
points forts d'une architecture plutôt originale basée sur
strongSwan, IPSec BEET et nftables, présentée dans le guide
disponible à l'adresse suivante : 
<a href="https://md.inetdoc.net/s/zLuPZ-gAy">
<strong>IPSec Bound End-to-End Tunnel VPN with strongSwan</strong>
</a></p>
<br />
<a href="https://md.inetdoc.net/s/zLuPZ-gAy">
<img alt='IPSec BEET VPN'
src='https://md.inetdoc.net/uploads/133e18c8-983d-4f2b-8421-bfc05b2d0e3c.png'
width='30%' />
</a>
<br />
<p>Le mode 
<strong>BEET</strong>(
<i>Bound End-to-End Tunnel</i>) combine les avantages des modes
tunnel et transport d'IPSec : il réduit la surcharge d'en-tête
typique du mode tunnel tout en conservant une structure adaptée à
la traduction d'adresses (NAT). Cette approche permet d'optimiser
les performances (chiffrement ESP en transport) et de simplifier la
gestion des adresses grâce à des associations de sécurité (SA)
prédéfinies. Il garantit la résilience face aux changements
d'adressage des fournisseurs d'accès internet (FAI).</p>
<p>L'utilisation des interfaces 
<strong>Xfrm</strong>Linux permet de découpler la gestion des
associations de sécurité (SA) du routage de paquets. L'objectif est
de simplifier la gestion des tunnels. Associées au mode BEET, ces
interfaces Xfrm associent chaque SA à un identifiant d'interface
unique. Cette abstraction facilite également le filtrage via
nftables.</p>
<p>Côté sécurité et conformité, le guide privilégie les certificats
auto-signés Ed25519/X25519, offrant une sécurité post-quantique
(NIST Level 1) tout en restant compatible avec les normes X.509. Le
choix de chacha20poly1305 et SHA-384 assure un chiffrement robuste,
même sur du matériel limité sans gestion du matériel TPM.</p>
<p>Pour le filtrage, 
<strong>Nftables</strong>offre une gestion unifiée du trafic
chiffré/déchiffré avec des règles spécifiques (
<tt>meta ipsec exists</tt>) qui permettent de filtrer uniquement
les paquets traités par IPSec. Il est toutefois toujours nécessaire
de régler manuellement le 
<i>MSS clamping</i>pour adapter la taille des segments TCP et
éviter la fragmentation. L'utilisation des règles de 
<i>masquerading</i>assure une traduction d’adresses transparente
pour les flux sortants des extrémités du VPN.</p>
<p>Cette architecture démontre qu'il est possible de déployer un
VPN solide à moindre coût, en s'appuyant sur des outils open source
comme strongSwan et nftables. En combinant BEET, Xfrm et des
standards cryptographiques modernes, elle offre une alternative aux
solutions cloud propriétaires, avec pour objectif la mise en place
d'infrastructures de services autonomes. La modularité des
configurations permet par ailleurs une adaptation aisée à des cas
d’usage variés, allant des objets connectés industriels aux
déploiements hybrides.</p>
<p>Si vous recherchez l'autohébergement en dehors de la sphère des
fournisseurs d'accès Internet, cette solution de VPN en mode BEET
est faite pour vous. N'hésitez pas à me faire part de vos retours
sur le document.</p>
</div>
</content>
</entry>
<entry>
<title type="html">Comment appliquer une configuration déclarative
à un commutateur Open vSwitch avec la bibliothèque ovsdbapp
?</title>
<author>
<name>Philippe Latu</name>
</author>
<link rel="alternate" type="text/html"
href="https://inetdoc.net/archives/2025/03/26/comment_appliquer_une_configuration_d_clarative___un_commutateur_open_vswitch_avec_la_biblioth_que_ovsdbapp/index.html" />
<id>
https://inetdoc.net/archives/2025/03/26/comment_appliquer_une_configuration_d_clarative___un_commutateur_open_vswitch_avec_la_biblioth_que_ovsdbapp/index.html</id>
<published>2025-03-26T17:06:49+02:00</published>
<updated>2025-03-26T17:06:49+02:00</updated>
<category term="formations" />
<category term="m1" />
<category term="travaux_pratiques" />
<category term="virtualisation" />
<content type="xhtml">
<div xmlns="http://www.w3.org/1999/xhtml">
<p>Les manipulations proposées dans le support de travaux pratiques

<a href="https://md.inetdoc.net/s/cmJ1JEeu9">
<strong>DevNet Lab 9 – Configure Open vSwitch using the Python
ovsdbapp library</strong>
</a>, s'inscrivent dans le domaine de la 
<strong>programmabilité des réseaux</strong>. Associée à
l'automatisation, la programmation des topologies d'interconnexion
de réseaux est devenue indispensable pour répondre aux besoins
d'agilité, de fiabilité et d'évolutivité des infrastructures
modernes.</p>
<p>La problématique étant posée, nous sommes à nouveau confrontés à
des défis de taille !</p>
<ul>
<li>Nos étudiants, bien que débutants, ont été habitués à
l'approche impérative (séquence d'instructions propres à chaque
constructeur). Le passage à une approche déclarative, qui décrit
l'état souhaité sans tenir compte des équipements cibles représente
un changement de paradigme important.</li>
<li>Dans le domaine de la formation, on privilégie souvent des
solutions qui escamotent l'infrastructure physique sous-jacente - 
<i>underlay network</i>- qui assure la connectivité de base, pour
se concentrer sur l'abstraction d'infrastructure - 
<i>overlay network</i>- qui offre une grande flexibilité pour les
applications et les services. À force de recourir à tous ces
faux-semblants, les étudiants ont du mal à changer de contexte, et
certains pensent même que c'est impossible.</li>
</ul>
<p>Si l'on fait le choix de ne pas former de jeunes
narco-dépendants aux grands fournisseurs du cloud public, on n'a
pas d'autre solution que de se plonger dans les opérations avec un
niveau d'exigence élevé en matière d'automatisation.</p>
<p>C'est ainsi que le support de travaux pratiques 
<a href="https://md.inetdoc.net/s/cmJ1JEeu9">
<strong>DevNet Lab 9</strong>
</a>propose de produire un code Python de configuration des ports
d'un commutateur virtuel Open vSwitch (unique pour débuter) à
partir du contenu d'un 
<a href="https://github.com/platu/Lab09/blob/main/switch_config.yml">
fichier de déclaration YAML</a>.</p>
<br />
<a href="https://md.inetdoc.net/s/cmJ1JEeu9">
<img alt='Topologie DevNet + ovsdbapp'
src='https://md.inetdoc.net/uploads/f14643b1-0bea-444f-9868-1ebfe5667c31.png'
width='30%' />
</a>
<br />
<p>Les manipulations s'appuient sur un scénario concret : dans le
contexte d'une infrastructure cloud privée, des hyperviseurs sont
déployés avec chacun un commutateur de distribution Open vSwitch
nommé 
<tt>dsw-host</tt>. Un grand nombre d'interfaces 
<tt>tap</tt>sont provisionnées et déclarées comme ports de
commutateur. Lorsque les étudiants démarrent leurs premiers travaux
pratiques, ils se voient attribuer des ensembles de ces interfaces
pour exécuter des machines virtuelles ou des routeurs. Il s'agit
donc de programmer les topologies réseau d'interconnexion entre le
monde virtuel et le monde physique.</p>
<p>Les objectifs du laboratoire sont simples :</p>
<ul>
<li>Établir une connexion sécurisée au serveur de base de données
OVSDB à l'aide d'un premier script Python</li>
<li>Lister les commutateurs existants et récupérer les attributs
détaillés d'un port particulier</li>
<li>Charger et appliquer des configurations réseau depuis un
fichier YAML vers les ports du commutateur</li>
<li>Vérifier manuellement les configurations appliquées sur
l'hyperviseur afin d'assurer la cohérence entre l'état déclaré et
la configuration réseau réelle</li>
</ul>
<p>La progression des manipulations est organisée en trois parties
principales, chacune apportant un niveau supplémentaire de maîtrise
:</p>
<ol>
<li>
<strong>Mise en place de l'environnement</strong>
<br />Cette première partie analyse les conditions nécessaires pour
établir un canal de communication sécurisé entre le code Python et
le service 
<tt>ovsdb-server</tt>exécuté sur l'hyperviseur. Les étudiants
apprennent à utiliser la fonctionnalité 
<tt>LocalForward</tt>d'OpenSSH pour créer un tunnel sécurisé vers
le socket Unix du service.</li>
<li>
<strong>Exploration interactive avec Python</strong>
<br />Dans cette deuxième partie, les étudiants apprennent
progressivement à interagir avec la base de données Open vSwitch.
Ils commencent par une simple liste des commutateurs disponibles,
puis récupèrent les attributs détaillés d'un port spécifique, et
enfin analysent les configurations VLAN (mode 
<tt>access</tt>ou 
<tt>trunk</tt>).</li>
<li>
<strong>Évolution vers une approche déclarative</strong>
<br />La troisième partie introduit l'approche déclarative avec
YAML comme source de vérité pour la configuration souhaitée. Les
étudiants développent un script capable de charger cette
configuration et de l'appliquer aux ports du commutateur. Ils
implémentent également un mode "
<tt>dry-run</tt>" pour prévisualiser les changements sans les
appliquer.</li>
</ol>
<p>Cette approche progressive permet aux étudiants de comprendre
d'abord les mécanismes sous-jacents avant d'aborder les concepts
plus avancés de programmabilité réseau. Néanmoins, elle comporte
certaines limitations.</p>
<ul>
<li>L'environnement de laboratoire requiert le maintien d'une
connexion SSH active entre le système de développement et
l'hyperviseur.</li>
<li>La courbe d'apprentissage associée à la programmation Python et
aux concepts de réseaux virtualisés est assez abrupte pour les
débutants.</li>
<li>Les concepts de cache et d'optimisation des requêtes introduits
dans la dernière partie peuvent être difficiles à appréhender sans
une solide compréhension préalable de Python.</li>
</ul>
<p>Heureusement, les étudiants de première année de Master ont déjà
parcouru un long chemin dans le domaine du développement. Malgré
ces limitations, ce laboratoire est une opportunité de progresser
dans la compréhension pratique de la programmabilité réseau
moderne, alignée sur les pratiques DevOps actuelles.</p>
<p>Ces manipulations constituent une première étape vers la
maîtrise de la programmabilité réseau. Elles posent les fondements
nécessaires pour aborder des sujets plus avancés comme
l'orchestration multi-équipements ou 
<i>switch fabric</i>.</p>
<p>Les compétences acquises permettent non seulement d'automatiser
des tâches répétitives, mais aussi d'adopter une approche plus
systématique et fiable de la gestion des infrastructures réseau -
ne serait-ce que pour réaliser les manipulations suivantes. La
transition vers le « 
<strong>réseau en tant que code</strong>» (
<i>Network as Code</i>) représente un changement de paradigme aussi
important que celui du 
<strong>DevOps</strong>pour les applications et les services.</p>
</div>
</content>
</entry>
<entry>
<title type="html">De l'importance des tests automatisés</title>
<author>
<name>Philippe Latu</name>
</author>
<link rel="alternate" type="text/html"
href="https://inetdoc.net/archives/2025/03/20/de_limportance_des_tests_automatis_s/index.html" />
<id>
https://inetdoc.net/archives/2025/03/20/de_limportance_des_tests_automatis_s/index.html</id>
<published>2025-03-20T10:22:13+02:00</published>
<updated>2025-03-20T10:22:13+02:00</updated>
<category term="formations" />
<category term="m1" />
<category term="travaux_pratiques" />
<category term="virtualisation" />
<content type="xhtml">
<div xmlns="http://www.w3.org/1999/xhtml">
<p>Dans un monde où l'agilité et la conformité en matière de
sécurité sont de plus en plus exigées dans les infrastructures
DevOps, le développement de tests automatisés est devenu crucial.
On doit constamment s'assurer que les systèmes sont sécurisés,
stables et conformes aux normes établies, tout en maintenant une
vitesse de déploiement élevée. C'est ici que les outils de test
automatisé entrent en jeu, permettant de vérifier rapidement et
efficacement l'état des infrastructures et des applications.
Cependant, de nombreux défis doivent être relevés pour mettre en
œuvre ces tests. En voici deux illustrations.</p>
<p>Pour commencer, trop nombreux sont les systèmes qui ne
produisent pas de 
<strong>données structurées</strong>, ce qui rend difficile
l'automatisation ou l'évaluation de la conformité. Les tests
automatisés nécessitent des jeux de données structurés et
reproductibles pour fonctionner efficacement. On se retrouve donc
contraint de développer en interne ou d'investir dans des outils
capables de transformer les données non structurées en données
exploitables.</p>
<p>Ensuite, la courbe d'apprentissage est très raide, surtout pour
les débutants. Quand Cisco met à disposition pyATS et son extension
Genie, une plateforme pour automatiser les tests sur les
infrastructures réseau, arriver à une bonne compréhension des
concepts de programmation tout en ayant une connaissance des
spécificités des protocoles réseau demande un investissement
conséquent. Cela ralentit l'adoption et l'utilisation efficace de
ces outils.</p>
<p>Le Lab 17 
<a href="https://md.inetdoc.net/s/iqsMpdKYK">
<strong>Automated testing with pyATS and Genie</strong>
</a>est une tentative de réponse aux défis posés par
l'automatisation des tests.</p>
<a href="https://md.inetdoc.net/s/iqsMpdKYK">
<img alt="Topologie Automatisation des tests"
src="https://md.inetdoc.net/uploads/15c91fe7-8ea3-4303-8875-f13c14ce9268.png"
width="25%" />
</a>
<br />
<p>Les manipulations débutent par la mise en place d'une maquette
avec deux routeurs qui échangent des réseaux avec le protocole
OSPFv3. L'objectif de cette maquette est d'illustrer les trois
états à tester.</p>
<ul>
<li>L'
<strong>état attendu</strong>de l'infrastructure correspond à un
échange de tous les réseaux connus des deux routeurs hub et
spoke.</li>
<li>L'
<strong>état configuré</strong>correspond au fait qu'une
configuration correcte a été appliquée sur chaque routeur
individuellement.</li>
<li>Le test de l'
<strong>état opérationnel</strong>vérifie que les échanges de
réseaux entre les deux routeurs sont corrects.</li>
</ul>
<p>La progression des manipulations qui suivent la mise en place de
la maquette passe par les étapes suivantes :</p>
<ol>
<li>La génération de données structurées avec un tout premier code
Python qui valide la communication avec un routeur à l'aide de
pyATS.</li>
<li>Le test de l'état configuré avec un script Python unique qui
présente la syntaxe d'une classe dont chaque méthode est un
test.</li>
<li>Le test de l'état opérationnel avec un découpage en plusieurs
fichiers : 
<i>job</i>, 
<i>trigger</i>et 
<i>datafiles</i>qui permettent d'accéder à un code plus efficace et
réutilisable.</li>
</ol>
<p>Si vous acceptez de vous plonger dans le scénario proposé vous
verrez que ce support de travaux pratiques vous fera avancer dans
la compréhension du fonctionnement et des mécanismes des tests
automatisés. Ainsi, vous aurez une représentation plus précise des
bénéfices apportés par la formalisation des jeux de tests.</p>
<p>Pour autant, il ne s'agit pas de « vendre du rêve ». Les limites
de l'exercice sont bien visibles.</p>
<ul>
<li>Si on présente la transformation en données structurées des
éléments de configuration d'un routeur, on n'utilise pas cette
représentation pour les tests qui suivent. L'utilisation des
données structurées engendrerait un coût supplémentaire pour le
développement des tests qui suivent et rendrait le document encore
plus volumineux.</li>
<li>Si le protocole OSPFv3 associé aux familles d'adresses IPv4 et
IPv6 est intéressant dans le sens où il utilise un mécanisme
d'échange unique pour les deux familles et allège la configuration,
il demeure nécessaire de maîtriser son fonctionnement pour rédiger
correctement les méthodes de test.</li>
</ul>
<p>Pour conclure, on peut dire que tout est affaire de compromis.
Les étudiants peuvent aboutir à des résultats satisfaisants et
mesurables avec les tableaux de bord du service web intégré à pyATS
en un temps raisonnable.</p>
<img alt="Tableau de bord Automatisation des tests"
src="https://md.inetdoc.net/uploads/d7b9b1ac-15d3-42c4-b7fc-6e2550f8f2c5.png"
width="25%" />
<p>L'objectif suivant est de transposer cette démarche de
construction de tests à d'autres contextes, tels que le très
classique « triangle OSPF » et l'intégration dans les phases d'un 
<i>pipeline</i>GitLab CI.</p>
</div>
</content>
</entry>
<entry>
<title type="html">De l'importance de l'idempotence dans
l'automatisation DevOps</title>
<author>
<name>Philippe Latu</name>
</author>
<link rel="alternate" type="text/html"
href="https://inetdoc.net/archives/2025/03/11/de_limportance_de_lidempotence_dans_lautomatisation_devops/index.html" />
<id>
https://inetdoc.net/archives/2025/03/11/de_limportance_de_lidempotence_dans_lautomatisation_devops/index.html</id>
<published>2025-03-11T15:37:08+02:00</published>
<updated>2025-03-11T15:37:08+02:00</updated>
<category term="formations" />
<category term="m1" />
<category term="travaux_pratiques" />
<category term="virtualisation" />
<content type="xhtml">
<div xmlns="http://www.w3.org/1999/xhtml">
<p>Parmi les principes DevOps, la recherche de l'idempotence, qui
consiste à s'assurer que les traitements automatisés n'ont pas
d'effets secondaires indésirables et peuvent être répétés sans
altérer le résultat final est un objectif vraiment très
intéressant.</p>
<p>Après plusieurs sessions de formation, il apparaît toutefois que
cet objectif a un coût en termes de développement. En effet, créer
un Playbook Ansible aux traitements idempotents nécessite souvent
d'augmenter significativement la quantité de code afin de garantir
que chaque étape du processus soit exécutée de manière prévisible
et reproductible. Pour les étudiants qui débutent dans
l'automatisation, cela ne facilite pas l'apprentissage.</p>
<p>Voici les liens vers deux supports de travaux pratiques qui
illustrent la hauteur de la marche à franchir entre placer une ou
deux tâches dans un Playbook Ansible et garantir un traitement
reproductible conforme avec l'état attendu de l'infrastructure
cible.</p>
<p>Le lab « 
<a href="https://md.inetdoc.net/s/nt636Z4Ct">Use Ansible to Back Up
and Configure a c8000v Router</a>» propose une introduction à la
création de Playbooks Ansible.</p>
<a href="https://md.inetdoc.net/s/nt636Z4Ct">
<img alt="Topologie Ansible et routeur virtuel c8000v"
src="https://md.inetdoc.net/uploads/75e721e2-ac64-41a1-b4af-ec100c5248a4.png"
width="25%" />
</a>
<br />
<p>Le lab « 
<a href="https://md.inetdoc.net/s/wNFfdfcSw">Using Ansible to
automate the installation of web services on Incus containers</a>»
utilise à nouveau Ansible pour automatiser la gestion de conteneurs
à partir d'un inventaire dynamique. L'installation et la
configuration de services web servent ensuite de prétexte pour
manipuler les fichiers de configuration et valider le
fonctionnement de ces services.</p>
<a href="https://md.inetdoc.net/s/wNFfdfcSw">
<img alt="Topologie Ansible et serveur de conteneurs Incus"
src="https://md.inetdoc.net/uploads/7559f148-6474-4453-92d2-86016e7081b6.png"
width="25%" />
</a>
<br />
<p>Les points clés sont :</p>
<ol>
<li>
<strong>L'idempotence et le développement</strong>
<br />Les traitements montrent l'importance de l'idempotence dans
l'automatisation, tout en illustrant les conséquences sur la
complexité du code.</li>
<li>
<strong>Ansible et l'automatisation</strong>
<br />Ansible s'est imposé comme un outil de référence en matière
d'automatisation et ses modules occupent une place
essentielle.</li>
<li>
<strong>Sensibilisation aux concepts DevOps</strong>
<br />L'objectif principal est de sensibiliser les étudiants aux
concepts clés de l'automatisation DevOps, notamment la déclaration
précise de l'état attendu d'une infrastructure IaaS.</li>
</ol>
<p>Prenons l'exemple du lancement de conteneurs. Dans un contexte
procédural, on écrirait le code de la commande de lancement dans un
script Bash exécuté via SSH. Dans la liste des tâches Ansible
ci-dessous, on commence par obtenir la liste des conteneurs
attendus, puis on ne crée que ceux qui n'existent pas (when item.rc
!=0) et on lance ceux qui ont l'état 'STOPPED'. Le code idempotent
contient 3 tâches.</p>
<pre>
  tasks:
    - name: CHECK CONTAINERS STATE
      ansible.builtin.shell:
        cmd: set -o pipefail &amp;&amp; incus ls --format csv -c
n,s | grep {{ item }}
        executable: /bin/bash
      register: container_states
      with_inventory_hostnames:
        - containers
      changed_when: false
      failed_when: false
      check_mode: false

    - name: LAUNCH INCUS CONTAINERS
      ansible.builtin.command:
        cmd: incus launch {{ container_image }} "{{ item.item }}"
      loop: "{{ container_states.results }}"
      when: item.rc != 0 # Container not found
      register: containers_created
      changed_when: containers_created is changed

    - name: START STOPPED CONTAINERS
      ansible.builtin.command:
        cmd: incus start "{{ item.item }}"
      loop: "{{ container_states.results }}"
      when: item.rc == 0 and 'STOPPED' in item.stdout
      register: containers_started
      changed_when: containers_started is changed
</pre>
<p>À travers cet exemple, on voit que l'idempotence constitue le
fil conducteur pédagogique qui unifie les deux supports de travaux
pratiques tout en servant de critère d'évaluation de la qualité des
automatisations développées.</p>
<p>Dans le 
<a href="https://md.inetdoc.net/s/nt636Z4Ct">Lab 15</a>sur la
configuration des routeurs, les étudiants découvrent
progressivement que l'idempotence ne peut être atteinte qu'en
reprenant l'édition du code des playbooks vers une approche plus
modulaire et spécialisée - passant d'une simple tâche ios_config à
une structure plus sophistiquée utilisant des modules dédiés comme
ios_interfaces et ios_l3_interfaces. Cette progression illustre
parfaitement la trajectoire d'apprentissage visée : comprendre que
l'état déclaratif d'une infrastructure nécessite un investissement
en termes de conception logicielle.</p>
<p>De même, le 
<a href="https://md.inetdoc.net/s/wNFfdfcSw">Lab 16</a>sur
l'installation des serveurs Web dans des conteneurs Incus pousse
les étudiants à développer une logique conditionnelle élaborée pour
vérifier l'état actuel avant toute modification, comme l'illustrent
les tâches de gestion des conteneurs qui déterminent si un
conteneur doit être créé ou simplement démarré. Ces exercices
pratiques transforment un concept théorique - l'idempotence - en
compétence technique concrète. Ils permettent ainsi aux étudiants
de comprendre par la pratique que la déclaration précise de l'état
attendu d'une infrastructure IaaS exige une réflexion approfondie
sur les conditions préalables, les états intermédiaires et les
résultats finaux de chaque opération d'automatisation.</p>
<p>En conclusion, l'objectif de l'édition 2025 des supports de
travaux pratiques du module d'automatisation DevOps est de montrer
aux étudiants l'importance de l'idempotence et de la précision dans
la déclaration de l'état attendu d'une infrastructure. En utilisant
des outils comme Ansible, ces supports pratiques proposent une
approche concrète pour comprendre comment gérer efficacement les
infrastructures automatisées.</p>
<p>Vous êtes invités à explorer ce document et à partager vos
retours. Votre expérience contribuera à l'amélioration continue de
ces ressources pédagogiques.</p>
</div>
</content>
</entry>
</feed>
