Lorsque je travaille sur un réseau, je fais parfois beaucoup de configurations de routeur en modifiant uniquement les valeurs telles que l'adresse IP aux mêmes paramètres.
Vous pouvez les copier et les coller un par un à la main, mais vous pouvez facilement insérer des valeurs en utilisant le moteur de modèle fourni dans le langage de programmation.
Ici, créons une configuration de routeur en utilisant un moteur de template appelé Jinja2 qui est souvent utilisé en Python.
Veuillez d'abord installer jinja2 comme étape de préparation.
pip install jinja2
Si vous n'avez jamais utilisé pip, veuillez installer pip en vous référant à cet article.
Les premiers packages à inclure dans Python setuptools et pip http://www.lifewithpython.com/2012/11/Python-package-setuptools-pip.html
Tout d'abord, essayez de créer une configuration sur une ligne (en fait une commande) appelée «show bgp summary | inc (numéro AS)». Si vous utilisez Jinja2, vous pouvez l'appeler ainsi.
easy_jinja2.py
#! /usr/bin/env python
# -*- coding: utf-8 -*-
from jinja2 import Template
template = Template( 'show bgp summary | inc {{ asn }}' )
output_str = template.render( asn='65001' )
print output_str
Une fois exécuté, ce qui suit sera affiché.
%python easy_jinja2.py
show bgp summary | inc 65001
Comme mentionné ci-dessus, Jinja2 reconnaît la chaîne de caractères incluse dans {{}} comme un nom de variable et peut incorporer la valeur réelle en utilisant la fonction de rendu.
En utilisant le moteur de modèle de cette manière, vous pouvez facilement créer un fichier texte avec des valeurs arbitraires incorporées.
Ensuite, créons une configuration avec quelques lignes supplémentaires. Pour incorporer une valeur dans une variable de type chaîne, écrivez-la à l'aide de la classe Environment.
easy_jinja2.py
#! /usr/bin/env python
# -*- coding: utf-8 -*-
from jinja2 import Template, Environment
input_str = '''
router bgp 65000
neighbor {{ ip4 }}
shutdown
router bgp 65000
neighbor {{ ip6 }}
shutdown
show bgp summary | inc {{ asn }}
'''
template = Environment().from_string(input_str)
output_str = template.render( ip4='10.1.1.1', ip6='2000::1:1', asn='65001' )
print output_str
Une fois exécuté, ce qui suit sera affiché.
% python easy_jinja2.py
router bgp 65000
neighbor 10.1.1.1
shutdown
router bgp 65000
neighbor 2000::1:1
shutdown
show bgp summary | inc 65001
Enfin, créons la configuration précédente en incorporant des valeurs telles que plusieurs adresses IP. Cependant, l'utilisation du moteur de modèle lui-même est la même qu'auparavant. Ici, le type de dictionnaire et l'instruction for sont utilisés pour insérer la valeur dans le moteur de modèle.
easy_jinja2.py
#! /usr/bin/env python
# -*- coding: utf-8 -*-
from jinja2 import Template, Environment
input_str = '''
router bgp 65000
neighbor {{ ip4 }}
shutdown
router bgp 65000
neighbor {{ ip6 }}
shutdown
'''
input_str_2 = 'show bgp summary | inc {{ asn }} '
neighbor_info= [
{
'ip4' : '10.1.1.1',
'ip6' : '2000::1:1',
'asn' : '65001',
},
{
'ip4' : '10.1.1.2',
'ip6' : '2000::1:2',
'asn' : '65002',
},
{
'ip4' : '10.1.1.3',
'ip6' : '2000::1:3',
'asn' : '65003',
},
{
'ip4' : '10.1.1.4',
'ip6' : '2000::1:4',
'asn' : '65004',
},
{
'ip4' : '10.1.1.5',
'ip6' : '2000::1:5',
'asn' : '65005',
},
]
template = Environment().from_string(input_str)
for neighbor in neighbor_info:
output_str = template.render( ip4=neighbor['ip4'] , ip6=neighbor['ip6'] )
print output_str
template = Environment().from_string(input_str_2)
for neighbor in neighbor_info:
output_str = template.render( asn=neighbor['asn'] )
print output_str
Le résultat de l'exécution est le suivant.
% python easy_jinja2.py
router bgp 65000
neighbor 10.1.1.1
shutdown
router bgp 65000
neighbor 2000::1:1
shutdown
router bgp 65000
neighbor 10.1.1.2
shutdown
router bgp 65000
neighbor 2000::1:2
shutdown
router bgp 65000
neighbor 10.1.1.3
shutdown
router bgp 65000
neighbor 2000::1:3
shutdown
router bgp 65000
neighbor 10.1.1.4
shutdown
router bgp 65000
neighbor 2000::1:4
shutdown
router bgp 65000
neighbor 10.1.1.5
shutdown
router bgp 65000
neighbor 2000::1:5
shutdown
show bgp summary | inc 65001
show bgp summary | inc 65002
show bgp summary | inc 65003
show bgp summary | inc 65004
show bgp summary | inc 65005
Comme mentionné ci-dessus, vous pouvez facilement créer une configuration similaire tout en modifiant la valeur à l'aide du moteur de modèle.
Lorsqu'une tâche avec de nombreuses répétitions comme celle-ci se trouve devant moi, je ne sais souvent pas s'il est plus rapide de copier et coller à la main ou de créer un outil et de le concevoir.
Lorsque j'essaie de créer un outil avec une taille lourde, je dis souvent: "J'ai pu le faire en un temps étonnamment court!" Quand j'ai réellement écrit cet outil, je ne pouvais l'écrire que dans le train sur lequel je me suis assis. C'était juste 30 minutes. Une fois créé, il peut souvent être réutilisé pour d'autres tâches, et il existe des situations où il peut être utilisé n'importe où, pas seulement pour la création de configuration.
Si vous faites une erreur dans un endroit inattendu lorsque vous créez manuellement la configuration du routeur, ou si vous rencontrez un petit problème tel que "Je l'ai compris, il y avait un caractère supplémentaire dans chacun d'eux!" Il est nécessaire de le réparer un par un à plusieurs reprises, mais si vous utilisez le moteur de modèle, vous n'avez besoin de fixer qu'un seul endroit et la correction est terminée! Dans de nombreux cas, le travail lui-même peut être simplifié.
Si vous avez un travail pour faire beaucoup de configurations de routeur qui vont vous briser le cœur, veuillez essayer le moteur de modèle une fois.
Recommended Posts