ConfPlate is a configuration file generator. After doing some configurations over and over again I got bored and built this script. Boring tasks often lead to mistakes in configurations which you want to avoid I assume.
The script is based on Python2 and uses Jinja2 as template language.
- Code should run on Linux, OSX, Windows
- Simplicity (Just generate configs from a template. No querying of other devices via SNMP for input, yadayada...)
- Userfriendly command line interface
- Make it easy to create UIs on top of the main code base
Example template cat3560.txt:
hostname {{HOSTNAME|lower}}
!
ip domain name {{DOMAINNAME}}
!
interface range FastEthernet0/1 - 24
swtichport mode access
switchport access vlan {{ACCESS_VLAN}}
switchport nonegotiate
no shut
!
interface {{MGMT_IFACE}}
ip address {{MGMT_IFACE_IP}} {{MGMT_IFACE_NM}}
!
ip default-gateway {{MGMT_DEFAULT_GW}}
This template makes use of Jinja2 filters in the HOSTNAME variable. The value for the hostname variable will always be converted to lower case.
$ ./confplate.py -l examples/cat3560.txt
Variables used in template cat3560.txt
ACCESS_VLAN
DOMAINNAME
HOSTNAME
MGMT_DEFAULT_GW
MGMT_IFACE
MGMT_IFACE_IP
MGMT_IFACE_NM
Will prompt you for every variable used in the template
$ ./confplate.py examples/cat3560.txt
ACCESS_VLAN: 23
DOMAINNAME: lab.verbosemo.de
HOSTNAME: brewery-sw010
MGMT_IFACE: Vlan200
MGMT_IFACE_IP: 10.33.200.10
MGMT_IFACE_NM: 255.255.255.0
MGMT_DEFAULT_GW: 10.33.200.1
Set all variable values as arguments on the command line
./confplate.py examples/cat3560.txt ACCESS_VLAN=23 DOMAINNAME=lab.verbosemo.de HOSTNAME=brewery-sw010 MGMT_IFACE=Vlan200 MGMT_IFACE_IP=10.33.200.10 MGMT_IFACE_NM=255.255.255.0 MGMT_DEFAULT_GW=10.33.200.1
- Variable values read from CSV file
- Creates config per line in CSV file
new-subnets.csv
VLAN_ID,VLAN_NAME,IP,NM,HSRP_IP,IP_HELPER
40,Floor1,192.168.40.2,255.255.255.0,192.168.40.1,192.168.100.100
50,Floor2,192.168.50.2,255.255.255.0,192.168.50.1,192.168.100.100
60,Floor3,192.168.60.2,255.255.255.0,192.168.60.1,192.168.100.100
new-subnets.txt
vlan {{VLAN_ID}}
name {{VLAN_NAME}}
!
interface Vlan{{VLAN_ID}}
ip address {{IP}} {{NM}}
ip ospf 1 area 0.0.0.0
ip ospf passive-interface
ip helper-address {{IP_HELPER}}
Use new-subnets.csv as input and create a config per line
$ ./confplate.py -i examples/new-subnets.csv examples/new-subnets.txt
vlan 40
name Floor1
!
interface Vlan40
ip address 192.168.40.2 255.255.255.0
ip ospf 1 area 0.0.0.0
ip ospf passive-interface
ip helper-address 192.168.100.100
vlan 50
name Floor2
!
interface Vlan50
ip address 192.168.50.2 255.255.255.0
ip ospf 1 area 0.0.0.0
ip ospf passive-interface
ip helper-address 192.168.100.100
vlan 60
name Floor3
!
interface Vlan60
ip address 192.168.60.2 255.255.255.0
ip ospf 1 area 0.0.0.0
ip ospf passive-interface
ip helper-address 192.168.100.100
Generate a CSV header from an existing template. This should make generating a CSV header in your favourite spreadsheet application manually unnecessary
$ ./confplate.py --generate-csv-header examples/cat3560.txt
ACCESS_VLAN,DOMAINNAME,HOSTNAME,MGMT_DEFAULT_GW,MGMT_IFACE,MGMT_IFACE_IP,MGMT_IFACE_NM
$ ./confplate.py --generate-csv-header examples/cat3560.txt > /tmp/cat3560.csv
$ ./confplate.py -g -F ";" examples/cat3560.txt
ACCESS_VLAN;DOMAINNAME;HOSTNAME;MGMT_DEFAULT_GW;MGMT_IFACE;MGMT_IFACE_IP;MGMT_IFACE_NM
Feedback, bug reports and patches are welcome.