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.
Template Engine für Python. Weitere Informationen finden Sie unter Honke.
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)
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
~ $
Es ist leer.
~ $ls ./configs
~ $
~ $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
~ $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.
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)
--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)
~ $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
~ $
~ $
Es ist ein gutes Gefühl. Es scheint, dass es für andere Zwecke verwendet werden kann.
Verwendung von csv.DictReader ... Leicht verständliche CSV-Perspektive CiscoDevNet / apic-em-samples-aradford ... Es ist chaotisch, aber es enthält viel.
Recommended Posts