Appliance Automation v2.0

Appliance Automation v2.0

Dernière modification le 11 janvier 2020

Les étapes alpha et bêta sont terminées, mon Appliance Automation v2.0 est finie. Le brevet prévoyait déjà une fragmentation de la solution. Dans la version v1.0, ce sont les fonctions qui étaient fragmentées, mais la solution matérielle reposait sur un serveur unique. Dans la version v2.0, la partie matérielle a été répartie sur plusieurs serveurs, ce qui rend la solution facilement évolutive par ajout de modules.

Appliance Automation v2.0
Appliance Automation v2.0
Continuer la lecture de « Appliance Automation v2.0 »

Tables and Views

Librairie Juniper PyEZ - Tables and Views

Dernière modification le 11 janvier 2020

Pour des constructeurs du monde de l’automatisation, accéder aux informations de configurations est souvent synonyme d’analyser les chaînes de caractères retournées pour les formater à l’affichage et y chercher des éléments ciblés. Par exemple, le module Python TextFSM a été mis au point pour permettre l’accès par programme aux informations renvoyées par l’interface de ligne de commande (CLI) des équipements réseau.

Dans le cas de Juniper Networks, Junos possède un ensemble complet d’API : API XML (accessible localement ou à distance en utilisant le protocole sécurisé NETCONF), API REST et API JET. Il existe donc plusieurs façons d’accéder avec certitude et de façon structurée aux éléments souhaités.

Les processus les plus importants pour l’automatisation de Junos sont les processus de service mgd et JET (jsd). Mgd gère les demandes d’automatisation impliquant l’API XML de Junos, YANG, l’API REST et certaines fonctions SNMP. Le processus de service JET (jsd) gère les demandes d’automatisation qui utilisent l’API JET (Juniper Extension Toolkit). Le processus de gestion (mgd) est au cœur de toute automatisation Junos basée sur NECTONF. L’interface de ligne de commande de Junos est également gérée par le biais de mgd.

Continuer la lecture de « Tables and Views »

Appliance EVE-NG v2.0

Appliance EVE-NG

Dernière modification le 11 janvier 2020

La version 2.0 de mon appliance EVE-NG reprend le même serveur bare metal pour faire tourner EVE-NG, mais rajoute un étage sur la base d’un autre serveur, fabriqué à partir du concept de ma nouvelle « Appliance Automation », proposant une fonction DHCP pour distribuer des adresses IP aux personnes utilisant l’appliance via une connexion filaire ou Wi-Fi 5 (vitesse 1,3 Gbps en 5 GHz avec un canal de 80 MHz).

Lab Eve-NG Juniper vQFX Light
Simulateur EVE-NG
Continuer la lecture de « Appliance EVE-NG v2.0 »

Générateur de trafic

Générateur de Trafic TRex, WARP17 et Ostinato

Dernière modification le 10 août 2021

Au début des années 2010, je cherchai une solution pour construire un générateur de trafic Ethernet à haut débit pour des tailles de paquets de 64 octets et le moins cher possible afin de mettre en œuvre le RFC2544. Après de nombreuses approches et de nombreux développements qui n’ont abouti à rien de significatif, c’est en 2014 que la question du générateur de trafic pour tester les matériels en maquette est devenue cruciale. La référence dans ce domaine était Ixia, mais ceux qui connaissent les prix comprennent que ce n’était pas une solution accessible à tout le monde. Dans le domaine commercial, un de ses concurrents intéressant et dont j’ai suivi la progression était Xena. L’avantage de ces solutions n’était pas tant la puissance des générateurs mais le niveau d’intégration et de finition de la couche logicielle qui permettait de lancer facilement des tests conformes aux standards.

Continuer la lecture de « Générateur de trafic »

Simulateurs réseau

Simulateurs réseau EVE-NG, GNS3 et Vagrant

Dernière modification le 11 janvier 2020

L’époque des matériels actifs de spare utilisés pour faire un incubateur servant à simuler un réseau est totalement révolue pour tous les constructeurs leaders du domaine de l’automatisation. Les simulateurs réseau permettent de réaliser virtuellement un réseau.

Il ne faut pas confondre un simulateur et un émulateur. Un simulateur permet de faire tourner une version virtuelle d’un matériel actif (commutateur, routeur, firewall, …) grâce à la virtualization, alors qu’un émulateur reproduit un comportement sans pour autant avoir des versions virtuelles des appareils. Pour illustrer ces propos avec deux exemples très connus, GNS3 est un simulateur alors que Packet Tracer est un émulateur.

Une question fréquente consiste à se demander quel est le meilleur simulateur… Je pense qu’il n’y a pas de réponse valide à cette question. Tout dépend de l’usage qu’on est amené à en faire et au contexte dans lequel on l’utilise. Personnellement j’en utilise trois en fonction des objectifs.

Continuer la lecture de « Simulateurs réseau »

Netmiko pour OmniSwitch

Alcatel-Lucent Enterprise

Dernière modification le 23 mars 2020

En 2016 j’ai écrit le module alcatel_aos pour Netmiko. Depuis, ce module Python fonctionne pour AOS6 et AOS8 et il est maintenu par Kirk Byers lorsque des changements majeurs sont effectués sur la librairie Netmiko.

Lorsqu’il s’agit de faire appel à Netmiko pour réaliser de l’automatisation sur OmniSwitch ALE, j’y adjoins le framework d’automatisation Nornir écrit en Python.

Fichier de configuration Nornir :

---
core:
    num_workers: 100
inventory:
    plugin: nornir.plugins.inventory.simple.SimpleInventory
    options:
        host_file: 'inventory/hosts.yaml'
        group_file: 'inventory/groups.yaml'
        defaults_file: 'inventory/defaults.yaml'
Continuer la lecture de « Netmiko pour OmniSwitch »

Docker

Conteneurisation Docker

Dernière modification le 11 janvier 2020

Docker est un système de gestion de conteneurs incontournable dans le domaine du NetDevOps. La notion de conteneur est utilisée pour faire tourner une application de manière isolée et légère sur l’hôte sur lequel Docker est installé. L’accès aux services internes au conteneur se fait par une redirection de ports sur l’hôte qui fait tourner Docker.

La première préoccupation qui apparaît, avec la notion de conteneur, est la persistance des données. En effet, lorsque le conteneur est détruit, les données sont détruites avec lui. Si ce comportement peut être voulu pour repartir facilement d’une base vierge, il est des cas dans lesquels on veut garder l’historique des données. Pour palier à cela, il est facile d’utiliser la notion de volume, en les stockant dans un répertoire spécifique du serveur hôte Docker plutôt que dans le système de fichiers par défaut du conteneur. Ce stockage externe, appelé volume de données, permet de rendre les données indépendantes de la vie du conteneur, soit en le créant de toute pièce, soit en faisant une correspondance entre un répertoire source existant sur l’hôte et le répertoire destination dans le conteneur. Le volume permet également de partager ces données entre plusieurs conteneurs sur un même hôte.

Continuer la lecture de « Docker »

JSNAPy

Librairie Python Juniper JSNAPy

Dernière modification le 19 août 2019

JSNAPy est un outil Open Source mis à disposition par Juniper. Il permet de valider la configuration d’un équipement et de comparer l’état d’une configuration avant et après une modification.

Architecture de la librairie Juniper JSNAPy

L’action peut être réalisée sur la configuration actuelle (snapcheck) ou sur le couple de configurations « avant et après » (PRE et POST).

Cet outil possède sa propre interface CLI pour être utilisé de façon autonome. Il est également possible de faire fonctionner JSNAPy à partir du modules Ansible galaxy juniper_junos_jsnapy ou directement à partir de scripts Python.

jsnapy --snapcheck postinstall -f start-2-1.yml
hosts:
  - device: localhost
    username: root
    passwd: Juniper
    port: 2222
tests:
  - test_interfaces.yml
tests_include:
  - test_interfaces_terse

test_interfaces_terse:
  - rpc: get-interface-information
  - item:
      id: ./name
      xpath: //physical-interface[normalize-space(name) = "em0"]
      tests:
        - is-equal: oper-status, up
          info: "Test Succeeded! oper-status is {{pre['oper-status']}} for interface {{id_0}}"
          err: "Test Failed! oper-status is {{post['oper-status']}} for interface {{id_0}}"
#!/usr/bin/env python3

import sys
from jnpr.jsnapy import SnapAdmin
from jnpr.junos import Device
from jnpr.junos.exception import ConnectError

# Variable for the Call to SnapAdmin
js = SnapAdmin()

# Config file to load
config_file = "start-2-1.yml"

# Call jsnapy With the Defined Configuration File
try:
  snapchk = js.snapcheck(config_file, "snap")
except ConnectError as err:
  print (
    'Cannot connect to device: {0}'
    .format(err)
  )
  sys.exit(1)
except Exception as err:
  print (err)
  sys.exit(1)
# Print results
for val in snapchk:
  print ('Tested on: {0}'.format(val.device))
  print (
    'Message: {0}'
    .format(
      val.test_details['get-interface-information'][0]['passed'][0]['message']
    )
  )
  print ('Final result: {0}'.format(val.result))
  print ('Total passed: {0}'.format(val.no_passed))
  print ('Total failed: {0}'.format(val.no_failed))
jsnapy --snap pre -f start-2-2.yml
jsnapy --snap post -f start-2-2.yml
jsnapy --check pre post -f start-2-2.yml
hosts:
  - device: localhost
    username: root
    passwd: Juniper
    port: 2222
tests:
  - test_no_diff.yml
tests_include:
  - test_interfaces_terse

test_interfaces_terse:
  - rpc: get-interface-information
  - iterate:
      xpath: //physical-interface
      id: './name'
      tests:
        - no-diff: description
          err: "Test Failed! description for <{{id_0}}> got changed, before it was <{{pre['description']}}>, now it is <{{post['description']}}>"
          info: "Test succeeded! description for <{{id_0}}> did not change, before it was <{{pre['description']}}>, now it is <{{post['description']}}>"

J’ai demandé une amélioration car le nom des fichiers snapshots est constitué avec l’adresse IP mais pas avec le port, et il n’est pas possible de changer le nom du fichier depuis un playbook Ansible utilisant juniper_junos_jsnappy. Lorsque JSNAPy est utilisé en environnement de simulation Vagrant, tous les devices ont la même adresse IP, ce n’est que le port qui les différencient. A suivre…

Télémétrie Juniper

Juniper Télémétrie

Dernière modification le 11 janvier 2020

Le modèle traditionnel de monitoring de réseau est basé sur un modèle dit « pull », utilisant SNMP et CLI pour interroger périodiquement les équipements du réseau. Ces méthodes ont des limites inhérentes en matière d’évolutivité et sont gourmandes en ressources, en particulier lorsqu’un grand nombre de métriques sont interrogées à une fréquence très élevée.

JTI (Junos Telemetry Interface) contourne le problème et élimine le besoin de scrutation, en utilisant plutôt un modèle « push » pour transmettre les données de télémétrie à un collecteur de manière asynchrone sous forme de flux. Cette approche est beaucoup plus évolutive et prend en charge la surveillance de milliers d’objets dans un réseau avec une résolution granulaire.

Cependant, la collecte de données de télémétrie n’est pas une tâche aisée, car elle implique généralement trois types de fonctions :

Continuer la lecture de « Télémétrie Juniper »

Nornir, Junos et Click

Nornir Junos

Dernière modification le 11 janvier 2020

Même si Ansible est très bien pour faire du Human-driven Automation face à des équipements Juniper, je trouve gratifiant et plus pratique de développer directement en Python. Comme je l’ai déjà expliqué, j’utilise le protocole NETCONF simplifié par le micro framework PyEZ. Je me sers de PyEZ de façon transparente au travers de NAPALM, lui même piloté par le framework Nornir.

Lorsque l’on écrit des scripts, il peut rapidement y en avoir une grande quantité très proches les uns des autres et qui ne font, chacun, qu’une seule fonction.

C’est pour cette raison, que je rajoute le package Python Click qui permet de réaliser des interfaces CLI (Command-Line Interface) enrichie, de manière à limiter le nombre de scripts.

Prenons comme exemple un script dont l’objectif serait de faire des napalm_get et napalm_configure avec un CLI simplifié.

Continuer la lecture de « Nornir, Junos et Click »