Oct 09 2021

Toutes les Icônes Disponibles du Diagram as Code

Publié par sous Python

Le Diagram as Code de Mingrammer permet de réaliser de très beaux diagrammes tout en offrant de nombreuses icônes. C’est juste frustrant de devoir aller dans chaque sous-répertoire pour chercher toutes les icônes disponibles. J’ai ainsi décidé d’écrire un bout de code qui importe les classes des sous-modules du package Diagram as Code.
J’ai ensuite rassemblé les sous-modules de chaque groupe dans un cluster – qui s’affichent dans la partie bleue – et les classes en vert. Une classe correspond à une icône spécifique.

Vous trouverez sur cette image toutes les icônes disponibles pour vos diagrammes as code. Cliquez pour agrandir l’image dans une meilleure résolution. Vous pouvez l’enregistrer d’un simple clic droit.

Diagram as code toutes les icones


Voici le code source qui génère l’image ci-dessus que vous pouvez adapter à vos besoins pour obtenir toutes les dernières icônes. Peut-être voulez-vous afficher les icônes d’un groupe particulier ou générer des images séparées pour chacun d’entre eux.

J’ai dû lier les icônes entre elles pour qu’elles s’affichent horizontalement plutôt que sur une colonne simple infinie. C’est ce que fait la fonction récursive display_icons. Pour une raison qui m’échappe, la récursivité fonctionne en supprimant le dernier élément, mais pas le premier.

#!/usr/bin/env python3
 
import importlib
import pkgutil
import sys, inspect
 
import diagrams
from diagrams import Cluster, Diagram, Edge
 
def get_modules(module):
   path_list = []
   spec_list = []
   for importer, modname, ispkg in pkgutil.walk_packages(module.__path__):
      import_path = f"{module.__name__}.{modname}"
      if ispkg:
         spec = pkgutil._get_spec(importer, modname)
         importlib._bootstrap._load(spec)
         spec_list.append(spec)
      else:
         path_list.append(import_path)
   return path_list
 
def get_classes(module):
   class_list = []
   for name, obj in inspect.getmembers(module,inspect.isclass):
      if not name.startswith('_'):
         class_list.append([name,obj]) 
   return class_list
 
def add_module_to_provider_list(providers, module):
   # eg diagrams.azure.database
   # add "database" to array linked to key "azure"
   (diagram,provider,pclass) = module.split('.')
   if provider not in providers:
      providers[provider] = [pclass]
   else:
      providers[provider].append(pclass)
 
def get_provider_list(providers):
   return providers.keys()
 
def get_provider_classes(providers, provider):
   return providers[provider]
 
def display_icons(class_list):
   if len(class_list) < 1: return
   if len(class_list) == 1: return class_list[0][1](class_list[0][0])
   length = len(class_list)
   return display_icons(class_list[:-1]) - class_list[length-1][1](class_list[length-1][0])
 
if __name__ == "__main__":
   providers = {}
   modules = get_modules(diagrams)
 
   for module in modules:
      # Module exception
      # /usr/local/lib/python3.8/site-packages/diagrams/oci/database.py
      # NameError: name 'AutonomousDatabase' is not defined
      if module not in ['diagrams.oci.database']:
         add_module_to_provider_list(providers, module)
 
   with Diagram("all_Icons", show="False", outformat="png"):
      for provider in get_provider_list(providers):
         with Cluster(provider):
            for pclassname in get_provider_classes(providers, provider):
               with Cluster(pclassname):
                  classes = get_classes(importlib.import_module('diagrams.'+provider+'.'+pclassname))
                  display_classes(classes)
 

Aucune Réponse

Août 05 2021

Comment Remplacer la LiveBox Orange Fibre par un Cisco ASA

Publié par sous Cisco,Réseau

Vous souhaitez ajouter un firewall Cisco ASA (ou autre) derrière votre routeur Orange afin de filtrer le trafic ou monter des VPN? Est-ce vraiment utile de conserver la box dans ce cas?
La Livebox ne sert plus qu’à s’authentifier sur le réseau Orange, ce qui peut être fait sur le Cisco. De plus, elle introduit un SPF – Single Point of Failure – supplémentaire sur votre réseau. Autant s’en débarrasser complètement!

Livebox Cisco ASA


VLAN sur l’Interface Externe du Cisco

Orange connecte sa box à la fibre grâce à un adaptateur, la LiveBox n’a donc que des interfaces ethernet, tout comme le firewall.
En ce qui concerne la configuration, Orange fait passer 2 types de trafic – Internet et la téléphonie sur IP – sur des vlans dédiés:
– 835 pour la data
– 851 pour la téléphonie

Le réseau interne est sur le vlan 10 dans mon cas puisque j’ai plusieurs sous-réseaux, on aurait pu le laisser sur l’interface physique évidemment.
Il suffit donc d’ajouter le vlan 835 à l’interface externe comme ceci:

!
interface GigabitEthernet1/1
nameif outside
security-level 0
no ip address
!
interface GigabitEthernet1/1.835
vlan 835
nameif Internet
security-level 0
pppoe client vpdn group cpte_orange
ip address pppoe setroute
!
interface GigabitEthernet1/3
nameif local
security-level 100
no ip address
!
interface GigabitEthernet1/3.10
description reseau LOCAL
vlan 10
nameif vlan10
security-level 100
ip address 172.16.10.1 255.255.255.0
!


Authentification PPPoE

L’authentification se fait toujours avec le protocol PPPoE, héritage des modems/routeurs ADSL. Elle se configure plus bas en ajoutant les identifiants fournis par Orange.
L’adresse IP est ensuite obtenue par DHCP tout simplement.

vpdn group cpte_orange request dialout pppoe
vpdn group cpte_orange localname fti/abcdefg
vpdn group cpte_orange ppp authentication chap
vpdn username fti/abcdefg password *****
dhcp-client client-id interface outside
dhcpd dns 8.8.8.8
dhcpd lease 3000
dhcpd auto_config outside
!


Accès à Internet par NAT

A ce stade, le firewall a obtenu une adresse IP et peut communiquer avec l’extérieur.
Il ne reste plus qu’à donner accès à Internet au matériel situé sur le réseau interne via un NAT. J’ai ajouté quelques règles autorisant le ping, non permis sur les Cisco ASA par défaut. Vous avez maintenant remplacé votre Livebox Orange par un firewall Cisco ASA.

access-list outside_access_in extended permit ip any object lan10
access-list outside_access_in extended permit icmp any any echo-reply
access-list outside_access_in remark ICMP type 11 for Windows Traceroute
access-list outside_access_in extended permit icmp any any time-exceeded
access-list outside_access_in remark ICMP type 3 for Cisco and Linux
access-list outside_access_in extended permit icmp any any unreachable
nat (vlan10,outside) source dynamic lan10 interface
access-group outside_access_in in interface outside
 

Aucune Réponse

Juil 19 2021

Comment Accéder à l’Interface Web ProxySQL sur Kubernetes

Publié par sous Docker,Kubernetes,Mysql

J’ai présenté dans un article précédent le chart Helm ProxySQL dans lequel j’expliquais comment configurer le pod à partir de requêtes SQL. Le chart inclus un ingress pour atteindre le serveur de stats sur le port 6080. Voici quelques détails pour le rendre fonctionnel.


L’ingress doit être activé dans le fichier Values et le serveur web ProxySQL demande aussi que la variable admin admin-web_enabled soit paramétrée.

ingress:
  enabled: true
  annotations:
    kubernetes.io/ingress.class: nginx
  hosts:
    - host: proxy.domaine.lan
      paths:
        - /

sqlqueries: |
  SET admin-web_enabled='true';
  LOAD ADMIN VARIABLES TO RUNTIME;
  -- autres requetes


Si vous le laissez tel quel, les connexions HTTP à l’interface web retourneront l’erreur suivante:
Error: received handshake message out of context
L’interface web ProxySQL n’accepte que les connexions HTTPS – même si les exemples fournis dans la documentation utilisent le HTTP – et il n’y a pas d’alternative.


L’ingress doit se connecter au backend avec le protocole HTTPS. Nginx permet de spécifier le protocole utilisé avec l’annotation backend-protocol. Vous avez toujours le choix de laisser l’accès à l’ingress depuis l’extérieur en HTTP, mais ne le faites pas sur une interface publique.

nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"
 

Aucune Réponse

Juil 15 2021

Chart Helm ProxySQL ⎈ Charger les Requêtes SQL au Démarrage

Publié par sous Docker,Kubernetes,Mysql

ProxySQL est un outil puissant qui relaye le trafic à des backends Mysql multiples. La configuration est lue dans proxysql.cnf qui est chargé au démarrage du démon. Ce qui est parfait d’un point de vue Docker. Vous pouvez modifier le fichier et relancer avec les nouveaux paramètres. A présent, j’ai besoin d’un chart Hell ProxySQL pour déployer sur mon cluster Kubernetes.


Chart Helm ProxySQL Officiel

J’ai essayé d’utiliser le chart Helm de l’équipe ProxySQL mais ai vite rencontré quelques problèmes.
L’image sur docker hub n’a pas été mise à jour depuis quelques temps. Le chart Helm ne semble plus être maintenue non plus alors qu’ils avaient fait un travail fantastique.

La configuration est lue dans proxysql.cnf. Il serait intéressant de la charger depuis Values.yaml, pour la rendre dynamique à chaque déploiement.
J’utilise principalement les règles mysql_query_rules_fast_routing mais voici le souci: Elles ne peuvent pas être configurées dans proxysql.cnf et les développeurs de ProxySQL ont clairement dit que ce n’était pas au programme.


Image Docker avec le Client Mysql

Le docker ProxySQL ne contient pas le client Mysql probablement pour garder l’image plus petite. Vous en aurez besoin pour injecter les requêtes SQL localement quand le pod démarre. Le dockerfile est très simple mais vous oblige à maintenir votre propre image.

FROM proxysql/proxysql:2.2.0

RUN apt update && apt -y install mysql-client && apt clean all

ENTRYPOINT ["proxysql", "-f", "-D", "/var/lib/proxysql"]


J’ai fait une image accessible directement sur Dockerhub. Elle est référencée dans le chart helm mais vous pouvez builder la votre si vous souhaitez la stocker sur un dépôt privé.


Les Règles mysql_query_rules_fast_routing

J’ai décidé d’apporter quelques changements au template Helm pour qu’il puisse lire les règles SQL depuis le fichier Values, et les injecter dans ProxySQL dynamiquement une fois le pod démarré.

sqlqueries: |
   --
   SET mysql-have_ssl='true';
   LOAD MYSQL VARIABLES TO RUNTIME;
   SET admin-web_enabled='true';
   LOAD ADMIN VARIABLES TO RUNTIME;
   --
   INSERT INTO mysql_servers (hostgroup_id,hostname) VALUES (0,'db1.domain.lan');
   INSERT INTO mysql_servers (hostgroup_id,hostname) VALUES (1,'db2.domain.lan');
   --
   INSERT INTO mysql_users (username,password,use_ssl,default_hostgroup) VALUES ('proxy','*9EF51D21B4A3E7BC7A58925308F229CF4AEEC9E1',1,0);
   --
   INSERT INTO mysql_query_rules_fast_routing (username,schemaname,destination_hostgroup, comment) VALUES ('proxy','schema1',0,'');
   INSERT INTO mysql_query_rules_fast_routing (username,schemaname,destination_hostgroup, comment) VALUES ('proxy','schema2',1,'');
   --
   LOAD MYSQL USERS TO RUNTIME;
   LOAD MYSQL SERVERS TO RUNTIME;
   LOAD MYSQL QUERY RULES TO RUNTIME;


Les requêtes SQL sont ajoutées au fichier Values.yaml, chargées dans la configmap et montées en tant que fichier dans /docker-entrypoint-initdb.d/sqlqueries. Nous pouvons ensuite les injecter une fois que le démon est lancé. C’est possible grâce à la commande poststart qui est lancée juste après que la commande de l’entrypoint du docker a été exécutée.

lifecycle:
   postStart:
     exec:
       command: ["/bin/sh", "-c", "sleep 1 && mysql --show-warnings -uadmin -padmin -h127.0.0.1 -P{{ .Values.pod.adminPort }} < /docker-entrypoint-initdb.d/sqlqueries"]


Utiliser le Chart Helm

Le chart helm est disponible sur github. Clonez le repo, créez votre propre fichier Values en vous basant sur example.yaml et déployez le chart Helm.

helm install -n my-release -f myconf.yaml ./proxysql


Lisez cet article si vous souhaitez activer et accéder au serveur de stats ProxySQL.


Importer son Propre Cert Autosigné

Proxysql 2.3.0 est maintenant capable de recharger le certificat SSL/TLS certificate à la volée.
Avant ça, vous auriez dû builder le conteneur proxysql pour embraquer les certificats CA et Mysql, le rendant statique de fait.
Avec cette nouvelle fonctionnalité, vous avez juste à créer un secret TLS Kubernetes comprenant le ca.crt, tls.cert et key.crt qui seront montés par le chart Helm ProxySQL.

Décommentez la série de commandes correspondante qui remplaceront les certificats auto-générés ProxySQL grâce à l’instruction SYSTEM de Mysql.

 

Aucune Réponse

Juin 12 2021

Retour d’Expérience sur les Cisco Small Business vs Cisco

Publié par sous Cisco

J’ai demandé à mon revendeur un devis pour des switches Cisco Catalyst comme j’en ai l’habitude, et il me dit que la plupart de ses clients achètent des switches Cisco Small Business. Il prétend qu’ils sont beaucoup moins chers, ont des performances et fonctionnalités similaires. En cherchant sur les forums, je n’ai pas trouvé de réponse concrète hormis de vagues affirmations comme ce n’est pas un vrai IOS ou alors que ce ne sont que des switches d’entrée de gamme. J’ai donc décidé de m’en procurer quelques-uns et de les installer sur des sites distants avec moins de trafic pour un test longue durée.


Les Cisco Small Business ont l’air sympa …

Le prix est environ 4 fois moins cher que celui des Cisco Catalysts et ils offrent une garantie à vie (du moins jusqu’à la dernière date de support). Cela équivaut à 3 switches de remplacement tout de même…

Je ne parlerai pas performance, Ils se valent à peu près tous.

Avant de validrr la commande, je m’assure de quelques points essentiels:
J’ai besoin d’une CLI, c’est pratique pour se connecter via des liens instables, ou pour copier/coller des lignes de configuration. Comme mentionné ci-dessus, ce n’est pas IOS puisque c’est un produit différent.
HTTP(s), telnet et l’accès SSH sont fournis. Notez que contrairement aux Cisco Catalysts, les switches Cisco Small business n’acceptent qu’une seule clé SSH.

Toutes les fonctionnalités de base comme les VLANs (jusqu’à 256, regardez la datasheet), le mirroring de port, le protocole SNMP sont aussi disponibles.


Même s’ils n’offrent pas les mêmes prestations que les Cisco Catalyst

L’authentification parr clé SSH n’était pas disponible mais elle l’est maintenant. Il semble qu’on ne puisse en configurer qu’une seule parr contre.

Lorsqu’on veut passer un port du mode access au mode trunk, on ne peut pas paramétrer le trunk avant de changer le mode. C’est particulièrement ennuyeux si vous configurez un switch distant via ce lien.

J’ai noté qu’il y avait beaucoup moins de commandes et de niveaux de debug mais c’était attendu.

J’ai constaté un bug et seulement un sur une période de 2 ans. Les interfaces affichaient beaucoup de paquets en error.
Cela s’est résolu par une mise à jour du firmware. J’ai constaté qu’il y avait très peu de firmware disponibles surr la page de téléchargement.
Est-ce que je devrais m’en inquiéter? Pas nécessairement.
Les Cisco Small Business ont moins de fonctionnalités, et donc pas de bug sur celles qu’ils n’implémentent pas.
Cela peut aussi vouloir dire moins de réactivité sur la résolution des bugs existants, mais on en a toujours pour son argent, n’est-ce pas?


Et donc?

Les Cisco Small Business sont vraiment une bonne alternative peu onéreuse aux Cisco Catalyst pour l’accès au réseau, et se sont avérés fiables sur la durée et meilleurs que bien d’autres switches vendus sur le marché. Tout dépend des fonctionnalités dont vous avez besoin, comme les fonctions de QoS avancées, ou si vous voulez les empiler par exemple. J’ai fini par adopter un mix en gardant les Catalysts sur les sites principaux et les Cisco Small Business pour les sites distants plus petits équipés de bornes wifi PoE. Le prix est vraiment attractif surtout si vous avez des bornes qui fonctionnent en Power over Ethernet (PoE).

Une solution intermédiaire existe aussi: les Cisco Catalysts avec l’image LAN Lite. Ils sont moitié prix des Cisco Catalysts avec le LAN Base mais ont des restrictions sur la QoS, les ACL, ou le nombre de VLANs entre autres. C’est le même hardware avec IOS mais il faut savoir qu’on ne peut pas convertir un LAN Lite en LAN Base. Dommage

 

Aucune Réponse

« Précédent - Suivant »