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

    広告メディア事業部広告メディア事業部
    2021.09.24

    IT技術

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

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

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

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

    実行環境

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

    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...

    広告メディア事業部

    広告メディア事業部

    おすすめ記事