<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Dinuka Wijesinghe</title>
    <description>The latest articles on DEV Community by Dinuka Wijesinghe (@dinuka_wijesinghe).</description>
    <link>https://dev.to/dinuka_wijesinghe</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4068792%2F6cfc06bf-5866-4679-94f7-32de582d7736.png</url>
      <title>DEV Community: Dinuka Wijesinghe</title>
      <link>https://dev.to/dinuka_wijesinghe</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/dinuka_wijesinghe"/>
    <language>en</language>
    <item>
      <title>Stop Copy-Pasting Router Configs: I Built a Browser-Based Network Config Generator</title>
      <dc:creator>Dinuka Wijesinghe</dc:creator>
      <pubDate>Sat, 08 Aug 2026 12:49:57 +0000</pubDate>
      <link>https://dev.to/dinuka_wijesinghe/stop-copy-pasting-router-configs-i-built-a-browser-based-network-config-generator-b2e</link>
      <guid>https://dev.to/dinuka_wijesinghe/stop-copy-pasting-router-configs-i-built-a-browser-based-network-config-generator-b2e</guid>
      <description>&lt;p&gt;Have you ever had to configure 50 routers using almost the same template, but with different IP addresses, interfaces, VLANs, VRFs, or BGP neighbors?&lt;/p&gt;

&lt;p&gt;The first few devices are easy.&lt;/p&gt;

&lt;p&gt;Then you reach device number 27.&lt;/p&gt;

&lt;p&gt;You copy the previous configuration, change an IP address, change an interface, change a VLAN, change a hostname... and eventually you're wondering:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Did I actually change everything I was supposed to change?"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This is one of those problems that looks simple until you have to do it at scale.&lt;/p&gt;

&lt;p&gt;A wrong IP address, duplicated VLAN, incorrect interface, missing configuration line, or accidental copy/paste can turn a simple provisioning task into a troubleshooting session during a maintenance window.&lt;/p&gt;

&lt;p&gt;I've dealt with enough repetitive network configuration work to eventually build something for it.&lt;/p&gt;

&lt;p&gt;So I built a free, browser-based Network Config Generator that takes CSV/Excel data and a configuration template and generates ready-to-review CLI configurations in bulk.&lt;/p&gt;

&lt;p&gt;Try the tool:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://dinukawijesinghe.com/tools/config-generator.html" rel="noopener noreferrer"&gt;https://dinukawijesinghe.com/tools/config-generator.html&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The Problem: Manual Network Configuration Doesn't Scale
&lt;/h2&gt;

&lt;p&gt;Manual configuration isn't necessarily bad.&lt;/p&gt;

&lt;p&gt;If you're configuring one router, typing the configuration directly into the CLI is often the fastest approach.&lt;/p&gt;

&lt;p&gt;The problem starts when the configuration is mostly identical across dozens or hundreds of devices.&lt;/p&gt;

&lt;p&gt;Imagine provisioning multiple PE routers with something like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;hostname PE-001
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;interface TenGigE0/0/0/1
 description CUSTOMER-A
 ip address 10.10.1.1 255.255.255.252
 vrf CUSTOMER-A
 no shutdown
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;hostname PE-002
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;interface TenGigE0/0/0/1
 description CUSTOMER-B
 ip address 10.10.2.1 255.255.255.252
 vrf CUSTOMER-B
 no shutdown
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then another device, and another.&lt;/p&gt;

&lt;p&gt;The configuration logic hasn't changed. Only the data has changed.&lt;/p&gt;

&lt;p&gt;That's where manual editing becomes risky.&lt;/p&gt;

&lt;p&gt;Common problems include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Copy/paste mistakes&lt;/li&gt;
&lt;li&gt;Wrong IP addresses&lt;/li&gt;
&lt;li&gt;Duplicate IP addresses&lt;/li&gt;
&lt;li&gt;Incorrect VLAN IDs&lt;/li&gt;
&lt;li&gt;Wrong interface names&lt;/li&gt;
&lt;li&gt;Duplicate hostnames&lt;/li&gt;
&lt;li&gt;Incorrect VRF names&lt;/li&gt;
&lt;li&gt;Missing configuration lines&lt;/li&gt;
&lt;li&gt;Leftover values from the previous device&lt;/li&gt;
&lt;li&gt;Human fatigue&lt;/li&gt;
&lt;li&gt;Configuration drift&lt;/li&gt;
&lt;li&gt;Repetitive provisioning work&lt;/li&gt;
&lt;li&gt;Change-window pressure&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The actual engineering work isn't necessarily writing the configuration.&lt;/p&gt;

&lt;p&gt;It's making sure the right values are inserted into the right places.&lt;/p&gt;

&lt;p&gt;That's what led me to build this tool.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Idea Behind the Tool
&lt;/h2&gt;

&lt;p&gt;The concept is simple:&lt;/p&gt;

&lt;p&gt;Separate the configuration logic from the device-specific data.&lt;/p&gt;

&lt;p&gt;Instead of manually editing this configuration for every device:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;interface TenGigE0/0/0/1
 description CUSTOMER-A
 ip address 10.10.1.1 255.255.255.252
 vrf CUSTOMER-A
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;create one reusable template:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;interface {{INTERFACE}}
 description {{DESCRIPTION}}
 ip address {{IP}} {{MASK}}
 vrf {{VRF}}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then put the changing values into a spreadsheet.&lt;/p&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;HOSTNAME&lt;/th&gt;
&lt;th&gt;INTERFACE&lt;/th&gt;
&lt;th&gt;DESCRIPTION&lt;/th&gt;
&lt;th&gt;IP&lt;/th&gt;
&lt;th&gt;MASK&lt;/th&gt;
&lt;th&gt;VRF&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;PE-001&lt;/td&gt;
&lt;td&gt;Te0/0/0/1&lt;/td&gt;
&lt;td&gt;CUSTOMER-A&lt;/td&gt;
&lt;td&gt;10.10.1.1&lt;/td&gt;
&lt;td&gt;255.255.255.252&lt;/td&gt;
&lt;td&gt;CUSTOMER-A&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PE-002&lt;/td&gt;
&lt;td&gt;Te0/0/0/1&lt;/td&gt;
&lt;td&gt;CUSTOMER-B&lt;/td&gt;
&lt;td&gt;10.10.2.1&lt;/td&gt;
&lt;td&gt;255.255.255.252&lt;/td&gt;
&lt;td&gt;CUSTOMER-B&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PE-003&lt;/td&gt;
&lt;td&gt;Te0/0/0/1&lt;/td&gt;
&lt;td&gt;CUSTOMER-C&lt;/td&gt;
&lt;td&gt;10.10.3.1&lt;/td&gt;
&lt;td&gt;255.255.255.252&lt;/td&gt;
&lt;td&gt;CUSTOMER-C&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The generator combines the template with each row and produces the corresponding configuration.&lt;/p&gt;

&lt;p&gt;The spreadsheet provides the data.&lt;/p&gt;

&lt;p&gt;The template provides the configuration structure.&lt;/p&gt;

&lt;h2&gt;
  
  
  How the Network Config Generator Works
&lt;/h2&gt;

&lt;p&gt;The workflow is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;CSV / Excel
     |
     v
Data Parser
     |
     v
Validation Engine
     |
     v
Template Engine
     |
     v
Configuration Generator
     |
     +--------+---------+---------+
     |        |         |         |
     v        v         v         v
    TXT     Excel      ZIP    Clipboard
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The tool doesn't need to understand whether a particular command belongs to Cisco, Juniper, Arista, or Nokia.&lt;/p&gt;

&lt;p&gt;It works with the configuration as text.&lt;/p&gt;

&lt;p&gt;That makes the approach flexible across different network platforms.&lt;/p&gt;

&lt;h2&gt;
  
  
  Template-Based Configuration
&lt;/h2&gt;

&lt;p&gt;The main concept is the {{VARIABLE}} placeholder.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;interface {{INTERFACE}}
 description {{DESCRIPTION}}
 ip address {{IP}} {{MASK}}
 vrf {{VRF}}
 no shutdown
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The variable names correspond to spreadsheet column names.&lt;/p&gt;

&lt;p&gt;So {{INTERFACE}} expects an INTERFACE column.&lt;/p&gt;

&lt;p&gt;Likewise, {{DESCRIPTION}} expects a DESCRIPTION column.&lt;/p&gt;

&lt;p&gt;And {{IP}} expects an IP column.&lt;/p&gt;

&lt;p&gt;There is no fixed spreadsheet schema.&lt;/p&gt;

&lt;p&gt;You define the variables based on what you're configuring.&lt;/p&gt;

&lt;p&gt;For example, a BGP template could use:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;router bgp {{ASN}}
 neighbor {{PEER_IP}} remote-as {{PEER_AS}}
 neighbor {{PEER_IP}} description {{PEER_DESCRIPTION}}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;while an interface template could use:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;interface {{INTERFACE}}
 description {{DESCRIPTION}}
 ip address {{IP}} {{MASK}}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The same generator can handle both.&lt;/p&gt;

&lt;h2&gt;
  
  
  CSV/Excel as the Source of Truth
&lt;/h2&gt;

&lt;p&gt;Network engineers already use spreadsheets heavily during migrations, provisioning, implementation planning, and network expansion.&lt;/p&gt;

&lt;p&gt;A typical dataset might look like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;HOSTNAME,INTERFACE,DESCRIPTION,VRF,IP,MASK
PE-001,Te0/0/0/1,CUSTOMER-A,CUST-A,10.10.1.1,255.255.255.252
PE-002,Te0/0/0/2,CUSTOMER-B,CUST-B,10.10.2.1,255.255.255.252
PE-003,Te0/0/0/3,CUSTOMER-C,CUST-C,10.10.3.1,255.255.255.252
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The important relationship is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Spreadsheet column
       |
       v
  {{VARIABLE}}
       |
       v
Configuration template
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This makes the template easy to understand and reuse.&lt;/p&gt;

&lt;h2&gt;
  
  
  Validation Before Generation
&lt;/h2&gt;

&lt;p&gt;Generating hundreds of configurations quickly isn't useful if the input data contains mistakes.&lt;/p&gt;

&lt;p&gt;Before generating configurations, the tool checks the relationship between the template and the spreadsheet.&lt;/p&gt;

&lt;p&gt;For example, if the template contains:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{{INTERFACE}}
{{IP}}
{{VRF}}
{{PEER_IP}}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;but the spreadsheet doesn't contain a PEER_IP column, that's something worth catching before generating the configuration.&lt;/p&gt;

&lt;p&gt;The validation process helps identify:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Matched variables&lt;/li&gt;
&lt;li&gt;Missing variables&lt;/li&gt;
&lt;li&gt;Unused spreadsheet columns&lt;/li&gt;
&lt;li&gt;Duplicate rows&lt;/li&gt;
&lt;li&gt;Repeated values&lt;/li&gt;
&lt;li&gt;Duplicate hostnames&lt;/li&gt;
&lt;li&gt;Repeated IP addresses&lt;/li&gt;
&lt;li&gt;Repeated VLAN values&lt;/li&gt;
&lt;li&gt;Repeated interface values&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;HOSTNAME     IP
PE-001       10.10.1.1
PE-002       10.10.2.1
PE-003       10.10.2.1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The repeated IP address is something you can investigate before the generated configuration reaches a production device.&lt;/p&gt;

&lt;p&gt;This isn't a replacement for proper network validation. It is an additional check designed to catch common data-entry and copy/paste mistakes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Generate Configurations at Scale
&lt;/h2&gt;

&lt;p&gt;Once the template and data pass validation, there are two main generation modes.&lt;/p&gt;

&lt;h3&gt;
  
  
  Generate All
&lt;/h3&gt;

&lt;p&gt;Generate configuration for every row in the dataset.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;100 spreadsheet rows
        |
        v
100 generated configurations
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Generate Selected
&lt;/h3&gt;

&lt;p&gt;Sometimes you don't want to generate everything.&lt;/p&gt;

&lt;p&gt;You may only be working on:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;PE-017
PE-018
PE-021
PE-025
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The tool allows specific rows to be selected and generated.&lt;/p&gt;

&lt;p&gt;This can be useful during staged migrations or maintenance windows where only a subset of devices is being changed.&lt;/p&gt;

&lt;h2&gt;
  
  
  A Practical Example
&lt;/h2&gt;

&lt;p&gt;Let's say we're provisioning interfaces.&lt;/p&gt;

&lt;h3&gt;
  
  
  Template
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;interface {{INTERFACE}}
 description {{DESCRIPTION}}
 vrf {{VRF}}
 ip address {{IP}} {{MASK}}
 no shutdown
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Input Data
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;HOSTNAME,INTERFACE,DESCRIPTION,VRF,IP,MASK
PE-001,Te0/0/0/1,CUSTOMER-A,CUST-A,10.10.1.1,255.255.255.252
PE-002,Te0/0/0/2,CUSTOMER-B,CUST-B,10.10.2.1,255.255.255.252
PE-003,Te0/0/0/3,CUSTOMER-C,CUST-C,10.10.3.1,255.255.255.252
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Generated Configuration
&lt;/h3&gt;

&lt;p&gt;For PE-001:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;interface Te0/0/0/1
 description CUSTOMER-A
 vrf CUST-A
 ip address 10.10.1.1 255.255.255.252
 no shutdown
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For PE-002:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;interface Te0/0/0/2
 description CUSTOMER-B
 vrf CUST-B
 ip address 10.10.2.1 255.255.255.252
 no shutdown
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For PE-003:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;interface Te0/0/0/3
 description CUSTOMER-C
 vrf CUST-C
 ip address 10.10.3.1 255.255.255.252
 no shutdown
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;One template.&lt;/p&gt;

&lt;p&gt;Three data rows.&lt;/p&gt;

&lt;p&gt;Three generated configuration blocks.&lt;/p&gt;

&lt;p&gt;The same approach can be used with hundreds or thousands of rows.&lt;/p&gt;

&lt;h2&gt;
  
  
  Vendor Independence
&lt;/h2&gt;

&lt;p&gt;I deliberately didn't build this around a Cisco-specific configuration parser.&lt;/p&gt;

&lt;p&gt;That would make the tool more complicated and less useful for engineers working in multi-vendor environments.&lt;/p&gt;

&lt;p&gt;The generator treats the configuration as text.&lt;/p&gt;

&lt;h3&gt;
  
  
  Cisco IOS-XE
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;interface GigabitEthernet{{PORT}}
 description {{DESCRIPTION}}
 ip address {{IP}} {{MASK}}
 no shutdown
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Cisco IOS-XR
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;interface TenGigE{{INTERFACE}}
 description {{DESCRIPTION}}
 ipv4 address {{IP}} {{MASK}}
 no shutdown
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Juniper JunOS
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;set interfaces {{INTERFACE}} description "{{DESCRIPTION}}"
set interfaces {{INTERFACE}} unit 0 family inet address {{IP}}/{{PREFIX}}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The generator doesn't need to know what these commands mean.&lt;/p&gt;

&lt;p&gt;It simply replaces the variables.&lt;/p&gt;

&lt;p&gt;The same approach can be used with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Cisco IOS-XE&lt;/li&gt;
&lt;li&gt;Cisco IOS-XR&lt;/li&gt;
&lt;li&gt;Cisco NX-OS&lt;/li&gt;
&lt;li&gt;Juniper JunOS&lt;/li&gt;
&lt;li&gt;Arista EOS&lt;/li&gt;
&lt;li&gt;Nokia SR OS&lt;/li&gt;
&lt;li&gt;Other text-based CLI systems&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is particularly useful in service-provider environments where engineers may work across different platforms and equipment generations.&lt;/p&gt;

&lt;h2&gt;
  
  
  Real Network Engineering Use Cases
&lt;/h2&gt;

&lt;h3&gt;
  
  
  PE Router Provisioning
&lt;/h3&gt;

&lt;p&gt;Generate repeated interface, VRF, routing, or BGP configuration for multiple PE routers.&lt;/p&gt;

&lt;h3&gt;
  
  
  Access Switch Configuration
&lt;/h3&gt;

&lt;p&gt;Generate interface configurations across a large number of access switches:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;interface GigabitEthernet0/1
 description {{DESCRIPTION}}
 switchport mode access
 switchport access vlan {{VLAN}}
 spanning-tree portfast
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  VLAN Deployment
&lt;/h3&gt;

&lt;p&gt;Generate repetitive VLAN-related configuration from structured data.&lt;/p&gt;

&lt;h3&gt;
  
  
  BGP Neighbor Provisioning
&lt;/h3&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;neighbor {{PEER_IP}} remote-as {{REMOTE_AS}}
neighbor {{PEER_IP}} description {{DESCRIPTION}}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  VRF Provisioning
&lt;/h3&gt;

&lt;p&gt;Generate repeated VRF and interface configuration across multiple devices.&lt;/p&gt;

&lt;h3&gt;
  
  
  NNI Configuration
&lt;/h3&gt;

&lt;p&gt;Carrier and ISP environments often involve repetitive NNI configuration where interface IDs, descriptions, VLANs, IP addresses, and peer information vary between locations.&lt;/p&gt;

&lt;h3&gt;
  
  
  Customer Migration
&lt;/h3&gt;

&lt;p&gt;During migrations, engineers often prepare similar configurations for many services.&lt;/p&gt;

&lt;p&gt;Instead of manually editing each block, the common structure can be represented once as a template.&lt;/p&gt;

&lt;h3&gt;
  
  
  Network Expansion
&lt;/h3&gt;

&lt;p&gt;When adding new sites, routers, interfaces, or services, the same approach can reduce repetitive configuration preparation.&lt;/p&gt;

&lt;h2&gt;
  
  
  Architecture
&lt;/h2&gt;

&lt;p&gt;The application was intentionally designed to be simple.&lt;/p&gt;

&lt;p&gt;There is no backend configuration engine that receives your spreadsheet and generates the configuration remotely.&lt;/p&gt;

&lt;p&gt;The processing happens in the browser.&lt;/p&gt;

&lt;p&gt;The high-level architecture is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;CSV / Excel
     |
     v
+----------------+
|  Data Parser   |
+----------------+
     |
     v
+----------------+
|   Validation   |
|     Engine     |
+----------------+
     |
     v
+----------------+
|    Template    |
|     Engine     |
+----------------+
     |
     v
+----------------+
|  Configuration |
|    Generator   |
+----------------+
     |
+----+-----+---------+-----------+
|    |     |         |
v    v     v         v
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;TXT  Excel ZIP    Clipboard&lt;/p&gt;

&lt;p&gt;The application is intentionally lightweight:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;No installation&lt;/li&gt;
&lt;li&gt;No Python environment&lt;/li&gt;
&lt;li&gt;No database&lt;/li&gt;
&lt;li&gt;No backend required&lt;/li&gt;
&lt;li&gt;Works directly in a modern browser&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Security and Data Privacy
&lt;/h2&gt;

&lt;p&gt;Network configuration data can contain information that engineers may not want to upload to an external service, including:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Internal IP addressing&lt;/li&gt;
&lt;li&gt;Device names&lt;/li&gt;
&lt;li&gt;Interface details&lt;/li&gt;
&lt;li&gt;BGP peer information&lt;/li&gt;
&lt;li&gt;VLAN assignments&lt;/li&gt;
&lt;li&gt;VRF names&lt;/li&gt;
&lt;li&gt;Customer-related identifiers&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The generator processes the data client-side in the browser rather than requiring the spreadsheet to be uploaded to a configuration-generation server.&lt;/p&gt;

&lt;p&gt;This reduces the need to send network data to a backend service.&lt;/p&gt;

&lt;p&gt;It is important not to interpret this as a guarantee that the data is automatically secure. Normal browser, endpoint, and organizational security controls still apply.&lt;/p&gt;

&lt;p&gt;The main advantage is that the tool does not require a remote backend for the configuration-generation process.&lt;/p&gt;

&lt;h2&gt;
  
  
  Performance
&lt;/h2&gt;

&lt;p&gt;The tool has been tested with datasets containing more than 10,000 rows.&lt;/p&gt;

&lt;p&gt;The goal wasn't to build a benchmark project.&lt;/p&gt;

&lt;p&gt;The goal was to make bulk configuration generation practical without requiring a Python environment, database, server, or specialized automation platform.&lt;/p&gt;

&lt;p&gt;For most use cases, generating the text itself is not the difficult part.&lt;/p&gt;

&lt;p&gt;Preparing and validating the input data correctly is often more important.&lt;/p&gt;

&lt;p&gt;That's why validation and data editing are an important part of the workflow.&lt;/p&gt;

&lt;h2&gt;
  
  
  Exporting the Result
&lt;/h2&gt;

&lt;p&gt;After generation, configurations can be used in several ways.&lt;/p&gt;

&lt;h3&gt;
  
  
  Copy to Clipboard
&lt;/h3&gt;

&lt;p&gt;Useful when you're working directly in a terminal, console server, or jump host.&lt;/p&gt;

&lt;h3&gt;
  
  
  TXT
&lt;/h3&gt;

&lt;p&gt;Generate a text file containing the generated configurations.&lt;/p&gt;

&lt;h3&gt;
  
  
  Excel
&lt;/h3&gt;

&lt;p&gt;Export the original data together with a generated configuration column.&lt;/p&gt;

&lt;p&gt;This can be useful when you want the input data and generated result together for review.&lt;/p&gt;

&lt;h3&gt;
  
  
  ZIP
&lt;/h3&gt;

&lt;p&gt;Generate individual configuration files for each device.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;configs/
├── PE-001.txt
├── PE-002.txt
├── PE-003.txt
├── PE-004.txt
└── PE-005.txt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The filename can be based on a selected spreadsheet column.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why I Built This
&lt;/h2&gt;

&lt;p&gt;This project started from a very normal network engineering problem.&lt;/p&gt;

&lt;p&gt;I've worked with configuration blocks where most commands are identical, but a handful of values change from device to device.&lt;/p&gt;

&lt;p&gt;The process usually becomes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Copy
Paste
Change IP
Change interface
Change description
Change VLAN
Check
Repeat
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then repeat that process dozens of times.&lt;/p&gt;

&lt;p&gt;It's not difficult work.&lt;/p&gt;

&lt;p&gt;It's repetitive work.&lt;/p&gt;

&lt;p&gt;And repetitive work is exactly where small automation tools can help.&lt;/p&gt;

&lt;p&gt;I wanted something lightweight that I could open in a browser, feed with structured data, generate configurations, and move on to the actual engineering work.&lt;/p&gt;

&lt;p&gt;The question was simple:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;What if I could describe the configuration once and provide the changing values as data?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That's essentially what this tool does.&lt;/p&gt;

&lt;h2&gt;
  
  
  Limitations
&lt;/h2&gt;

&lt;p&gt;The generator is intentionally simple, and that also defines its limitations.&lt;/p&gt;

&lt;p&gt;It generates configuration based on:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Your template&lt;/li&gt;
&lt;li&gt;Your input data&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;It does not understand your actual network topology.&lt;/p&gt;

&lt;p&gt;For example, it doesn't know whether:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;10.10.10.1/30
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;is actually the correct address for a particular interface.&lt;/p&gt;

&lt;p&gt;It doesn't know whether:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Te0/0/0/7
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;exists on your router.&lt;/p&gt;

&lt;p&gt;It doesn't know whether a BGP neighbor is reachable.&lt;/p&gt;

&lt;p&gt;It doesn't understand your network design.&lt;/p&gt;

&lt;p&gt;It doesn't replace a proper change-management or network automation platform.&lt;/p&gt;

&lt;p&gt;Most importantly:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;A successfully generated configuration is not necessarily a correct configuration.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Generated configurations should still be reviewed and, where appropriate, tested before being deployed to production devices.&lt;/p&gt;

&lt;p&gt;The tool automates the repetitive part.&lt;/p&gt;

&lt;p&gt;The engineer remains responsible for the network decision.&lt;/p&gt;

&lt;h2&gt;
  
  
  Future Improvements
&lt;/h2&gt;

&lt;p&gt;There are several directions this project could eventually take.&lt;/p&gt;

&lt;h3&gt;
  
  
  Device Connectivity
&lt;/h3&gt;

&lt;p&gt;Integrate with network devices through an appropriate automation layer instead of only generating configuration files.&lt;/p&gt;

&lt;h3&gt;
  
  
  Pre-Check / Post-Check Automation
&lt;/h3&gt;

&lt;p&gt;Generate operational checks before and after a change and compare the results.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;PRE-CHECK
    |
    v
Configuration Change
    |
    v
POST-CHECK
    |
    v
DIFF
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Configuration Diff
&lt;/h3&gt;

&lt;p&gt;Automatically compare pre-change and post-change configuration or command output.&lt;/p&gt;

&lt;h3&gt;
  
  
  Ansible Integration
&lt;/h3&gt;

&lt;p&gt;Generate structured data or playbook inputs that can be consumed by Ansible-based workflows.&lt;/p&gt;

&lt;h3&gt;
  
  
  NetBox Integration
&lt;/h3&gt;

&lt;p&gt;Use NetBox as a source of structured device and service data instead of manually maintaining spreadsheets.&lt;/p&gt;

&lt;h3&gt;
  
  
  Git-Based Configuration Management
&lt;/h3&gt;

&lt;p&gt;Store templates and generated configurations in Git for version control, review, and auditability.&lt;/p&gt;

&lt;h3&gt;
  
  
  CI/CD Workflows
&lt;/h3&gt;

&lt;p&gt;A future workflow could look like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Source of Truth
       |
       v
   Validation
       |
       v
     Template
       |
       v
    Generate
       |
       v
Review / Pull Request
       |
       v
     Deploy
       |
       v
   Post-Check
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  More Advanced Validation
&lt;/h3&gt;

&lt;p&gt;Future versions could perform more meaningful validation for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;IP addressing&lt;/li&gt;
&lt;li&gt;Prefixes&lt;/li&gt;
&lt;li&gt;VLAN ranges&lt;/li&gt;
&lt;li&gt;ASN values&lt;/li&gt;
&lt;li&gt;Interface formats&lt;/li&gt;
&lt;li&gt;Required fields&lt;/li&gt;
&lt;li&gt;Vendor-specific syntax&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These are future possibilities, not features currently implemented by the tool.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try the Network Config Generator
&lt;/h2&gt;

&lt;p&gt;If you regularly prepare repetitive router or switch configurations from spreadsheets, give it a try:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://dinukawijesinghe.com/tools/config-generator.html" rel="noopener noreferrer"&gt;https://dinukawijesinghe.com/tools/config-generator.html&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The workflow is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1. Create a template
2. Add {{VARIABLES}}
3. Load CSV / Excel
4. Validate the data
5. Generate configurations
6. Review the output
7. Export
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No installation is required.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Network automation doesn't always have to start with a large platform, API, or complex orchestration system.&lt;/p&gt;

&lt;p&gt;Sometimes the first useful automation is simply removing repetitive work that engineers are doing manually every day.&lt;/p&gt;

&lt;p&gt;A spreadsheet already contains the data.&lt;/p&gt;

&lt;p&gt;A configuration template already contains the logic.&lt;/p&gt;

&lt;p&gt;The missing piece is often just a reliable way to combine the two.&lt;/p&gt;

&lt;p&gt;That's what I built with the Network Config Generator.&lt;/p&gt;

&lt;p&gt;It isn't intended to replace Ansible, NetBox, Git-based configuration management, or a full network automation platform.&lt;/p&gt;

&lt;p&gt;It's a small tool for a specific problem:&lt;/p&gt;

&lt;p&gt;Take structured network data, apply it to a configuration template, validate the inputs, and generate the repetitive CLI work automatically.&lt;/p&gt;

&lt;p&gt;If it saves another network engineer from manually editing the same configuration block 50 times during a maintenance window, then it has done its job.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fdhc195pwxw0lnoil7ki5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fdhc195pwxw0lnoil7ki5.png" alt=" " width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>networkautomation</category>
      <category>networking</category>
      <category>devops</category>
      <category>javascript</category>
    </item>
  </channel>
</rss>
