From 782eeae025f26db660b8c69fdb308eda2b1eb997 Mon Sep 17 00:00:00 2001 From: Heuzef Date: Wed, 23 Aug 2023 05:57:20 +0200 Subject: [PATCH] =?UTF-8?q?Nouvelle=20Note=20:=20G=C3=A9n=C3=A9rer=20ses?= =?UTF-8?q?=20diagrammes=20avec=20Python?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- content/articles/2023/diagrams.md | 130 +++++++++++++++++++++++++++++++++++++- content/assets/dac.jpg | Bin 0 -> 57086 bytes content/assets/diagrams.png | Bin 0 -> 4544 bytes 3 files changed, 127 insertions(+), 3 deletions(-) create mode 100644 content/assets/dac.jpg create mode 100644 content/assets/diagrams.png diff --git a/content/articles/2023/diagrams.md b/content/articles/2023/diagrams.md index 046eb6f..8b115fa 100644 --- a/content/articles/2023/diagrams.md +++ b/content/articles/2023/diagrams.md @@ -1,5 +1,129 @@ -Title: Générez vos diagrammes avec Python +Title: Générer ses diagrammes avec Python Category: Informatique Tags: python, autohébergement, web, diagramme -Date: 2023-08-01 -Status: draft +Date: 2023-08-23 +Status: published + +Dans cet article, nous allons nous initier au DaC afin de réaliser de magnifiques schémas en Python. + +Aujourd'hui, il est assez tentant de s'orienter vers des solutions comme Draw.io pour réaliser des schémas visuellement agréable, mais l'outil en lui-même ne me convient pas, car je ne le trouve pas assez flexible. Je souhaite utiliser un outil libre sans restriction et qui permet de générer confortablement (voir automatiquement) des beaux schémas que je peux exporter en SVG et PDF à la demande. + +![Diagrams](../../assets/diagrams.png) + +# Pourquoi utiliser du DaC ? 🤔 + +Pour l'évolution des schémas dans le temps, il devient alors très usant de ressortir son logiciel pour éditer proprement pour une simple mise à jour. + +En tant que Graphiste, il m'est difficile de ne pas être perfectionniste et la moindre mise à jour prend alors beaucoup trop de temps pour avoir un rendu satisfaisant. +Changer de logique pour le DaC permet donc de ne plus du tout sortir de logiciel de PAO, mais de simplement tout coder. En plus d'être une solution légère, il est alors agréable de revenir dans le code pour actualiser son schéma. Couplé avec du versionnage, c'est encore plus plaisant à maintenir. + +# Recherche d'outil 🔍 + +J'ai mis du temps à trouver mon bonheur, entre les vieux projets dépréciés de geek frustrés difficile à exploiter, puis je suis tombé sur la référence, à savoir [Kroki.io](https://kroki.io) qui convient à beaucoup, car bien maintenu et dispose de tout un tas de librairie populaire ... mais c'est tout ! Très efficace pour générer automatiquement des diagrammes, il n'offre cependant pas la flexibilité pour réaliser l'effet visuel "wahou" que je cherche ni la simplicité. + +J'ai bien évidement trouvé la pépite, c'est pour ça que je fait cette note 😜. +Voici donc comment prendre en main [DIAGRAMS](https://diagrams.mingrammer.com/) de Mingrammer. + +# Fonctionnement de Diagrams ⚙️ + + +Le principe d'utilisation est au plus efficace, le schéma est sous forme d'un fichier Python (.py) : + +```python +from diagrams import Diagram +from diagrams.aws.compute import EC2 + +with Diagram("Simple Diagram"): + EC2("web") +``` +Il permet de générer le rendu d'une simple commande : + +```bash +python3 diagram.py +``` + +Et paf, nous voici avec une image ! + +Voici un exemple un peu plus complexe : + +![Diagrams](../../assets/dac.jpg) + + +# Installation 🔧 + +En utilisant son gestionnaire de paquet préféré pour déployer Python, Pip, Graphiz et Inkscape (sera utile pour la suite), par exemple sur une base RHEL : + +```bash +dnf install python3 python3-pip graphviz inkscape +pip3 install diagrams +``` + +Terminé, aller bisous à la famille, n'oublie pas de nourrir le chien, ciao. J'aime bien ça moi, quand ça ne réclame pas la mise en place d'une usine à gaz ✌️ + +Il est possible de l'installer sur d'autres OS comme Windows et MacOS si besoin. + +Pour son utilisation avancée, l'outil est très bien documenté et vous fournit pas mal d'exemple et surtout un guide pour vous expliquer les 3 grands principes, qu'il faut interpréter sur votre schéma ainsi : + +- Nodes : Enssemble de ressources importés +- Clusters : Groupe d'éléments +- Edges : Les liaisons entre les éléments + +Ce qui est pratique avec les Nodes, c'est qu'ils sont basé sur des technologies existantes populaires (AWS, Azure, etc ...) pour un joli rendu immédiat. + +➡️ [consulter la documentation](https://diagrams.mingrammer.com/docs/getting-started/installation). + +# Utilisation de ses propres icones 😍 + +Voici le point le plus intéressant, utiliser ses propres icônes pour un maximum de flexibilité avec le Node **Custom**. + +Si vous êtes à la recherche d'un pack d'icônes SVG pour réaliser un schéma réseau, vous pouvez tous simplement récupérer ceux de Microsoft Azure qui sont très cool en clonant simplement ce dépôt : + +```bash +git clone https://github.com/benc-uk/icon-collection.git +``` + +Grâce à Inkscape, vous pouvez convertir les images directement dans une taille et format exploitable pour Diagrams pour un rendu de qualité, par exemple : + +```bash +inkscape -w 1024 -h 1024 icon-collection/azure-patterns/server.svg -o icons/server.png +``` + +Maintenant, que nos icônes sont prêtes et stockés dans un dossier ("icons" dans mon cas), il ne reste plus qu'à invoquer tout ça dans son script. + +# Mise en application 👷 + +Voici maintenant comment initier un script Python avec icônes personnalisées (et ma configuration maison en bonus) : + +```bash +# Importation des dépendances +from diagrams import Diagram, Cluster, Edge +from diagrams.custom import Custom +from datetime import datetime +today = datetime.today() + +# Ici la configuration : +# Le titre du schéma avec la date de génération, +# le nom de fichier de sortie avec les formats à générer, +# la direction d'affichage +# https://www.graphviz.org/documentation +with Diagram("Mon schéma - %s" % today.strftime('%d/%m/%Y %H:%M') , show=False, filename="schema", outformat=["png", "jpg", "svg", "pdf", "dot"], direction="TB"): + + # Icones personalisés + internet = Custom("Serveur", "icons/server.png") + + # Groupes + with Cluster("Zone LAN \n VLAN 1 \n DHCP : 192.168.1.1-99"): + HOME = Custom("192.168.1.0/24", "icons/server.png") + + with Cluster("Zone DMZ \n VLAN 100 \n DHCP : 192.168.100.1-99"): + DMZ = Custom("192.168.100.0/24", "icons/server.png") + + # Liens + internet >> Edge(color="red", label="FTTH", style="bold") >> DMZ +``` + +Voici pour le concret, je vous invite à voir le schéma complet que je partage de mon propre réseau domestique à l'adresse https://network.heuzef.com + +Le script Python de ce schéma est disponible au téléchargement sur cette page pour vous aider à apprivoiser l'outil. + +*[DaC]: Diagrams as Code diff --git a/content/assets/dac.jpg b/content/assets/dac.jpg new file mode 100644 index 0000000000000000000000000000000000000000..813a4775762c4182b9f8fc758fa64a606b543f9e GIT binary patch literal 57086 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�&qil4o@ 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 Xhwt7jeD9{>N4xLefc?g+j{|=Ptns`* literal 0 HcmV?d00001 diff --git a/content/assets/diagrams.png b/content/assets/diagrams.png new file mode 100644 index 0000000000000000000000000000000000000000..32b5a87f5f52f8c23747a03da5f8b143ce3044e8 GIT binary patch literal 4544 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 literal 0 HcmV?d00001