KnowHow

技術的なメモを中心にまとめます。
検索にて調べることができます。

Config作成ツール

登録日 :2026/02/04 05:33
カテゴリ :Python基礎

pythonによる、Config作成ツール
templateファイルから、devicel_listの内容を反映して新しいコンフィグを作成する。

  • devices_list
HOSTNAME,IP,GATEWAY,MVLAN,DVLAN
host-001,10.1.1.11,10.1.1.1,10,49
host-0002,10.1.1.12,10.1.1.11,10,49
  • template(sample)
enable
configure terminal

hostname SW-2960L-8TS
ip domain-name example.local

enable secret <ENABLE_SECRET>
username admin privilege 15 secret <ADMIN_PASSWORD>

line vty 0 4
 login local
 transport input ssh
 exec-timeout 10 0

line console 0
 exec-timeout 10 0
 logging synchronous

crypto key generate rsa modulus 2048

service timestamps debug datetime msec
service timestamps log datetime msec

vlan 10,247

interface Vlan99
 ip address 192.168.99.2 255.255.255.0
 no shutdown

ip default-gateway 192.168.99.1

interface GigabitEthernet0/1
 switchport trunk encapsulation dot1q
 switchport mode trunk
 switchport trunk native vlan 99
 switchport trunk allowed vlan 10,20,99
 spanning-tree portfast trunk
 spanning-tree bpduguard enable

interface range GigabitEthernet0/2 - 0/5
 switchport mode access
 switchport access vlan 10
 spanning-tree portfast
 spanning-tree bpduguard enable

interface range GigabitEthernet0/6 - 0/7
 switchport mode access
 switchport access vlan 20
 spanning-tree portfast
 spanning-tree bpduguard enable

spanning-tree mode rapid-pvst
spanning-tree extend system-id

logging buffered 16384

end
write memory
  • mainプログラム
from abc import ABC, abstractmethod
import sys
import logging
from datetime import datetime
from typing import List
import gc

logging.basicConfig(
        stream=sys.stdout,
        level=logging.INFO,
        format='%(asctime)s:%(name)s:%(levelname)s:%(message)s')
logger = logging.getLogger(__name__)


class CreateConfig(object):
    def __init__(self, _template_file: str, _devices_file: str, _out_dir: str):
        self.template_file = _template_file
        self.devices_file = _devices_file
        self.out_dir = _out_dir
        self.template_config = []
        self.created_config = []
        self.devices_list = []

    def import_template(self):
        with open(self.template_file, 'r', encoding="utf-8") as f:
            for line in f:
                line = line.rstrip("\n")
                if not line:
                    continue
                # print(line)
                self.template_config.append(line)

    def import_input_list(self):
        with open(self.devices_file, 'r', encoding="utf-8") as f:
            # header = f.readline().strip().split(",")
            headers = []

            lines = f.readlines()
            for cnt, line in enumerate(lines):
                device = {}
                line = line.rstrip("\n")
                items = line.split(",")
                if cnt == 0:
                    for item in items:
                        # print(item)
                        headers.append(item)
                else:
                    for idx, item in enumerate(items):
                        device[headers[idx]] = item
                if not line:
                    continue
                if device != {}:
                    self.devices_list.append(device)

    def write_config(self, _config: List, _hostname: str):
        timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
        outfile = self.out_dir + '/' + _hostname + '_' + timestamp + '.txt'
        with open(outfile, "w", encoding="utf-8") as f:
            for item in _config:
                f.write(str(item) + "\n")

    def create_new_config(self):
        key1 = 'hostname SW-2960L-8TS'
        key2 = 'vlan 10,247'
        key3 = 'switchport access vlan '
        key4 = 'ip address 192.168.99.2 255.255.255.0'
        key5 = 'ip default-gateway 192.168.99.1'
        key6 = 'interface Vlan99'

        for device in self.devices_list:
            created_new_config = []
            for item in self.template_config:
                if key1 in item:
                    created_new_config.append(f"hostname {device['HOSTNAME']}")
                    continue
                if key2 in item:
                    created_new_config.append(f"vlan {device['DVLAN']} {device['MVLAN']}")
                    continue
                if key3 in item:
                    created_new_config.append(f" switchport access vlan {device['DVLAN']}")
                    continue
                if key4 in item:
                    created_new_config.append(f" ip address {device['IP']} 255.255.255.0")
                    continue
                if key5 in item:
                    created_new_config.append(f" ip default-gateway {device['GATEWAY']}")
                    continue
                if key6 in item:
                    created_new_config.append(f" interface Vlan{device['MVLAN']}")
                    continue
                created_new_config.append(item)

            self.write_config(created_new_config, device['HOSTNAME'])
            # self.created_config.append(created_new_config)

    def run(self):
        self.import_template()
        self.import_input_list()
        self.create_new_config()


def main(_template: str, _devices: str, _out: str) -> None:

    create_config = CreateConfig(_template, _devices, _out)
    create_config.run()

    print('check result')
    # print('< new config >')
    # for idx, config in enumerate(create_config.created_config):
    #     print('=====', idx, '=====')
    #     for c in config:
    #         print(c)
    #     print('')
    # print('< device file >')
    for dev_info in create_config.devices_list:
        logger.info(dev_info)


if __name__ == '__main__':
    template_file = 'template/2960L.txt'
    devices_file = 'config/devices_file.txt'
    out_dir = 'out'

    main(template_file, devices_file, out_dir)

    gc.collect()