[PYTHON] Verwendung von Template Engine für Network Engineer

Überblick

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

Schritt 1. Betten Sie einen Wert in eine Konfigurationszeile ein

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.

Schritt 2. Betten Sie mehrere Werte in eine mehrzeilige Konfiguration ein

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

Schritt 3. Erstellen Sie eine große Anzahl von Konfigurationen mit mehreren eingebetteten Werten

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.

Schließlich

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

Verwendung von Template Engine für Network Engineer
Verwendung der Template-Engine in einer Dateianwendung von Pyramid
Verwenden Sie Jinja2 für die PasteScript-Vorlagen-Engine
Verwendung des Entwicklernetzwerks von cybozu.com (Teil 2)
[Python] Organisieren der Verwendung für Anweisungen
Verwendung von "deque" für Python-Daten
Verwendung der Fingerabdruckauthentifizierung für KDE
Verwendung von xml.etree.ElementTree
Wie benutzt man Python-Shell
Hinweise zur Verwendung von tf.data
Verwendung von virtualenv
So verwenden Sie MkDocs zum ersten Mal
Verwendung von Image-Match
Wie man Shogun benutzt
Verwendung von Pandas 2
Verwendung von Virtualenv
Verwendung von numpy.vectorize
Verwendung von pytest_report_header
Wie man teilweise verwendet
Wie man Bio.Phylo benutzt
Verwendung von SymPy
Wie man x-means benutzt
Verwendung von WikiExtractor.py
Verwendung von Datenanalysetools für Anfänger
Verwendung von IPython
Verwendung von virtualenv
Wie benutzt man Matplotlib?
Verwendung von iptables
Wie benutzt man numpy?
Verwendung von TokyoTechFes2015
Wie benutzt man venv
Verwendung des Wörterbuchs {}
Wie benutzt man Pyenv?
Verwendung der Liste []
Wie man Python-Kabusapi benutzt
Verwendung von OptParse
Verwendung von return
Wie man Imutils benutzt
[BigQuery] Verwendung der BigQuery-API für die Python-Tabellenerstellung-
[Für Anfänger] Wie man den Befehl say mit Python benutzt!
Verwendung von Django mit Google App Engine / Python
Verwendung von Qt Designer
Verwendung der Suche sortiert
[gensim] Verwendung von Doc2Vec
python3: Verwendung der Flasche (2)
Verstehen Sie, wie man Django-Filter verwendet
Verwendung des Generators
[Python] Verwendung von Liste 1
Verwendung von FastAPI ③ OpenAPI
Wie benutzt man Python Argparse?
Verwendung von IPython Notebook
Wie man Pandas Rolling benutzt
[Hinweis] Verwendung von virtualenv
Verwendung von Redispy-Wörterbüchern
Python: Wie man pydub benutzt
[Python] Verwendung von checkio