<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/css" href="https://inetdoc.net/styles/feed.css"?>
<rss version="2.0"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:admin="http://webns.net/mvcb/"
xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
<title>!netdoc.net</title>
<atom:link href="https://inetdoc.net/rss.xml" rel="self"
type="application/rss+xml" />
<link>https://inetdoc.net</link>
<description></description>
<dc:language>fr-fr</dc:language>
<dc:creator>Philippe Latu</dc:creator>
<dc:date>2026-03-29T10:16:39+02:00</dc:date>
<admin:generatorAgent rdf:resource="http://nanoblogger.sourceforge.net" />
<item>
<link>
https://inetdoc.net/archives/2026/03/28/automatisation_dinfrastructure_avec_ansible_et_gitlab_ci_-__dition_2026/index.html</link>
<guid isPermaLink="true">
https://inetdoc.net/archives/2026/03/28/automatisation_dinfrastructure_avec_ansible_et_gitlab_ci_-__dition_2026/index.html</guid>
<title>Automatisation d'infrastructure avec Ansible et GitLab CI -
Édition 2026</title>
<dc:date>2026-03-28T17:39:33+02:00</dc:date>
<dc:creator>Philippe Latu</dc:creator>
<dc:subject>m2, formations, iac, travaux_pratiques, système,
virtualisation</dc:subject>
<description>
<![CDATA[
<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="https://inetdoc.net/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: --> VLAN 230
    enabled: true
    vlan_id: 230
  - interface_type: GigabitEthernet
    interface_id: 3
    description: --> 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;&#8212;&#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;&#8212;&#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;&#8212;&#160;
<a href="https://gitlab.inetdoc.net/iac/lab03">GitLab repository</a>
</li>
</ul>]]>
</description>
</item>
<item>
<link>
https://inetdoc.net/archives/2026/03/08/renforcez_la_protection_de_votre_serveur_avec_le_fork_python_de_nft-blacklist/index.html</link>
<guid isPermaLink="true">
https://inetdoc.net/archives/2026/03/08/renforcez_la_protection_de_votre_serveur_avec_le_fork_python_de_nft-blacklist/index.html</guid>
<title>Renforcez la protection de votre serveur avec le fork Python
de nft-blacklist</title>
<dc:date>2026-03-08T17:03:53+02:00</dc:date>
<dc:creator>Philippe Latu</dc:creator>
<dc:subject>filtrage, système</dc:subject>
<description>
<![CDATA[<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="https://inetdoc.net/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>]]>
</description>
</item>
<item>
<link>
https://inetdoc.net/archives/2026/01/12/enseignements_ops___l_re_du_d_claratif__entre_progr_s_et_d_rives/index.html</link>
<guid isPermaLink="true">
https://inetdoc.net/archives/2026/01/12/enseignements_ops___l_re_du_d_claratif__entre_progr_s_et_d_rives/index.html</guid>
<title>Enseignements Ops à l'ère du déclaratif : entre progrès et
dérives</title>
<dc:date>2026-01-12T17:42:40+02:00</dc:date>
<dc:creator>Philippe Latu</dc:creator>
<dc:subject>incus, formations, travaux_pratiques,
système</dc:subject>
<description>
<![CDATA[
<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>&#171;&#160;<a href="https://md.inetdoc.net/s/zL2STyrLf6">Start
unprivileged Incus containers on top of Open vSwitch in a few
steps</a>&#160;&#187;</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
&#171;&#160;marketplaces YAML&#160;&#187; 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
&#171;&#160;hallucinées&#160;&#187;) 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>]]>
</description>
</item>
<item>
<link>
https://inetdoc.net/archives/2025/10/06/introduction_au_syst_me_de_fichiers_r_seau_nfsv4_-__dition_2025/index.html</link>
<guid isPermaLink="true">
https://inetdoc.net/archives/2025/10/06/introduction_au_syst_me_de_fichiers_r_seau_nfsv4_-__dition_2025/index.html</guid>
<title>Introduction au système de fichiers réseau NFSv4 - édition
2025</title>
<dc:date>2025-10-06T09:13:51+02:00</dc:date>
<dc:creator>Philippe Latu</dc:creator>
<dc:subject>formations, m1, système</dc:subject>
<description>
<![CDATA[<h4>NFS fête ses 40 ans</h4>

<p>Le protocole NFS (Network File System) vient de célébrer son 40e
anniversaire&nbsp;! 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/'>«&nbsp;Introduction
au système de fichiers réseau NFSv4&nbsp;»</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&nbsp;:</p>

<ul>
        <li>l'identification et la configuration des services réseau historiques,
                tels que rpcbind et portmapper&nbsp;;</li>
        <li>la mise en place d'une maquette minimaliste de type NAS avec
                exportation d'arborescences et création de comptes utilisateurs
                locaux&nbsp;;</li>
        <li>le paramétrage des montages manuels et automatisés via
            autofs&nbsp;;</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&nbsp;: 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)&nbsp;: 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&nbsp;!</p>

<p>Le support <strong><a
href='https://inetdoc.net/travaux_pratiques/sysadm-net.nfs/'>«&nbsp;Introduction
au système de fichiers réseau NFSv4&nbsp;»</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>]]>
</description>
</item>
<item>
<link>
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</link>
<guid isPermaLink="true">
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</guid>
<title>Administration Système et Réseaux : l'écosystème du stockage
et de l'identité numérique</title>
<dc:date>2025-09-01T15:08:41+02:00</dc:date>
<dc:creator>Philippe Latu</dc:creator>
<dc:subject>formations, m1, système</dc:subject>
<description>
<![CDATA[<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&nbsp;1&nbsp;:
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&nbsp;:</p>
<ul>
<li><strong>Maîtriser les familles de stockage&nbsp;:</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&nbsp;:</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&nbsp;:</strong> analyser les critères de
choix (capacité, disponibilité, évolutivité) et comprendre l'impact de la
virtualisation sur les performances, notamment l'effet «&nbsp;I/O
Blender&nbsp;».</li>
</ul>

<h4><a href='https://inetdoc.net/pdf/c2-m1-asr.pdf'>Présentation&nbsp;2&nbsp;:
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&nbsp;:</p>
<ul>
<li><strong>Comparer les systèmes de fichiers distribués&nbsp;:</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&nbsp;:</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&nbsp;:</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&nbsp;3&nbsp;:
Gestion Réseau des Identités - Entrer dans l'ère de l'identité
numérique</a></h4>

<p>Trois objectifs à mettre en avant&nbsp;:</p>
<ul>
<li><strong>Moderniser l'authentification&nbsp;:</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&nbsp;:</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&nbsp;:</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>]]>
</description>
</item>
<item>
<link>
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</link>
<guid isPermaLink="true">
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</guid>
<title>Construire. Conteneuriser. Automatiser. De la création d'une
application web à la mise en place d'un pipeline CI/CD
fiable.</title>
<dc:date>2025-06-03T11:03:04+02:00</dc:date>
<dc:creator>Philippe Latu</dc:creator>
<dc:subject>formations, m1, travaux_pratiques</dc:subject>
<description>
<![CDATA[<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>]]>
</description>
</item>
<item>
<link>
https://inetdoc.net/archives/2025/05/05/maquettage_et_autoh_bergement__le_vpn_ipsec_beet_avec_strongswan/index.html</link>
<guid isPermaLink="true">
https://inetdoc.net/archives/2025/05/05/maquettage_et_autoh_bergement__le_vpn_ipsec_beet_avec_strongswan/index.html</guid>
<title>Maquettage et autohébergement : le VPN IPSec BEET avec
strongSwan</title>
<dc:date>2025-05-05T18:22:48+02:00</dc:date>
<dc:creator>Philippe Latu</dc:creator>
<dc:subject>ipsec, système</dc:subject>
<description>
<![CDATA[<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>]]>
</description>
</item>
<item>
<link>
https://inetdoc.net/archives/2025/03/26/comment_appliquer_une_configuration_d_clarative___un_commutateur_open_vswitch_avec_la_biblioth_que_ovsdbapp/index.html</link>
<guid isPermaLink="true">
https://inetdoc.net/archives/2025/03/26/comment_appliquer_une_configuration_d_clarative___un_commutateur_open_vswitch_avec_la_biblioth_que_ovsdbapp/index.html</guid>
<title>Comment appliquer une configuration déclarative à un
commutateur Open vSwitch avec la bibliothèque ovsdbapp ?</title>
<dc:date>2025-03-26T17:06:49+02:00</dc:date>
<dc:creator>Philippe Latu</dc:creator>
<dc:subject>formations, m1, travaux_pratiques,
virtualisation</dc:subject>
<description>
<![CDATA[
<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>]]>
</description>
</item>
<item>
<link>
https://inetdoc.net/archives/2025/03/20/de_limportance_des_tests_automatis_s/index.html</link>
<guid isPermaLink="true">
https://inetdoc.net/archives/2025/03/20/de_limportance_des_tests_automatis_s/index.html</guid>
<title>De l'importance des tests automatisés</title>
<dc:date>2025-03-20T10:22:13+02:00</dc:date>
<dc:creator>Philippe Latu</dc:creator>
<dc:subject>formations, m1, travaux_pratiques,
virtualisation</dc:subject>
<description>
<![CDATA[<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>]]>
</description>
</item>
<item>
<link>
https://inetdoc.net/archives/2025/03/11/de_limportance_de_lidempotence_dans_lautomatisation_devops/index.html</link>
<guid isPermaLink="true">
https://inetdoc.net/archives/2025/03/11/de_limportance_de_lidempotence_dans_lautomatisation_devops/index.html</guid>
<title>De l'importance de l'idempotence dans l'automatisation
DevOps</title>
<dc:date>2025-03-11T15:37:08+02:00</dc:date>
<dc:creator>Philippe Latu</dc:creator>
<dc:subject>formations, m1, travaux_pratiques,
virtualisation</dc:subject>
<description>
<![CDATA[<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>]]>
</description>
</item>
</channel>
</rss>
