
【Python】スイッチの設定情報からポート収容表を自動作成してみた!
2021.12.21
スイッチの設定情報から自動でポート収容表を作る
インフラエンジニアがネットワーク構築する際の参考資料に、各機器のポート収容表があります。
しかし、コンフィグが変わるたびに、いちいち主導で更新するのは大変ですよね…
そこで、今回は、スイッチの設定情報からポート収容表を自動作成してみようと思います!
実行環境
筆者の実行環境は、以下の通りです。
- OS:Mac OS X 10.15.6
- Cisco シミュレータ:Packet Tracer 7.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 設定
PC1 | 192.168.0.1/24 |
PC2 | 192.168.0.2/24 |
PC3 | 192.168.0.3/24 |
Switch1 の設定コンフィグ
以下、変更部分のみ示します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 | ! hostname Switch1 ! interface FastEthernet0/1 switchport access vlan 10 switchport mode access ! interface FastEthernet0/2 switchport access vlan 20 switchport mode access ! interface FastEthernet0/3 switchport access vlan 10 switchport mode access ! interface FastEthernet0/11 shutdown ! interface FastEthernet0/12 shutdown ! interface FastEthernet0/13 shutdown ! interface FastEthernet0/14 shutdown ! interface FastEthernet0/15 shutdown ! interface FastEthernet0/16 shutdown ! interface FastEthernet0/17 shutdown ! interface FastEthernet0/18 shutdown ! interface FastEthernet0/19 shutdown ! interface FastEthernet0/20 shutdown ! interface FastEthernet0/21 shutdown ! interface FastEthernet0/22 shutdown ! interface FastEthernet0/23 shutdown ! interface FastEthernet0/24 shutdown ! |
疎通確認
ここまで済んだら、既存ネットワークがきちんと成立しているか、確認しましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | # PC1→PC2はVLANが違うので通信できない C:\>ping 192.168.0.2 Pinging 192.168.0.2 with 32 bytes of data: Request timed out. Request timed out. Request timed out. Request timed out. Ping statistics for 192.168.0.2: Packets: Sent = 4, Received = 0, Lost = 4 (100% loss), # PC1→PC3はVLANが等しいので通信できる C:\>ping 192.168.0.3 Pinging 192.168.0.3 with 32 bytes of data: Reply from 192.168.0.3: bytes=32 time<1ms TTL=128 Reply from 192.168.0.3: bytes=32 time<1ms TTL=128 Reply from 192.168.0.3: bytes=32 time<1ms TTL=128 Reply from 192.168.0.3: bytes=32 time<1ms TTL=128 Ping statistics for 192.168.0.3: Packets: Sent = 4, Received = 4, Lost = 0 (0% loss), Approximate round trip times in milli-seconds: Minimum = 0ms, Maximum = 0ms, Average = 0ms |
ポート収容表作成
それでは、いよいよ収容表を作成していきます!
スイッチの設定情報を取得
今回は、「ポート情報」と「コンフィグ情報」の show 結果のみ取得します。
実際の現場では TeraTerm で接続するため、自動でログが取れます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | Switch1#show interfaces status Port Name Status Vlan Duplex Speed Type Fa0/1 connected 10 auto auto 10/100BaseTX Fa0/2 connected 20 auto auto 10/100BaseTX Fa0/3 connected 10 auto auto 10/100BaseTX Fa0/4 disabled 1 auto auto 10/100BaseTX Fa0/5 notconnect 1 auto auto 10/100BaseTX 〜(略)〜 Fa0/23 disabled 1 auto auto 10/100BaseTX Fa0/24 disabled 1 auto auto 10/100BaseTX Gig0/1 notconnect 1 auto auto 10/100BaseTX Gig0/2 notconnect 1 auto auto 10/100BaseTX Switch1# Switch1# Switch1#show running-config Building configuration... Current configuration : 1384 bytes ! version 12.2 no service timestamps log datetime msec 〜(略)〜 line vty 5 15 login ! ! ! ! end |
log にスイッチの設定を保存
作業フォルダ配下に log フォルダを作成し、その中にスイッチの設定情報をコピペしたら、テキストファイルで保存します。
1 2 | $ ls log Switch1_log.txt |
ポート収容表を作成
上記で取得したスイッチの設定情報から、以下の4つを取得し、CSV 形式で出力します。
- ホスト名
- ポート
- VLAN
- ステータス
pandas をインストール
今回は、データ解析に優れた pandas ライブラリを使います。
1 2 | $ sudo easy_install pip # pipがインストールされていない場合は実行 $ pip install pandas |
収容表を作成
以下が、ソースコード「create_port_table.py」です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 | # -*- coding: utf-8 -*- import re import csv import pandas as pd import os # 対象文字列が含まれる行を抜き出す関数 def grep(str,path): # ファイルを読み込む with open(path) as f: lines = f.readlines() # 改行コードを削除 lines_strip = [line.strip() for line in lines] # 対象文字列が含まれる行を抜き出す lines_str = [line for line in lines_strip if str in line] return lines_str # ログファイルパス log_path = "./log/Switch1_log.txt" # ホスト名取得 host_name = (grep("hostname",log_path))[0] # FastEthernetのポート情報を読み込む lines_fa = grep("Fa0",log_path) # GigabitEthernetのポート情報を読み込む lines_gig = grep("Gig0",log_path) # FastEthernetの情報にGigabitEthernetの情報を追記する lines_fa.extend(lines_gig) # 列名を追加 lines_fa.insert(0, "port status VLAN Duplex Speed Type") # 複数の空白をカンマに置換 lines_fa_gig = [re.sub(' +',',' ,str(fa)) for fa in lines_fa] # csv作成 with open('./port_table.csv', 'w') as f: f.write('\n'.join(lines_fa_gig)) port_csv = pd.read_csv('./port_table.csv', index_col=0) # 不要な列を消す port_csv_rm = port_csv.drop(columns=['Duplex','Speed','Type']) # CSV更新 port_csv_rm.to_csv('./port_table_tmp.csv') # ホスト名を先頭に追記 with open('./port_table.csv', 'w') as f: f.write(host_name + '\n') with open('./port_table_tmp.csv') as f: buff = f.read() with open('./port_table.csv', 'a') as f: f.write(buff) # 一時ファイルの削除 os.remove('./port_table_tmp.csv') |
実行結果
それでは、実行してみましょう!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | # 実行 $ python create_port_table.py # csvが作成される $ ls create_port_table.py log port_table.csv # csv(ポート収容表)の中身確認 $ cat port_table.csv hostname Switch1 port,status,VLAN Fa0/1,connected,10 Fa0/2,connected,20 Fa0/3,connected,10 Fa0/4,disabled,1 Fa0/5,notconnect,1 Fa0/6,notconnect,1 Fa0/7,notconnect,1 Fa0/8,notconnect,1 Fa0/9,notconnect,1 Fa0/10,notconnect,1 Fa0/11,disabled,1 Fa0/12,disabled,1 Fa0/13,disabled,1 Fa0/14,disabled,1 Fa0/15,disabled,1 Fa0/16,disabled,1 Fa0/17,disabled,1 Fa0/18,disabled,1 Fa0/19,disabled,1 Fa0/20,disabled,1 Fa0/21,disabled,1 Fa0/22,disabled,1 Fa0/23,disabled,1 Fa0/24,disabled,1 Gig0/1,notconnect,1 Gig0/2,notconnect,1 |
簡易的なポート収容表が作成できました!
さいごに
以上、スイッチの設定情報からポート収容表を自動作成してみました。
今回は、python でファイル操作・テキスト処理をしましたが、正直「Bash」や「Perl」「PowerShell」の方が簡潔に書けると思います。
しかし、python をうまく活用すれば、このように作業を簡略化できます。
ぜひ、一度試してみてくださいね!
こちらの記事もオススメ!
書いた人はこんな人

- 「好きを仕事にするエンジニア集団」の(株)ライトコードです!
ライトコードは、福岡、東京、大阪の3拠点で事業展開するIT企業です。
現在は、国内を代表する大手IT企業を取引先にもち、ITシステムの受託事業が中心。
いずれも直取引で、月間PV数1億を超えるWebサービスのシステム開発・運営、インフラの構築・運用に携わっています。
システム開発依頼・お見積もり大歓迎!
また、現在「WEBエンジニア」「モバイルエンジニア」「営業」「WEBデザイナー」「WEBディレクター」を積極採用中です!
インターンや新卒採用も行っております。
以下よりご応募をお待ちしております!
https://rightcode.co.jp/recruit
ITエンタメ10月 13, 2023Netflixの成功はレコメンドエンジン?
ライトコードの日常8月 30, 2023退職者の最終出社日に密着してみた!
ITエンタメ8月 3, 2023世界初の量産型ポータブルコンピュータを開発したのに倒産!?アダム・オズボーン
ITエンタメ7月 14, 2023【クリス・ワンストラス】GitHubが出来るまでとソフトウェアの未来