Génération de configuration de réseau de modèles avec Python et Jinja2

Qu'est-ce que c'est?

Un script Python qui génère une configuration Cisco *. Un échantillon qui remplit les paramètres à l'aide de Jinja2. Il semble être très polyvalent, alors prenez une note pour vous-même. Si vous préparez deux modèles de configuration qui incluent des variables et CSV qui résume les valeurs des variables et exécutez le script, plusieurs configurations seront générées sous forme de fichiers.

Qu'est-ce que Jinja2?

Moteur de modèle pour Python. Pour plus d'informations, consultez Honke.

Origine du nom Jinja2

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.

Les temples japonais ont des prononciations similaires aux modèles. (Il y a une ville appelée Jinja en Ouganda, mais ce n'est pas ça)

0. Préparation

Rendre Jinja2 disponible avec pip. Préparez trois fichiers et un répertoire (chacun expliqué ci-dessous).

~ $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 ... Le répertoire où plusieurs fichiers de configuration sont générés. Le contenu est vide.
  2. Inventory.csv ... Fichier de variable de modèle de configuration.
  3. config_template.txt ... fichier de modèle de configuration.
  4. build_templates.py ... script principal.

1. répertoire de configuration

C'est vide.

~ $ls ./configs
~ $
  1. inventory.csv Vous pouvez le créer dans Excel ou gérer des variables avec des scripts.
~ $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 La configuration est familière aux ingénieurs réseau, mais les paramètres que vous souhaitez compléter dynamiquement sont {{variables}}. Puisque Jinja2 est également utilisé dans Ansible, il peut y avoir de nombreuses personnes qui ne se sentent pas mal à l'aise.
~ $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 est un exemple de fonction qui entre un modèle de configuration (config_template.txt) et une variable CSV (inventaire.csv) et génère plusieurs fichiers de configuration.

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("Génération de configuration: %s" % config_filename)

    finally:
        f.close()

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

point

--Lire ligne par ligne (appareil par appareil) à partir d'un fichier CSV avec le dictionnaire Python (csv.DictReader)

Citation


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. Exécuter

~ $python3 build_templates.py 
Génération de configuration: ./configs/Cat01-Tokyo-config
Génération de configuration: ./configs/Cat02-Osaka-config
Génération de configuration: ./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

C'est un sentiment agréable. Il semble qu'il puisse être utilisé à d'autres fins.

référence

Utilisation de csv.DictReader ... Perspective CSV facile à comprendre CiscoDevNet / apic-em-samples-aradford ... C'est en désordre, mais il en contient beaucoup.

Recommended Posts

Génération de configuration de réseau de modèles avec Python et Jinja2
Réseau neuronal avec OpenCV 3 et Python 3
Moteur de template Jinja2 2 Python
Programmation avec Python et Tkinter
Chiffrement et déchiffrement avec Python
Python et matériel - Utilisation de RS232C avec Python -
Réseau de neurones avec Python (scikit-learn)
Programmation réseau avec Python Scapy
Fonctionne avec Python et R
Application Web avec Python3.3.1 + Bottle (1) - Changer le moteur de modèle en jinja2
Créez facilement une infrastructure réseau et EC2 avec AWS CDK Python
Communiquez avec FX-5204PS avec Python et PyUSB
Briller la vie avec Python et OpenCV
Installez Python 2.7.9 et Python 3.4.x avec pip.
Modulation et démodulation AM avec python
Scraping avec Node, Ruby et Python
Mesure de retard unidirectionnelle du réseau par python
Grattage avec Python et belle soupe
Encodage et décodage JSON avec python
Introduction à Hadoop et MapReduce avec Python
[GUI en Python] PyQt5-Glisser-déposer-
Lire et écrire NetCDF avec Python
J'ai joué avec PyQt5 et Python3
Générer un mot de passe pour le manuel avec python
Lire et écrire du CSV avec Python
Génération de jetons de contre-mesure CSRF avec Python
Intégration multiple avec Python et Sympy
Coexistence de Python2 et 3 avec CircleCI (1.0)
Jeu Sugoroku et jeu d'addition avec Python
Modulation et démodulation FM avec Python
Génération d'images dégradées avec Python [1] | np.linspace
Communiquez entre Elixir et Python avec gRPC
Construction de pipeline de données avec Python et Luigi
Calculer et afficher le poids standard avec python
Surveiller les pannes de Mojo avec Python et Skype
Modulation et démodulation FM avec Python Partie 3
[Automation] Manipulez la souris et le clavier avec Python
Authentification sans mot de passe avec RDS et IAM (Python)
Installation de Python et gestion des packages avec pip
Utilisation de Python et MeCab avec Azure Databricks
POSTER diversement avec Python et recevoir avec Flask
Capturer des images avec Pupil, python et OpenCV
Fractal pour faire et jouer avec Python
Un mémo contenant Python2.7 et Python3 dans CentOS
Applications webapp2 multilingues avec pybabel et Jinja2
Utilisez PIL ou Pillow avec Cygwin Python
Créer et décrypter du code César avec python
3. Traitement du langage naturel par Python 2-1. Réseau de co-occurrence
CentOS 6.4, Python 2.7.3, Apache, mod_wsgi, Django
Lire et écrire des fichiers JSON avec Python
Gérer les "années et mois" en Python
Analyse des tweets avec Python, Mecab et CaboCha
Lier Python et JavaScript avec le notebook Jupyter
Surveillance du trafic avec Kibana, ElasticSearch et Python
Crypter avec Ruby (Rails) et décrypter avec Python
Téléchargez facilement des mp3 / mp4 avec python et youtube-dl!
Faites fonctionner des appareils électroménagers avec Python et IRKit
Pratiquer le web scraping avec Python et Selenium
Scraping Web facile avec Python et Ruby