Generierung der Vorlagen-Netzwerkkonfiguration mit Python und Jinja2

Was ist das?

Ein Python-Skript, das eine Cisco-Konfiguration * generiert. Ein Beispiel, das Parameter mit Jinja2 füllt. Es scheint vielseitig zu sein, machen Sie sich also eine Notiz. Wenn Sie zwei Konfigurationsvorlagen vorbereiten, die Variablen und CSV enthalten, die die Werte für Variablen zusammenfassen, und das Skript ausführen, werden mehrere Konfigurationen als Dateien ausgegeben.

Was ist Jinja2?

Template Engine für Python. Weitere Informationen finden Sie unter Honke.

Herkunft der Jinja2-Benennung

The name Jinja was chosen because it’s the name of a Japanese temple and temple and template share a similar pronunciation. It is not named after the city in Uganda.

Japanische Tempel haben ähnliche Aussprachen wie Vorlagen. (Es gibt eine Stadt namens Jinja in Uganda, aber das ist es nicht)

0. Vorbereitung

Stellen Sie Jinja2 mit pip zur Verfügung. Bereiten Sie drei Dateien und ein Verzeichnis vor (jeweils unten erläutert).

~ $pip3 list | grep Jinja2
Jinja2 (2.8)
~ $ls
build_templates.py	config_template.txt	configs			inventory.csv
~ $

SS 2017-06-06 17.37.04.png

  1. configs ... Das Verzeichnis, in dem mehrere Konfigurationsdateien generiert werden. Der Inhalt ist leer.
  2. inventar.csv ... Konfigurationsvorlagenvariablendatei.
  3. config_template.txt ... Konfigurationsvorlagendatei.
  4. build_templates.py ... Hauptskript.

1. Konfigurationsverzeichnis

Es ist leer.

~ $ls ./configs
~ $
  1. inventory.csv Sie können es in Excel erstellen oder Variablen mit Skripten verwalten.
~ $cat inventory.csv 
hostName,serialNumber,platformId,site,ipAddress,subnet,username,password,enablepass
Cat01,12345678901,WS-C2960X-48FPD-L,Tokyo,10.10.10.101,255.255.255.0,cisco,C1sco12345,C1$co
Cat02,22345678901,WS-C2960X-48FPD-L,Osaka,10.10.10.102,255.255.255.0,cisco,C1sco12345,C1$co
Cat03,32345678901,WS-C2960X-48FPD-L,Nagoya,10.10.10.103,255.255.255.0,cisco,C1sco12345,C1$co

SS 2017-06-06 17.38.16.png

  1. config_template.txt Die Konfiguration ist Netzwerkingenieuren vertraut, aber die Parameter, die Sie dynamisch ergänzen möchten, sind {{Variablen}}. Da Jinja2 auch in Ansible verwendet wird, kann es viele Menschen geben, die sich nicht unwohl fühlen.
~ $cat config_template.txt 
hostname {{hostName}}
!
enable password {{enablepass}}
!
username {{username}} password 0 {{password}}
no aaa new-model
!
int vlan 1
ip address {{ipAddress}} {{subnet}}
!
end

As already referenced in the variables section, Ansible uses Jinja2 templating to enable dynamic expressions and access to variables.

  1. build_templates.py build_templates ist eine Beispielfunktion, die eine Konfigurationsvorlage (config_template.txt) und eine Variable CSV (inventar.csv) eingibt und mehrere Konfigurationsdateien ausgibt.

build_templates.py


# -*- coding: utf-8 -*-
import jinja2
import csv

CONFIGS_DIR= "./configs/"
DEVICES="./inventory.csv"
TEMPLATE="./config_template.txt"

def build_templates(template_file, devices):

    templateLoader = jinja2.FileSystemLoader('./')
    templateEnv = jinja2.Environment(loader=templateLoader)
    template = templateEnv.get_template(template_file)

    f = open(devices, 'rt')
    try:
        reader = csv.DictReader(f)
        for dict_row in reader:
            outputText = template.render(dict_row)

            config_filename = CONFIGS_DIR + dict_row['hostName'] + '-' + dict_row['site'] + '-config'
            with open(config_filename, 'w') as config_file:
                config_file.write(outputText)
            print("Konfigurationsgenerierung: %s" % config_filename)

    finally:
        f.close()

if __name__ == "__main__":
    build_templates(TEMPLATE, DEVICES)

Punkt

--Lesen Sie Zeile für Zeile (Gerät für Gerät) aus der CSV-Datei mit dem Python-Wörterbuch (csv.DictReader). --Variationsabschluss (template.render (dict_row)) wird in die Vorlage ausgegeben --Loop so viele wie die Anzahl der Geräte (für dict_row im Reader) ――Die Art, Jinja2 zu schreiben, ist separat geschrieben, aber es scheint, dass Sie sogar eine wie folgt schreiben können.

Zitat


import os
import jinja2


def render(tpl_path, context):
    path, filename = os.path.split(tpl_path)
    return jinja2.Environment(
        loader=jinja2.FileSystemLoader(path or './')
    ).get_template(filename).render(context)

5. Führen Sie aus

~ $python3 build_templates.py 
Konfigurationsgenerierung: ./configs/Cat01-Tokyo-config
Konfigurationsgenerierung: ./configs/Cat02-Osaka-config
Konfigurationsgenerierung: ./configs/Cat03-Nagoya-config
~ $
~ $ls ./configs/
Cat01-Tokyo-config	Cat02-Osaka-config	Cat03-Nagoya-config
~ $
~ $cat ./configs/Cat01-Tokyo-config 
hostname Cat01
!
enable password C1$co
!
username cisco password 0 C1sco12345
no aaa new-model
!
int vlan 1
ip address 10.10.10.101 255.255.255.0
!
end
~ $
~ $
~ $cat ./configs/Cat02-Osaka-config 
hostname Cat02
!
enable password C1$co
!
username cisco password 0 C1sco12345
no aaa new-model
!
int vlan 1
ip address 10.10.10.102 255.255.255.0
!
end
~ $
~ $

SS 2017-06-06 19.20.03.png

Es ist ein gutes Gefühl. Es scheint, dass es für andere Zwecke verwendet werden kann.

Referenz

Verwendung von csv.DictReader ... Leicht verständliche CSV-Perspektive CiscoDevNet / apic-em-samples-aradford ... Es ist chaotisch, aber es enthält viel.

Recommended Posts

Generierung der Vorlagen-Netzwerkkonfiguration mit Python und Jinja2
Neuronales Netzwerk mit OpenCV 3 und Python 3
Jinja2 | Python-Vorlagen-Engine
Programmieren mit Python und Tkinter
Ver- und Entschlüsselung mit Python
Python und Hardware-Verwenden von RS232C mit Python-
Neuronales Netzwerk mit Python (Scikit-Learn)
Netzwerkprogrammierung mit Python Scapy
Funktioniert mit Python und R.
Webanwendung mit Python3.3.1 + Flasche (1) - Ändern Sie die Vorlagen-Engine in jinja2
Erstellen Sie mit AWS CDK Python ganz einfach Netzwerkinfrastruktur und EC2
Kommunizieren Sie mit FX-5204PS mit Python und PyUSB
Leuchtendes Leben mit Python und OpenCV
Installieren Sie Python 2.7.9 und Python 3.4.x mit pip.
AM-Modulation und Demodulation mit Python
Scraping mit Node, Ruby und Python
Einwegverzögerungsmessung des Netzwerks mit Python
Kratzen mit Python und schöner Suppe
JSON-Codierung und -Decodierung mit Python
Hadoop-Einführung und MapReduce mit Python
[GUI in Python] PyQt5-Drag & Drop-
Lesen und Schreiben von NetCDF mit Python
Ich habe mit PyQt5 und Python3 gespielt
Passwort für Lehrbuch mit Python generieren
Lesen und Schreiben von CSV mit Python
CSRF-Token-Generierung für Gegenmaßnahmen mit Python
Mehrfachintegration mit Python und Sympy
Koexistenz von Python2 und 3 mit CircleCI (1.0)
Sugoroku-Spiel und Zusatzspiel mit Python
FM-Modulation und Demodulation mit Python
Erzeugung von Verlaufsbildern mit Python [1] | np.linspace
Kommunizieren Sie mit gRPC zwischen Elixir und Python
Datenpipeline-Aufbau mit Python und Luigi
Berechnen Sie das Standardgewicht und zeigen Sie es mit Python an
Überwachen Sie Mojo-Ausfälle mit Python und Skype
FM-Modulation und Demodulation mit Python Part 3
[Automatisierung] Bearbeiten Sie Maus und Tastatur mit Python
Passwortlose Authentifizierung mit RDS und IAM (Python)
Python-Installation und Paketverwaltung mit pip
Verwenden von Python und MeCab mit Azure Databricks
POST verschieden mit Python und empfange mit Flask
Bilder mit Pupil, Python und OpenCV aufnehmen
Fraktal zum Erstellen und Spielen mit Python
Ein Memo mit Python2.7 und Python3 in CentOS
Mehrsprachige webapp2-Anwendungen mit pybabel und Jinja2
Verwenden Sie PIL oder Pillow mit Cygwin Python
Erstellen und entschlüsseln Sie Caesar-Code mit Python
3. Verarbeitung natürlicher Sprache durch Python 2-1. Netzwerk für das gleichzeitige Auftreten
CentOS 6.4, Python 2.7.3, Apache, mod_wsgi, Django
Lesen und Schreiben von JSON-Dateien mit Python
Umgang mit "Jahren und Monaten" in Python
Tweet-Analyse mit Python, Mecab und CaboCha
Verknüpfung von Python und JavaScript mit dem Jupiter-Notizbuch
Verkehrsüberwachung mit Kibana, ElasticSearch und Python
Mit Ruby (Rails) verschlüsseln und mit Python entschlüsseln
Laden Sie einfach mp3 / mp4 mit Python und youtube-dl herunter!
Betreiben Sie Haushaltsgeräte mit Python und IRKit
Üben des Web-Scrapings mit Python und Selen
Einfaches Web-Scraping mit Python und Ruby