Transformer une configuration Cisco en JSON/CSV (python + ttp) 🐱🏍
Le but de cet article est de vous démontrer comment transformer une configuration récupérée, en un format JSON ou autre d'ailleurs. 😊
Dans quel but me direz-vous, eh bien tout simplement, pour maintenir un inventaire à jour par exemple, pour récupérer une liste d'interface d'un switch et les énoncer dans un fichier Excel. 😁
Jusque là j'utilisais TextFSM de Google, qui fonctionne très bien mais qui n'est pas forcément très 'user-friendly' même si on peut très rapidement se débrouiller avec! 😎
L'avantage avec TTP c'est que le moteur de template utilisé, c'est Jinja2 comme pour Flask ou encore Ansible, un moteur dont une très grande majorité d'entres-vous est déjà familiée avec celui-ci. 🤷♂️
Avant toutes choses, vous devez installer la librairie, pour l'installer:
pip3 install ttp
Vous pouvez d'ailleurs suivre la documentation officielle ici. #RTFM
Pour cet exemple, on va partir d'une configuration d'un pare-feu Cisco ASA, tout ce qu'il y a de plus banale! Le but de la manœuvre va être de "templatiser" les objets réseau de celui-ci.
Voici la configuration à parser:
Maintenant qu'on a notre configuration, on va créer notre template:
object network {{network_object_name}}
host {{ip_address}}
description {{desc}}
Ensuite, il ne reste plus qu'à tester par le biais d'un petit script Python. 😎
#!/usr/bin/env python3
from ttp import ttp
# Stockage des données à parser
data_to_parse = """
object network srv1
host 10.10.10.1
description test-srv1
object network srv2
host 10.10.10.2
description test-srv2
"""
# Stockage du template
ttp_template = """
object network {{ network_object_name }}
host {{ ip_address }}
description {{ description }}
"""
if __name__ == '__main__':
# Création d'un objet nommé 'parser', instance de TTP
parser = ttp(data=data_to_parse, template=ttp_template)
parser.parse()
# Stockage du résultat au format JSON
results = parser.result(format='json')[0]
print(results)
Résultat 🧐:
[
[
{
"description": "test-srv1",
"ip_address": "10.10.10.1",
"network_object_name": "srv1"
},
{
"description": "test-srv2",
"ip_address": "10.10.10.2",
"network_object_name": "srv2"
}
]
]
Que c'est beauuuuu! 😉
C'est beau oui mais on peut même obtenir un résultat au format YAML ou encore CSV en modifiant le format comme ceci:
# Résultat au format CSV
results = parser.result(format='csv')[0]
# Résultat au format YAML
results = parser.result(format='yaml')[0]
Du coup, au format CSV on obtient:
"description","ip_address","network_object_name"
"test-srv1","10.10.10.1","srv1"
"test-srv2","10.10.10.2","srv2"