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 Python and uses Jinja2 as template language. Due to the lack of error handling and not enough testing some features supported by Jinja2 might not work (template inheritence, for loops, ...) yet.
- 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
Feedback, bug reports and patches are welcome.