Le savoir n'a guère d'intérêt s'il n'est pas partagé.

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:

object network srv1
	host 10.10.10.1
    description test-srv1
object network srv2
	host 10.10.10.2
    description test-srv2
"sh run object network"

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"