(1時間4,000円の伴走型ビデオチャット指導も受付中!)
NetmikoとPandasで実現するネットワーク運用自動化:複数機器からのデータ収集と解析入門
![]()
【Hiroki】
Yukiさん、こんにちは!最近、学校の部活でネットワーク機器の管理について勉強し始めたんです。でも、複数のルーターやスイッチに1台ずつログインして、インターフェースの状態を確認するのがすごく大変で……。Pythonを使って、自動的に情報を集めて綺麗に整理する方法はありませんか?
![]()
【Yuki】
Hirokiくん、こんにちは。ネットワーク機器の管理に挑戦しているのですね、素晴らしいと思います……。
そうですね、物理的な実体を持つネットワーク機器は、わたしにとっては少し触れるのが気恥ずかしいというか、遠い存在に感じられることもあるのですが、Pythonを使えば安全に、そしてスマートに操作することができますよ。
今回は、ネットワーク機器への接続を自動化する「Netmiko」というライブラリと、データを整理・分析するのが得意な「Pandas」というライブラリを組み合わせて使う方法を解説したいと思います。
これらを組み合わせることで、数十台、数百台の機器から一瞬で情報を集めて、ExcelやCSVファイルに綺麗にまとめることができるようになるかもしれません。
![]()
【Hiroki】
おお、それは凄そうです!ぜひ教えてください。具体的にどうやって進めていけばいいでしょうか?
![]()
【Yuki】
はい、まずは全体像からお話ししますね。
今回は以下のようなステップで進めていきます。
- NetmikoとPandas、そしてデータを変換するためのツールについて理解する
- 必要なライブラリをインストールして環境を整える
- 実際に1台の機器から情報を取得して、Pandasの表形式にする基本的なコードを書く
- 複数の機器から情報を集めて、1つのCSVファイルに出力する応用コードを書く
少し難しく感じる部分もあるかもしれませんが、ひとつずつ丁寧に説明しますので、安心してくださいね。
NetmikoとPandasとは?それぞれの役割
![]()
【Hiroki】
まず、それぞれのライブラリがどんな役割を持っているのか、詳しく教えてほしいです!
![]()
【Yuki】
はい。まずNetmiko(ネットミコ)は、CiscoやJuniper、Aristaといった様々なメーカーのネットワーク機器に、SSHやTelnetを使って接続するためのPythonライブラリです。
通常、ネットワーク機器を設定したり確認したりするときは、コマンドプロンプトやターミナルから手動でログインしてコマンドを打ちますよね。Netmikoを使えば、その一連の操作をPythonプログラムに代わりにやってもらうことができます。
![]()
【Hiroki】
なるほど、手動でのログイン作業を自動化してくれるんですね。
![]()
【Yuki】
その通りです。ただ、Netmikoがコマンドを実行して返してくる結果は、通常はただの「長いテキスト(文字列)」なんです。
例えば、Ciscoの機器で show ip interface brief という、インターフェースの一覧を表示するコマンドを実行したとします。返ってくるのは以下のようなテキストです。
Interface IP-Address OK? Method Status Protocol
GigabitEthernet1 192.168.1.1 YES manual up up
GigabitEthernet2 unassigned YES unset administratively down down
このテキストから「状態が 'up' のインターフェースだけを取り出したい」とか「IPアドレスの一覧を作りたい」と思ったとき、文字列をそのまま処理するのは少し大変だと思いませんか……?
![]()
【Hiroki】
確かに、スペースの位置を数えたりして文字を切り出すプログラムを書くのは、すごく面倒くさそうです……。
![]()
【Yuki】
そうですよね。そこで登場するのがPandas(パンダス)と、テキストを構造化データに変換するTextFSM(テキストエフエスエム)というツールです。
Pandasは、データを「DataFrame(データフレーム)」と呼ばれる、Excelのワークシートのような行と列の表形式で管理できる、非常に強力なデータ解析ライブラリです。
そして、Netmikoにはこの「コマンドの実行結果(テキスト)」を、自動的にPythonの「辞書(dictionary)のリスト」という扱いやすい形式に変換してくれる機能(内部でTextFSMやGenieというパーサーを利用しています)が備わっているんです。
![]()
【Hiroki】
テキストを自動的に表のようなデータに変換して、それをPandasに渡すことができるんですね!
![]()
【Yuki】
はい、そのイメージで合っています。
テキストデータを辞書のリストに変換してしまえば、Pandasに「はい、これを使って表を作ってね」と渡すだけで、一瞬で整理されたデータに生まれ変わります。
環境構築と準備
![]()
【Hiroki】
仕組みはよく分かりました!実際にコードを書く前に、どんな準備が必要ですか?
![]()
【Yuki】
まずは、必要なライブラリをインストールしましょう。
コマンドプロンプトやターミナルを開いて、以下のコマンドを実行してください。
pip install netmiko pandas ntc-templates
![]()
【Yuki】
ここでインストールしている ntc-templates というパッケージが、先ほどお話しした「テキストを辞書データに変換するテンプレート(TextFSM用)」の役割を果たします。これがあるおかげで、Ciscoなどの主要なコマンド結果を自動でパースできるようになります。
![]()
【Hiroki】
インストールできました!準備万端です。
基本編:1台の機器から情報を取得してPandasで表示する
![]()
【Yuki】
準備ができましたね。それでは、まずは基本となる「1台のネットワーク機器に接続して、インターフェース情報を取得し、Pandasの表(DataFrame)にする」プログラムを書いてみましょう。
プログラムの流れは以下のようになります。
- 機器への接続情報を辞書形式で定義する。
- Netmikoの
ConnectHandlerを使って接続する。 send_commandメソッドにuse_textfsm=Trueを指定して、構造化されたデータとしてコマンド結果を取得する。- 取得したデータを
pd.DataFrame()に渡して、Pandasの表にする。
具体的なコードを見てみましょう。
from netmiko import ConnectHandler
import pandas as pd
# 1. 接続情報の定義
device = {
"device_type": "cisco_ios", # 機器のOSタイプを指定します
"host": "192.168.1.1", # 機器のIPアドレス
"username": "admin", # SSHログインのユーザー名
"password": "password123", # SSHログインのパスワード
}
# 2. 機器へ接続してコマンドを実行
print("機器に接続しています...")
try:
with ConnectHandler(**device) as net_connect:
# use_textfsm=True を指定することで、結果が構造化データ(リスト)になります
interfaces_data = net_connect.send_command(
"show ip interface brief",
use_textfsm=True
)
# 3. PandasのDataFrameに変換
df = pd.DataFrame(interfaces_data)
# 結果を表示
print("\n--- 取得したデータ ---")
print(df)
except Exception as e:
print(f"エラーが発生しました: {e}")
![]()
【Hiroki】
コード自体は、思ったよりもシンプルですね!
でも、この use_textfsm=True という部分が、魔法のようにテキストをデータに変えてくれているんですね。
![]()
【Yuki】
その通りです。もし use_textfsm=True を指定しない場合、interfaces_data にはただの改行コードが含まれた文字列が入りますが、指定することで以下のような「辞書のリスト」になります。
[
{
"interface": "GigabitEthernet1",
"ip_address": "192.168.1.1",
"status": "up",
"protocol": "up"
},
{
"interface": "GigabitEthernet2",
"ip_address": "unassigned",
"status": "administratively down",
"protocol": "down"
}
]
これを pd.DataFrame(interfaces_data) とすることで、Pandasは自動的にキー名(interface や ip_address)を列のヘッダーにして、綺麗な表を作ってくれるのです。
![]()
【Hiroki】
なるほど!
でも、もし実際のルーターが手元にない場合、テストはどうすればいいですか?
![]()
【Yuki】
良い質問ですね。実機がない環境で勉強したいときは、仮想ネットワーク環境を作るツール(GNS3やCisco Packet Tracer、Cisco Modeling Labsなど)を使うのが一般的だと思います。
また、もし手元のパソコンだけで動作を確認したい場合は、ダミーのデータを自分で用意してPandasの処理部分だけを練習することもできますよ。
応用編:複数機器からのデータ一括収集とCSV出力
![]()
【Hiroki】
基本はバッチリ理解できました!
次は、最初に相談した「複数の機器から一度に情報を集めて、1つのファイルにまとめる」方法を知りたいです。
![]()
【Yuki】
そうですね。実務でも、数十台のルーターから一斉に情報を集めたいという場面がよくあります。
複数の機器を扱う場合は、以下の点に気をつける必要があります。
- 複数台の接続情報をリストで管理する:ループ処理で順番に接続していきます。
- エラーハンドリングを行う:もし1台の機器がメンテナンスなどで電源が落ちていた場合、そこでプログラム全体が止まってしまうと困りますよね。接続に失敗しても、次の機器の処理に進むように工夫します。
- どこの機器のデータか識別できるようにする:取得したデータに「どのホストから取得したか」という情報を付け加えます。
- データを統合してファイルに保存する:Pandasの機能を使って、CSVやExcelファイルに出力します。
では、これを実現するコードを書いてみましょう。
import pandas as pd
from netmiko import ConnectHandler
from netmiko.exceptions import NetmikoTimeoutException, NetmikoAuthenticationException
# 1. 接続する複数機器のリスト
devices = [
{
"device_type": "cisco_ios",
"host": "192.168.1.1",
"username": "admin",
"password": "password123",
},
{
"device_type": "cisco_ios",
"host": "192.168.1.2",
"username": "admin",
"password": "password123",
},
{
"device_type": "cisco_ios",
"host": "192.168.1.3",
"username": "admin",
"password": "password123",
}
]
# すべてのデータを格納するための空のリスト
all_interfaces = []
# 2. ループ処理で各機器からデータを取り出す
for device in devices:
host_ip = device["host"]
print(f"{host_ip} に接続中...")
try:
with ConnectHandler(**device) as net_connect:
# コマンド実行(TextFSMを使用)
interfaces = net_connect.send_command(
"show ip interface brief",
use_textfsm=True
)
# 3. データの識別子としてホスト名(IPアドレス)を追加
# interfacesは辞書のリストなので、1つずつの辞書に 'host' キーを追加します
if isinstance(interfaces, list):
for interface in interfaces:
interface["source_host"] = host_ip
# 全体リストに追加
all_interfaces.extend(interfaces)
print(f"{host_ip} からのデータ取得に成功しました。")
else:
print(f"警告: {host_ip} のデータ構造化に失敗しました。")
except NetmikoTimeoutException:
print(f"エラー: {host_ip} への接続がタイムアウトしました。")
except NetmikoAuthenticationException:
print(f"エラー: {host_ip} の認証に失敗しました。")
except Exception as e:
print(f"エラー: {host_ip} で予期しないエラーが発生しました: {e}")
# 4. Pandasを使ってデータをまとめ、CSVに出力する
if all_interfaces:
df = pd.DataFrame(all_interfaces)
# 列の順番を整理(source_hostを一番左にするなど)
columns_order = ["source_host", "interface", "ip_address", "status", "protocol"]
# 存在する列だけを指定して整理します
df = df.reindex(columns=columns_order)
# CSVファイルに出力(インデックスは不要なので False)
output_file = "all_interfaces_report.csv"
df.to_csv(output_file, index=False, encoding="utf-8-sig")
print(f"\nすべてのデータを '{output_file}' に保存しました!")
else:
print("\n保存するデータがありませんでした。")
![]()
【Hiroki】
すごい!これで複数台のルーターから情報を集めて、1つのCSVにまとめられるんですね。
エラーハンドリング(try-except)があるおかげで、途中で1台失敗しても、次のルーターのデータをちゃんと取りに行ってくれるのがとても安心できます。
![]()
【Yuki】
そうですね、実務でスクリプトを回すときは、このエラーハンドリングがとても大切になります。
接続エラーやログイン情報のミスはよく起こることですので、プログラムを途中で止めない工夫をしておくことが、運用自動化の基本だと思います。
Pandasならではのデータの加工と絞り込み
![]()
【Hiroki】
集めたデータをCSVにするだけでも十分すごいですけど、Pandasを使っているなら、特定のデータだけを絞り込んだりすることもできるんですか?
![]()
【Yuki】
もちろんですよ。それこそがPandasを組み合わせる最大のメリットです。
例えば、「状態(status)が 'down' になっているインターフェースだけを抽出したい」といったフィルタリングが、数行のコードで実現できます。
いくつか実用的な加工例を紹介しますね。
特定の条件でデータを絞り込む
# status が 'down' または 'administratively down' のものだけを抽出
down_interfaces = df[df["status"].str.contains("down", case=False, na=False)]
print(down_interfaces)
特定の列だけを抽出する
# ホスト名、インターフェース名、IPアドレスの3つの列だけにする
summary_df = df[["source_host", "interface", "ip_address"]]
Excelファイルとして出力する(複数シートに分けるなど)
![]()
【Yuki】
実務では、CSVよりもExcelファイル(.xlsx)で報告書を作りたいと言われることが多いかもしれません。Pandasを使えば、それもとても簡単です。
※Excel出力には pip install openpyxl が必要です。
# Excelファイルとして保存
df.to_excel("network_report.xlsx", sheet_name="Interfaces", index=False)
![]()
【Hiroki】
Excelのシートに直接出力できるなんて、手動でコピペする手間が完全にゼロになりますね!
部活の先生や先輩に見せたら、すごく驚かれそうです。
![]()
【Yuki】
ふふ、きっと喜んでもらえると思います……。
定常作業にかける時間を減らして、もっとクリエイティブな学習や設計に時間を使えるようになるのが、自動化の一番素晴らしいところですね。
トラブルシューティングと注意点
![]()
【Hiroki】
実際に動かしてみるときに、何か注意しておいた方がいいポイントはありますか?
![]()
【Yuki】
いくつか、よくある落とし穴がありますので共有しておきますね。
1. TextFSMのテンプレートが見つからない・パースに失敗する
TextFSMによる自動パースは、ntc-templates に登録されているコマンドに依存しています。
もし、マイナーなコマンドを実行したり、機器のOSバージョンが新しすぎたり(あるいは古すぎたり)すると、パースがうまく機能せず、通常の「テキスト(文字列)」としてデータが返ってきてしまうことがあります。
コード内で isinstance(interfaces, list) を使って、結果がちゃんとリスト(構造化された状態)になっているかチェックしているのはそのためです。
2. 環境変数の設定が必要な場合がある
古いNetmikoや特定の環境では、TextFSMがテンプレートを探す場所を指定する環境変数 NET_TEXTFSM の設定が必要になることがあります。
もし「Template not found」のようなエラーが出た場合は、Pythonコードの先頭付近に以下のような設定を追加することで解決する場合があります。
import os
# ntc-templatesのパスを環境変数に設定する例(環境に合わせて調整します)
# 最近のNetmikoでは自動検出されることが多いですが、動かない場合の備えです
# os.environ["NET_TEXTFSM"] = "/path/to/ntc-templates/templates"
3. セキュリティへの配慮
コードの中に直接パスワードを書き込む(ハードコーディングする)のは、セキュリティ上あまり好ましくありません。
練習用ならこれでも良いですが、実際の環境で使うときは、getpass ライブラリを使って実行時にパスワードを入力させたり、環境変数から読み込むように工夫することをお勧めします。
![]()
【Hiroki】
セキュリティのことも考えてプログラムを作れるようになると、よりプロっぽくなりますね。
パスワードの入力方法についても調べてみます!
まとめ
![]()
【Yuki】
今回は、NetmikoとPandasを連携させて、ネットワーク機器の情報を効率的に収集・整理する方法について学びました。
- Netmikoを使えば、ネットワーク機器へのSSH接続とコマンド実行を自動化できる。
use_textfsm=Trueを使うことで、コマンド実行結果を扱いやすい「構造化データ(辞書のリスト)」に自動変換できる。- Pandasにデータを渡すことで、表形式(DataFrame)として簡単にデータの絞り込みや加工ができ、CSVやExcelへの出力も数行で書ける。
- 複数台の処理を行うときは、
try-exceptによる丁寧なエラーハンドリングが必須となる。
![]()
【Hiroki】
すごく分かりやすかったです!ネットワークの管理って手作業が多くて大変なイメージでしたけど、Pythonを組み合わせることでこんなにスマートに解決できるんだと知って、勉強するモチベーションがさらに湧いてきました。
さっそく、部活の仮想環境でテストスクリプトを動かしてみます!
![]()
【Yuki】
そう言ってもらえると、わたしもとても嬉しいです……。
ネットワークの世界は、物理的な線で繋がっているようでいて、こうしてソフトウェアの力で自由自在に制御できる面白さがあります。
もしまた分からないことや、もっと複雑な処理に挑戦したくなったら、いつでも気軽に聞いてくださいね。応援しています。
![]()
【Hiroki】
ありがとうございます、Yukiさん!また教えてください!
参考情報ソース - Netmiko GitHub Repository - Pandas Official Documentation - ntc-templates (NetworkToCode) GitHub
この記事では基礎を解説しましたが、実務においては「もっと複雑なデータを扱いたい」「独自のシステムに組み込みたい」といった、個別の課題に直面することも多いはずです。
「自分で書く時間は最小限に抑え、プロの品質でツールを完成させたい」という方は、ぜひ一度ご相談ください。
- 専門家の知見に基づいた、保守性の高いコード設計
- AIの専門家による、Gemini API等の最新AIを組み合わせた高度な自動化
- ChatGPT等が生成したコードのデバッグ・最適化
「教わる」だけでなく「形にする」パートナーとして、フリーランスエンジニアのmei_13が最短ルートでの解決をサポートします。
初心者から始められるPythonレッスン
● 月額4,000円で質問し放題!!
● 完全オンライン
● 翌日までには必ず返信
● 挫折しない独自の学習メソッド
● 圧倒的高評価!!
● テキストベースで時間を選ばない
● 4,000円/60分の伴走型ビデオチャット指導も可能
● 高品質なサンプルコード
詳細はこちら

