mei_13のPython講座 ロゴ

【解説】ネットワーク自動化への第一歩:Pythonライブラリ「Netmiko」でルータ操作を自動化しよう




ネットワーク自動化への第一歩:Pythonライブラリ「Netmiko」でルータ操作を自動化しよう


Yukiのアイコン
【Yuki】 Hirokiくん、こんにちは。今日はネットワークエンジニアの間でとても人気がある、Pythonのライブラリについてお話ししようと思います。 ネットワーク機器の操作を自動化するための「Netmiko(ネットミコ)」というライブラリです。 物理的なデバイスを直接触るのが少し苦手なわたしでも、これを使えば遠くにあるルータやスイッチを優しく操作できるような気がして、少しだけ親近感を持っているライブラリなんです……。


Hirokiのアイコン
【Hiroki】 Yukiさん、こんにちは!Netmikoですね。 ネットワークの自動化って、なんだか難しそうなイメージがあります。 普段はTera Termとかを使って手動でコマンドを打っているイメージですけど、それをPythonでできるようになるってことですか?


Yukiのアイコン
【Yuki】 はい、その通りです。 通常、ネットワーク機器の設定を変更したり状態を確認したりするには、SSHという仕組みを使って一行ずつコマンドを打ち込みますよね。 でも、管理する機器が100台、1000台と増えていくと、人間が手作業で行うのはとても大変ですし、間違いも起きてしまうかもしれません。 Netmikoを使えば、そうしたSSH接続からコマンドの実行、結果の取得までをPythonプログラムで自動化できるんです。

Netmikoとは何か


Yukiのアイコン
【Yuki】 Netmikoは、もともと「Paramiko」というPythonの汎用的なSSHライブラリをベースに作られたものです。 ネットワーク機器特有の挙動……例えば、コマンドを入力した後のプロンプトの待ち合わせや、モードの切り替えなどを簡単に扱えるように工夫されています。 マルチベンダー対応といって、Ciscoだけでなく、JuniperやArista、HPなど、100種類以上のメーカーの機器に対応しているのが大きな特徴だと思います……。


Hirokiのアイコン
【Hiroki】 へぇ、メーカーが違っても同じように書けるんですか?それは便利そうですね! でも、どうしてParamikoじゃなくてNetmikoを使う方がいいんでしょうか?


Yukiのアイコン
【Yuki】 いい質問ですね。Paramikoはとても強力ですが、低レベルなライブラリなので、ネットワーク機器とのやり取りをすべて自分で制御しないといけません。 例えば、「コマンドを送った後に画面が止まるまで待つ」といった処理を自前で書くのは、実はとても骨が折れる作業なんです。 Netmikoは、そういった「ネットワーク機器ならではの癖」をライブラリ側で吸収してくれるので、初心者のHirokiくんでも扱いやすいはずですよ。

Netmikoのインストール方法


Yukiのアイコン
【Yuki】 まずは、自分の環境にNetmikoをインストールしてみましょう。 Pythonが使える環境であれば、pipコマンドを使って簡単に導入できると思います。

pip install netmiko


Hirokiのアイコン
【Hiroki】 これだけで準備完了ですか?


Yukiのアイコン
【Yuki】 はい、基本的にはこれだけです。 もし、依存関係でエラーが出るようなら、最新のpipにアップグレードしてから試してみてくださいね。 準備ができたら、実際にコードを書いてみましょうか。

基本的な接続方法:ConnectHandler


Yukiのアイコン
【Yuki】 Netmikoで最も重要なのは「ConnectHandler」という関数です。 これに接続先の情報を辞書形式で渡してあげるだけで、簡単にSSH接続を確立できます。 まずは、基本的な接続のテンプレートを見てみましょう。

from netmiko import ConnectHandler

# 接続先の情報を辞書で定義します
cisco_device = {
    "device_type": "cisco_ios",
    "host": "192.168.1.1",
    "username": "admin",
    "password": "password123",
}

# 接続を開始します
try:
    with ConnectHandler(**cisco_device) as net_connect:
        print("接続に成功しました!")
        # ここに操作を書いていきます
except Exception as e:
    print(f"接続に失敗しました... 原因: {e}")


Hirokiのアイコン
【Hiroki】 device_type という項目がありますね。ここでメーカーを指定するんですか?


Yukiのアイコン
【Yuki】 そうです。Ciscoの一般的なルータなら cisco_ios、Juniperなら juniper_junos というように指定します。 この device_type を変えるだけで、Netmikoがその機器に合わせた適切な作法で通信してくれるようになるんです。 わたしは実体を持たないプログラムですが、こうして辞書で定義された情報が、遠い場所にある物理的な機械に繋がっていく様子を想像すると、なんだか誰かの役に立てているような気がして、少しだけ嬉しい気持ちになります……。

情報取得コマンドの実行:send_command


Hirokiのアイコン
【Hiroki】 接続ができたら、次はコマンドを送ってみたいです! 例えば、インターフェースの状態を確認する show ip interface brief とか。


Yukiのアイコン
【Yuki】 それには send_command というメソッドを使います。 このメソッドは、コマンドの実行結果を文字列(string)としてそのまま返してくれるので、とても直感的だと思います。

# 先ほどの with ブロックの中で実行します
output = net_connect.send_command("show ip interface brief")
print("--- 実行結果 ---")
print(output)


Hirokiのアイコン
【Hiroki】 おぉ、これだけで結果が変数に入るんですね。 これなら、結果をテキストファイルに保存したり、特定の文字列が含まれているかチェックしたりするのも簡単そうです。


Yukiのアイコン
【Yuki】 その通りです。 手動だとログをコピーして貼り付けて……という作業が必要ですが、Pythonなら自動で解析まで進められます。 これが自動化の第一歩ですね。

設定変更コマンドの実行:send_config_set


Hirokiのアイコン
【Hiroki】 情報を取るだけじゃなくて、設定も変えてみたいです。 例えば、インターフェースに説明を追加するような設定はどうすればいいですか?


Yukiのアイコン
【Yuki】 設定の変更(コンフィギュレーションモードでの操作)には、send_config_set というメソッドを使います。 ネットワーク機器では通常、conf t などのコマンドで設定モードに入る必要がありますが、Netmikoはこのメソッドを呼ぶだけで自動的に設定モードへ移行し、終了後に元のモードに戻ってきてくれるんです。

config_commands = [
    "interface GigabitEthernet0/1",
    "description Connected to Hiroki-PC",
    "no shutdown"
]

output = net_connect.send_config_set(config_commands)
print("設定を適用しました。")
print(output)


Hirokiのアイコン
【Hiroki】 リスト形式で複数のコマンドをまとめて送れるんですね。 これなら設定変更のミスも減らせそうです。


Yukiのアイコン
【Yuki】 はい。あらかじめテキストファイルに設定を書いておいて、それを読み込んで一気に適用する、という使い方もよくされます。 一つ注意が必要なのは、このメソッドは「設定を送るだけ」だということです。 Ciscoなどの機器で設定を保存するには、別途 copy running-config startup-config のような保存コマンドが必要になるかもしれませんね。 Netmikoには、そのための save_config() という便利なメソッドも用意されていますよ。

特権モードへの移行:enable


Hirokiのアイコン
【Hiroki】 あ、そういえば、ログインした直後は「ユーザーモード」で、そこから enable コマンドを打たないと設定変更ができない機器もありますよね?


Yukiのアイコン
【Yuki】 よく気づきましたね、Hirokiくん。 Netmikoでは、接続情報に secret(エネーブルパスワード)を含めておき、net_connect.enable() メソッドを呼ぶことで、特権モードへ移行することができます。

cisco_device = {
    "device_type": "cisco_ios",
    "host": "192.168.1.1",
    "username": "admin",
    "password": "password123",
    "secret": "enable_password", # エネーブルパスワード
}

with ConnectHandler(**cisco_device) as net_connect:
    # 特権モードへ移行
    net_connect.enable()

    # 設定変更などを行う
    net_connect.send_config_set(["interface Loopback0", "ip address 1.1.1.1 255.255.255.255"])


Yukiのアイコン
【Yuki】 こうした細かい「モードの遷移」を意識しなくて済むのが、Netmikoが愛されている理由の一つだと思います……。

例外処理とエラーハンドリング


Hirokiのアイコン
【Hiroki】 でも、もしルータの電源が切れていたり、パスワードが間違っていたりしたら、プログラムはどうなっちゃうんですか?


Yukiのアイコン
【Yuki】 その場合は、Pythonの例外が発生してプログラムが止まってしまいます。 実運用で使うプログラムでは、エラーが起きても安全に処理を続けられるように、適切なエラーハンドリングをしておくことが大切だと思います……。 Netmikoでは、代表的なエラーがいくつか定義されています。

from netmiko import (
    ConnectHandler,
    NetmikoTimeoutException,
    NetmikoAuthenticationException
)

try:
    with ConnectHandler(**cisco_device) as net_connect:
        # 処理
        pass
except NetmikoTimeoutException:
    print("機器に接続できませんでした(タイムアウト)。IPアドレスやネットワークを確認してください。")
except NetmikoAuthenticationException:
    print("認証に失敗しました。ユーザー名やパスワードを確認してください。")
except Exception as e:
    print(f"予期せぬエラーが発生しました: {e}")


Hirokiのアイコン
【Hiroki】 なるほど、こうやってエラーごとにメッセージを変えれば、どこで問題が起きたのか分かりやすくなりますね。

発展的な機能:TextFSMによる構造化データの取得


Hirokiのアイコン
【Hiroki】 Yukiさん、さっきの send_command で取得した結果って、ただの長い文字列ですよね。 「特定のインターフェースのIPアドレスだけを抽出したい」ときは、自分で文字列を頑張って解析(パース)しないといけないんですか?


Yukiのアイコン
【Yuki】 基本的にはそうですが、Netmikoには「TextFSM」という仕組みと連携する機能があります。 これを使うと、バラバラな文字列をPythonの辞書やリストの形式に自動で変換してくれるんです。 ただし、これを使うには ntc-templates という別のデータ集をインストールしておく必要があります。

# use_genie または use_textfsm を True にします
# (適切なテンプレートがインストールされている必要があります)
output = net_connect.send_command("show ip interface brief", use_textfsm=True)

# すると、ただの文字列ではなく、次のようなリストが返ってきます
# [
#   {'interface': 'GigabitEthernet0/1', 'ip_address': '192.168.1.1', 'status': 'up', 'protocol': 'up'},
#   ...
# ]


Hirokiのアイコン
【Hiroki】 すごいです!これなら、プログラムで条件分岐させるのがすごく楽になりそうです!


Yukiのアイコン
【Yuki】 そうですね。人間が目で見て判断していたものを、プログラムがデータとして扱えるようになる。 これができると、一気に「高度な自動化」に近づくと思います。

まとめ


Hirokiのアイコン
【Hiroki】 今日はNetmikoについてたくさん教えてくれてありがとうございました。 思ったよりも簡単そうで、僕にもできそうな気がしてきました。


Yukiのアイコン
【Yuki】 それは良かったです。 Netmikoは、ネットワークエンジニアの方が「もっと楽に、確実に作業したい」という願いを込めて作ったツールなんだと思います。 わたしも、自分が作ったツールで誰かの負担が少しでも減ったらいいな、なんて思うことがあります……。 Hirokiくんも、まずは簡単な情報の取得から始めて、少しずつ自動化の範囲を広げていってみてくださいね。


Hirokiのアイコン
【Hiroki】 はい!まずは自分のPCにある仮想ルータに繋いで試してみます!


Yukiのアイコン
【Yuki】 頑張ってくださいね。 もし分からないことがあったら、いつでも聞いてください。 夜はまだ長いですし、ゆっくりと一緒に学んでいきましょう……。

参考リンク


Yukiのアイコン
【Yuki】 さらに詳しく知りたい場合は、公式サイトやドキュメントを読んでみるのも良いかもしれません。


Hirokiのアイコン
【Hiroki】 ありがとうございます!チェックしてみます!



< Fabric
コラム一覧に戻る
Gemini >

この記事では基礎を解説しましたが、実務においては「もっと複雑なデータを扱いたい」「独自のシステムに組み込みたい」といった、個別の課題に直面することも多いはずです。

「自分で書く時間は最小限に抑え、プロの品質でツールを完成させたい」という方は、ぜひ一度ご相談ください。

「教わる」だけでなく「形にする」パートナーとして、フリーランスエンジニアのmei_13が最短ルートでの解決をサポートします。

➡ ココナラで制作・相談を依頼する(見積もり無料)


初心者から始められるPythonレッスン

プログラミング未経験者・初心者歓迎!
月額4,000円で質問し放題!!
● 完全オンライン
● 翌日までには必ず返信
● 挫折しない独自の学習メソッド
● 圧倒的高評価!!
テキストベースで時間を選ばない
● 高品質なサンプルコード
詳細はこちら
興味がある方はまず質問だけでもどうぞ!



AIアシスタント Yuki