Wenn ich in einem Netzwerk arbeite, nehme ich manchmal viele Routerkonfigurationen vor, indem ich nur die Werte wie die IP-Adresse in dieselben Einstellungen ändere.
Sie können sie einzeln von Hand kopieren und einfügen, aber Sie können Werte einfach mithilfe der in der Programmiersprache bereitgestellten Vorlagen-Engine einfügen.
Hier erstellen wir eine Routerkonfiguration mit einer Vorlagen-Engine namens Jinja2, die häufig in Python verwendet wird.
Bitte installieren Sie zuerst jinja2 als Vorbereitungsphase.
pip install jinja2
Wenn Sie pip noch nie verwendet haben, installieren Sie pip bitte anhand dieses Artikels.
Die ersten Pakete, die in Python setuptools und pip enthalten sind http://www.lifewithpython.com/2012/11/Python-package-setuptools-pip.html
Versuchen Sie zunächst, eine einzeilige Konfiguration (eigentlich ein Befehl) mit dem Namen "show bgp summary | inc (AS-Nummer)" zu erstellen. Wenn Sie Jinja2 verwenden, können Sie es so nennen.
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
Bei der Ausführung wird Folgendes angezeigt.
%python easy_jinja2.py
show bgp summary | inc 65001
Wie oben erwähnt, erkennt Jinja2 die in {{}} enthaltene Zeichenfolge als Variablennamen und kann den tatsächlichen Wert mithilfe der Renderfunktion einbetten.
Wenn Sie die Vorlagen-Engine auf diese Weise verwenden, können Sie auf einfache Weise eine Textdatei mit beliebigen eingebetteten Werten erstellen.
Als nächstes erstellen wir eine Konfiguration mit ein paar weiteren Zeilen. Um einen Wert in eine Variable vom Typ Zeichenfolge einzubetten, schreiben Sie ihn mit der Environment-Klasse.
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
Bei der Ausführung wird Folgendes angezeigt.
% 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
Zuletzt erstellen wir die vorherige Konfiguration, indem wir Werte wie mehrere IP-Adressen einbetten. Die Verwendung der Template-Engine selbst ist jedoch dieselbe wie zuvor. Hier werden der Wörterbuchtyp und die for-Anweisung verwendet, um den Wert in die Vorlagen-Engine einzufügen.
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
Das Ausführungsergebnis ist wie folgt.
% 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
Wie oben erwähnt, können Sie mithilfe der Vorlagen-Engine problemlos eine ähnliche Konfiguration erstellen, während Sie den Wert ändern.
Wenn eine Aufgabe mit vielen Wiederholungen wie dieser vor mir steht, bin ich oft verwirrt, ob es schneller ist, von Hand zu kopieren und einzufügen oder ein Werkzeug zu erstellen und es zu entwickeln.
Wenn ich versuche, ein Werkzeug mit einer schweren Taille herzustellen, sage ich oft: "Ich habe es in überraschend kurzer Zeit geschafft!" Als ich dieses Tool tatsächlich schrieb, konnte ich es nur in dem Zug schreiben, in dem ich zufällig saß. Es waren nur 30 Minuten. Einmal erstellt, kann es häufig für andere Aufgaben wiederverwendet werden, und es gibt Situationen, in denen es überall verwendet werden kann, nicht nur für die Konfigurationserstellung.
Wenn Sie beim manuellen Erstellen der Routerkonfiguration an einem unerwarteten Ort einen Fehler machen oder wenn Sie ein kleines Problem haben wie "Ich habe es verstanden, war in jedem ein zusätzliches Zeichen enthalten!" Sie müssen es wiederholt einzeln reparieren, aber wenn Sie die Vorlagen-Engine verwenden, müssen Sie nur eine Stelle reparieren, um die Korrektur abzuschließen! In vielen Fällen kann die Arbeit selbst vereinfacht werden.
Wenn Sie die Aufgabe haben, viele Router-Konfigurationen zu erstellen, die Ihnen das Herz brechen werden, versuchen Sie es bitte einmal mit der Template-Engine.
Recommended Posts