Retour d’expérience sur Cisco pyATS et Genie Parser
Vincent Bernat
Cisco pyATS est un outil pour l’automatisation et le test du réseau. Il comprend, entre autres, un ensemble d’analyseurs et de modèles multi-vendeurs open-source, Genie Parser. Il dispose de 2700 analyseurs pour diverses commandes sur de nombreux systèmes. Sur le papier, cela semble être un excellent outil !
>>> from genie.conf.base import Device >>> device = Device("router", os="iosxr") >>> # Hack pour analyser le résultat d'une commande sans se connecter à l'équipement >>> device.custom.setdefault("abstraction", {})["order"] = ["os", "platform"] >>> cmd = "show route ipv4 unicast" >>> output = """ ... Tue Oct 29 21:29:10.924 UTC ... ... O 10.13.110.0/24 [110/2] via 10.12.110.1, 5d23h, GigabitEthernet0/0/0/0.110 ... """ >>> device.parse(cmd, output=output) {'vrf': {'default': {'address_family': {'ipv4': {'routes': {'10.13.110.0/24': {'route': '10.13.110.0/24', 'active': True, 'route_preference': 110, 'metric': 2, 'source_protocol': 'ospf', 'source_protocol_codes': 'O', 'next_hop': {'next_hop_list': {1: {'index': 1, 'next_hop': '10.12.110.1', 'outgoing_interface': 'GigabitEthernet0/0/0/0.110', 'updated': '5d23h'}}}}}}}}}}
Première déception : pyATS est sous licence propriétaire et les
sources ne sont pas disponibles. C’est assez ennuyeux si vous
rencontrez des problèmes en dehors de Genie Parser. Par exemple,
bien que pyATS utilise la commande ssh
, il ne peut pas exploiter
mon fichier ssh_config
: pyATS résout les noms d’hôtes avant de
les fournir à ssh
. Il n’est pas prévu de publier pyATS
sous licence libre. 🤨
Ensuite, Genie Parser a deux problèmes :
- Les modèles de données utilisés dépendent du vendeur et du système
d’exploitation,
alors que la documentation indique le contraire. Par exemple, le modèle de données utilisé pour les interfaces IPv4 est différent entre NX-OS et IOS XR. - Les analyseurs s’appuient sur des expressions régulières ligne par ligne pour extraire les données et sur une logique implémentée en Python. Tout cela est fragile et peut se briser silencieusement.
Pour illustrer le deuxième point, supposons que la sortie de la
commande show ipv4 vrf all interface
soit :
Loopback10 is Up, ipv4 protocol is Up Vrf is default (vrfid 0x60000000) Internet protocol processing disabled Loopback30 is Up, ipv4 protocol is Down [VRF in FWD reference] Vrf is ran (vrfid 0x0) Internet address is 203.0.113.17/32 MTU is 1500 (1500 is available to IP) Helper address is not set Directed broadcast forwarding is disabled Outgoing access list is not set Inbound common access list is not set, access list is not set Proxy ARP is disabled ICMP redirects are never sent ICMP unreachables are always sent ICMP mask replies are never sent Table Id is 0x0
Parce que l’expression régulière pour analyser un nom
d’interface ne
s’attend pas aux données supplémentaires après l’état de l’interface,
Genie Parser ignore la ligne qui commence la définition de
Loopback30
et analyse ainsi la sortie1 :
{ "Loopback10": { "int_status": "up", "oper_status": "up", "vrf": "ran", "vrf_id": "0x0", "ipv4": { "203.0.113.17/32": { "ip": "203.0.113.17", "prefix_length": "32" }, "mtu": 1500, "mtu_available": 1500, "broadcast_forwarding": "disabled", "proxy_arp": "disabled", "icmp_redirects": "never sent", "icmp_unreachables": "always sent", "icmp_replies": "never sent", "table_id": "0x0" } } }
Bien que ce défaut soit simple à corriger, il s’agit d’une bataille difficile. Toute variation existante ou future dans la sortie d’une commande peut déclencher un bogue similaire non détecté, malgré la bonne couverture de tests. J’ai signalé et corrigé plusieurs autres erreurs d’analyse « silencieuses » : #516, #529 et #530. Une alternative plus robuste aurait été d’utiliser TextFSM et de produire un avertissement lorsque certaines sorties ne sont pas reconnues, comme le fait Batfish, un outil d’analyse de configurations.
À l’avenir, nous pourrons nous appuyer sur YANG pour l’extraction de données, mais il n’est actuellement pas largement pris en charge par le parc actuel. SNMP reste une possibilité valable, mais de nombreuses informations ne sont pas accessibles via ce protocole. En attendant, je vous conseille de n’utiliser Genie Parser qu’avec une grande prudence.
-
À titre d’exercice, le lecteur est invité à écrire le code pour extraire l’IPv4 de cette structure. ↩︎