• トップ
  • ブログ一覧
  • 【Python】スイッチの設定情報からポート収容表を自動作成してみた!
  • 【Python】スイッチの設定情報からポート収容表を自動作成してみた!

    メディアチームメディアチーム
    2021.09.24

    IT技術

    【Python】スイッチの設定情報からポート収容表を自動作成してみた!

    スイッチの設定情報から自動でポート収容表を作る

    インフラエンジニアがネットワーク構築する際の参考資料に、各機器のポート収容表があります。

    しかし、コンフィグが変わるたびに、いちいち主導で更新するのは大変ですよね…

    そこで、今回は、スイッチの設定情報からポート収容表を自動作成してみようと思います!

    実行環境

    筆者の実行環境は、以下の通りです。

    1. OS:Mac OS X 10.15.6
    2. Cisco シミュレータ:Packet Tracer 7.3
    3. Python バージョン:3.8.6

    Packet Tracer とは?

    Packet Tracer は、Cisco の公式ネットワークシミュレータです。

    実機がなくても、PC 内の作業だけで手軽にネットワークを構築することができます。

    Window や Mac などほぼ全てのユーザーに対応しており、無料で使えます。

    ただ、Cisco Network Academy のアカウントが必須だったりと、インストールまでの手順が少し多いため、以下を参考にしてください。

    【Cisco シミュレータ Packet Tracer のインストール】
    https://qiita.com/suzuyui/items/76764d7fc4b4183a7d45

    既存ネットワーク

    既存ネットワークとして、以下のようなネットワークを構成します。

    PC1 と PC3 が接続されたポートを「VLAN10」、PC2 が接続されたポートを「VLAN20」に設定し、スイッチの0/11~0/24ポートをシャットダウンにしています。

    既存ネットワーク

    各 PC の IP 設定

    PC1192.168.0.1/24
    PC2192.168.0.2/24
    PC3192.168.0.3/24

    Switch1 の設定コンフィグ

    以下、変更部分のみ示します。

    1!
    2hostname Switch1
    3!
    4interface FastEthernet0/1
    5 switchport access vlan 10
    6 switchport mode access
    7!
    8interface FastEthernet0/2
    9 switchport access vlan 20
    10 switchport mode access
    11!
    12interface FastEthernet0/3
    13 switchport access vlan 10
    14 switchport mode access
    15!
    16interface FastEthernet0/11
    17 shutdown
    18!
    19interface FastEthernet0/12
    20 shutdown
    21!
    22interface FastEthernet0/13
    23 shutdown
    24!
    25interface FastEthernet0/14
    26 shutdown
    27!
    28interface FastEthernet0/15
    29 shutdown
    30!
    31interface FastEthernet0/16
    32 shutdown
    33!
    34interface FastEthernet0/17
    35 shutdown
    36!
    37interface FastEthernet0/18
    38 shutdown
    39!
    40interface FastEthernet0/19
    41 shutdown
    42!
    43interface FastEthernet0/20
    44 shutdown
    45!
    46interface FastEthernet0/21
    47 shutdown
    48!
    49interface FastEthernet0/22
    50 shutdown
    51!
    52interface FastEthernet0/23
    53 shutdown
    54!
    55interface FastEthernet0/24
    56 shutdown
    57!

    疎通確認

    ここまで済んだら、既存ネットワークがきちんと成立しているか、確認しましょう。

    1# PC1PC2VLANが違うので通信できない
    2C:\>ping 192.168.0.2
    3
    4Pinging 192.168.0.2 with 32 bytes of data:
    5
    6Request timed out.
    7Request timed out.
    8Request timed out.
    9Request timed out.
    10
    11Ping statistics for 192.168.0.2:
    12    Packets: Sent = 4, Received = 0, Lost = 4 (100% loss),
    13
    14# PC1PC3VLANが等しいので通信できる
    15C:\>ping 192.168.0.3
    16
    17Pinging 192.168.0.3 with 32 bytes of data:
    18
    19Reply from 192.168.0.3: bytes=32 time<1ms TTL=128
    20Reply from 192.168.0.3: bytes=32 time<1ms TTL=128
    21Reply from 192.168.0.3: bytes=32 time<1ms TTL=128
    22Reply from 192.168.0.3: bytes=32 time<1ms TTL=128
    23
    24Ping statistics for 192.168.0.3:
    25    Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),
    26Approximate round trip times in milli-seconds:
    27    Minimum = 0ms, Maximum = 0ms, Average = 0ms

    それでは、いよいよ収容表を作成していきます!

    スイッチの設定情報を取得

    今回は、「ポート情報」と「コンフィグ情報」の show 結果のみ取得します。

    実際の現場では TeraTerm で接続するため、自動でログが取れます。

    1Switch1#show interfaces status 
    2Port      Name               Status       Vlan       Duplex  Speed Type
    3Fa0/1                        connected    10         auto    auto  10/100BaseTX
    4Fa0/2                        connected    20         auto    auto  10/100BaseTX
    5Fa0/3                        connected    10         auto    auto  10/100BaseTX
    6Fa0/4                        disabled 1          auto    auto  10/100BaseTX
    7Fa0/5                        notconnect   1          auto    auto  10/100BaseTX
    8
    9()10
    11Fa0/23                       disabled 1          auto    auto  10/100BaseTX
    12Fa0/24                       disabled 1          auto    auto  10/100BaseTX
    13Gig0/1                       notconnect   1          auto    auto  10/100BaseTX
    14Gig0/2                       notconnect   1          auto    auto  10/100BaseTX
    15Switch1#
    16Switch1#
    17Switch1#show running-config 
    18Building configuration...
    19
    20Current configuration : 1384 bytes
    21!
    22version 12.2
    23no service timestamps log datetime msec
    24
    25()26
    27line vty 5 15
    28 login
    29!
    30!
    31!
    32!
    33end

    log にスイッチの設定を保存

    作業フォルダ配下に log フォルダを作成し、その中にスイッチの設定情報をコピペしたら、テキストファイルで保存します。

    1$ ls log
    2Switch1_log.txt

    ポート収容表を作成

    上記で取得したスイッチの設定情報から、以下の4つを取得し、CSV 形式で出力します。

    1. ホスト名
    2. ポート
    3. VLAN
    4. ステータス

    pandas をインストール

    今回は、データ解析に優れた pandas ライブラリを使います。

    1$ sudo easy_install pip # pipがインストールされていない場合は実行
    2$ pip install pandas

    収容表を作成

    以下が、ソースコード「create_port_table.py」です。

    1# -*- coding: utf-8 -*-
    2import re
    3import csv
    4import pandas as pd
    5import os
    6
    7
    8# 対象文字列が含まれる行を抜き出す関数
    9def grep(str,path):
    10    # ファイルを読み込む
    11    with open(path) as f:
    12        lines = f.readlines()
    13    # 改行コードを削除
    14    lines_strip = [line.strip() for line in lines]
    15    # 対象文字列が含まれる行を抜き出す
    16    lines_str = [line for line in lines_strip if str in line]
    17    return lines_str
    18
    19# ログファイルパス
    20log_path = "./log/Switch1_log.txt"
    21# ホスト名取得
    22host_name = (grep("hostname",log_path))[0]
    23# FastEthernetのポート情報を読み込む
    24lines_fa = grep("Fa0",log_path)
    25# GigabitEthernetのポート情報を読み込む
    26lines_gig = grep("Gig0",log_path)
    27# FastEthernetの情報にGigabitEthernetの情報を追記する
    28lines_fa.extend(lines_gig)
    29# 列名を追加
    30lines_fa.insert(0, "port status VLAN Duplex Speed Type")
    31# 複数の空白をカンマに置換
    32lines_fa_gig = [re.sub(' +',',' ,str(fa)) for fa in lines_fa]
    33# csv作成
    34with open('./port_table.csv', 'w') as f:
    35    f.write('\n'.join(lines_fa_gig))
    36port_csv = pd.read_csv('./port_table.csv', index_col=0)
    37# 不要な列を消す
    38port_csv_rm = port_csv.drop(columns=['Duplex','Speed','Type'])
    39# CSV更新
    40port_csv_rm.to_csv('./port_table_tmp.csv')
    41# ホスト名を先頭に追記
    42with open('./port_table.csv', 'w') as f:
    43    f.write(host_name + '\n')
    44with open('./port_table_tmp.csv') as f:
    45    buff = f.read()
    46with open('./port_table.csv', 'a') as f:
    47    f.write(buff)
    48# 一時ファイルの削除
    49os.remove('./port_table_tmp.csv')

    実行結果

    それでは、実行してみましょう!

    1# 実行
    2$ python create_port_table.py
    3# csvが作成される
    4$ ls
    5create_port_table.py	log			port_table.csv
    6# csv(ポート収容表)の中身確認
    7$ cat port_table.csv
    8hostname Switch1
    9port,status,VLAN
    10Fa0/1,connected,10
    11Fa0/2,connected,20
    12Fa0/3,connected,10
    13Fa0/4,disabled,1
    14Fa0/5,notconnect,1
    15Fa0/6,notconnect,1
    16Fa0/7,notconnect,1
    17Fa0/8,notconnect,1
    18Fa0/9,notconnect,1
    19Fa0/10,notconnect,1
    20Fa0/11,disabled,1
    21Fa0/12,disabled,1
    22Fa0/13,disabled,1
    23Fa0/14,disabled,1
    24Fa0/15,disabled,1
    25Fa0/16,disabled,1
    26Fa0/17,disabled,1
    27Fa0/18,disabled,1
    28Fa0/19,disabled,1
    29Fa0/20,disabled,1
    30Fa0/21,disabled,1
    31Fa0/22,disabled,1
    32Fa0/23,disabled,1
    33Fa0/24,disabled,1
    34Gig0/1,notconnect,1
    35Gig0/2,notconnect,1

    簡易的なポート収容表が作成できました!

    さいごに

    以上、スイッチの設定情報からポート収容表を自動作成してみました。

    今回は、python でファイル操作・テキスト処理をしましたが、正直「Bash」や「Perl」「PowerShell」の方が簡潔に書けると思います。

    しかし、python をうまく活用すれば、このように作業を簡略化できます。

    ぜひ、一度試してみてくださいね!

    こちらの記事もオススメ!

    featureImg2020.07.17ライトコード的「やってみた!」シリーズ「やってみた!」を集めました!(株)ライトコードが今まで作ってきた「やってみた!」記事を集めてみました!※作成日が新し...
    featureImg2020.07.30Python 特集実装編※最新記事順Responder + Firestore でモダンかつサーバーレスなブログシステムを作ってみた!P...

    ライトコードでは、エンジニアを積極採用中!

    ライトコードでは、エンジニアを積極採用しています!社長と一杯しながらお話しする機会もご用意しております。そのほかカジュアル面談等もございますので、くわしくは採用情報をご確認ください。

    採用情報へ

    メディアチーム
    メディアチーム
    Show more...

    おすすめ記事

    エンジニア大募集中!

    ライトコードでは、エンジニアを積極採用中です。

    特に、WEBエンジニアとモバイルエンジニアは是非ご応募お待ちしております!

    また、フリーランスエンジニア様も大募集中です。

    background