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.
Moteur de modèle pour Python. Pour plus d'informations, consultez 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.
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)
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
~ $
C'est vide.
~ $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("Génération de configuration: %s" % config_filename)
finally:
f.close()
if __name__ == "__main__":
build_templates(TEMPLATE, DEVICES)
--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)
~ $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
~ $
~ $
C'est un sentiment agréable. Il semble qu'il puisse être utilisé à d'autres fins.
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