Heuzef - Les notes excentriques d'un bidouilleur.
Nevar pievienot vairāk kā 25 tēmas Tēmai ir jāsākas ar burtu vai ciparu, tā var saturēt domu zīmes ('-') un var būt līdz 35 simboliem gara.

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. Title: Générer ses diagrammes avec Python
  2. Category: Informatique
  3. Tags: python, autohébergement, web, diagramme
  4. Date: 2023-08-23
  5. Status: published
  6. Dans cet article, nous allons nous initier au DaC afin de réaliser de magnifiques schémas en Python.
  7. 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.
  8. ![Diagrams](../../assets/diagrams.png)
  9. # Pourquoi utiliser du DaC ? 🤔
  10. 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.
  11. 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.
  12. 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.
  13. # Recherche d'outil 🔍
  14. 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é.
  15. J'ai bien évidement trouvé la pépite, c'est pour ça que je fait cette note 😜.
  16. Voici donc comment prendre en main [DIAGRAMS](https://diagrams.mingrammer.com/) de Mingrammer.
  17. # Fonctionnement de Diagrams ⚙️
  18. Le principe d'utilisation est au plus efficace, le schéma est sous forme d'un fichier Python (.py) :
  19. ```python
  20. from diagrams import Diagram
  21. from diagrams.aws.compute import EC2
  22. with Diagram("Simple Diagram"):
  23. EC2("web")
  24. ```
  25. Il permet de générer le rendu d'une simple commande :
  26. ```bash
  27. python3 diagram.py
  28. ```
  29. Et paf, nous voici avec une image !
  30. Voici un exemple un peu plus complexe :
  31. ![Diagrams](../../assets/dac.jpg)
  32. # Installation 🔧
  33. 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 :
  34. ```bash
  35. dnf install python3 python3-pip graphviz inkscape
  36. pip3 install diagrams
  37. ```
  38. 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 ✌️
  39. Il est possible de l'installer sur d'autres OS comme Windows et MacOS si besoin.
  40. 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 :
  41. - Nodes : Enssemble de ressources importés
  42. - Clusters : Groupe d'éléments
  43. - Edges : Les liaisons entre les éléments
  44. 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.
  45. ➡️ [consulter la documentation](https://diagrams.mingrammer.com/docs/getting-started/installation).
  46. # Utilisation de ses propres icones 😍
  47. Voici le point le plus intéressant, utiliser ses propres icônes pour un maximum de flexibilité avec le Node **Custom**.
  48. 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 :
  49. ```bash
  50. git clone https://github.com/benc-uk/icon-collection.git
  51. ```
  52. Grâce à Inkscape, vous pouvez convertir les images directement dans une taille et format exploitable pour Diagrams pour un rendu de qualité, par exemple :
  53. ```bash
  54. inkscape -w 1024 -h 1024 icon-collection/azure-patterns/server.svg -o icons/server.png
  55. ```
  56. 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.
  57. # Mise en application 👷
  58. Voici maintenant comment initier un script Python avec icônes personnalisées (et ma configuration maison en bonus) :
  59. ```bash
  60. # Importation des dépendances
  61. from diagrams import Diagram, Cluster, Edge
  62. from diagrams.custom import Custom
  63. from datetime import datetime
  64. today = datetime.today()
  65. # Ici la configuration :
  66. # Le titre du schéma avec la date de génération,
  67. # le nom de fichier de sortie avec les formats à générer,
  68. # la direction d'affichage
  69. # https://www.graphviz.org/documentation
  70. 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"):
  71. # Icones personalisés
  72. internet = Custom("Serveur", "icons/server.png")
  73. # Groupes
  74. with Cluster("Zone LAN \n VLAN 1 \n DHCP : 192.168.1.1-99"):
  75. HOME = Custom("192.168.1.0/24", "icons/server.png")
  76. with Cluster("Zone DMZ \n VLAN 100 \n DHCP : 192.168.100.1-99"):
  77. DMZ = Custom("192.168.100.0/24", "icons/server.png")
  78. # Liens
  79. internet >> Edge(color="red", label="FTTH", style="bold") >> DMZ
  80. ```
  81. 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
  82. Le script Python de ce schéma est disponible au téléchargement sur cette page pour vous aider à apprivoiser l'outil.
  83. *[DaC]: Diagrams as Code