5分で最初のスクリプトを動かす
スイッチに手動でログインするのは、ジュニアエンジニアにとっての通過儀礼のようなものです。しかし、金曜日の夜11時に50台のアクセスレイヤースイッチのVLAN変更が必要なスプレッドシートを目の前にしたとき、手動での対応はミスの元です。私は何年もコマンドをコピー&ペーストし、1行も間違えていないことを祈りながら過ごしてきました。Pythonならそれを解決できます。
Netmikoはこの分野の業界標準です。Paramikoをベースに構築されており、特にネットワーク機器向けに設計されています。煩わしい「ページング」問題(–More–プロンプト)を処理し、enableプロンプトを自動的に検出し、Cisco、Juniper、Aristaデバイス間でのSSHプロセスを簡素化します。
まずはクリーンな環境を構築することから始めましょう。私はシステムを整理しておくために、常に仮想環境を使用しています。次の3行でNetmikoをインストールしてください。
python3 -m venv venv
source venv/bin/activate
pip install netmiko
基本的な接続スクリプトは驚くほど短いです。以下は、1台のCisco IOSルーターに接続してインターフェースの状態を取得する方法です。
from netmiko import ConnectHandler
cisco_router = {
'device_type': 'cisco_ios',
'host': '192.168.1.10',
'username': 'admin',
'password': 'セキュアなパスワード',
'secret': 'enableパスワード',
}
# 接続を開いてコマンドを実行する
with ConnectHandler(**cisco_router) as net_connect:
net_connect.enable()
output = net_connect.send_command("show ip int brief")
print(output)
Pythonのwith構文はここで非常に役立ちます。たとえコードがクラッシュしても、SSH接続が適切に閉じられることを保証します。これにより、コアスイッチに20もの「ゴースト」SSHセッションが残り、他のエンジニアのログインを妨げるのを防ぐことができます。
500台のデバイスへのスケールアップ
1台のデバイスに接続するのは単なる概念実証(PoC)に過ぎません。本当の魔法は、データセンター全体をループで処理するときに起こります。従来の管理者の役割からDevOps重視のエンジニアリング職にステップアップしたいなら、これこそが必要なスキルです。
IPアドレスをハードコードしてはいけません。代わりに、デバイスリストをdevices.yamlファイルやプレーンテキストのリストに保存します。これにより、スクリプトを異なる拠点間で再利用できるようになります。数秒で複数のホストのCPU使用率を確認する方法を見てみましょう。
from netmiko import ConnectHandler
devices = ['10.0.0.1', '10.0.0.2', '10.0.0.3']
for host in devices:
device_info = {
'device_type': 'cisco_ios',
'host': host,
'username': 'admin',
'password': 'パスワード',
}
try:
print(f"--- {host} に接続中 ---")
with ConnectHandler(**device_info) as net_connect:
output = net_connect.send_command("show version | include uptime")
print(output)
except Exception as e:
print(f"{host} への接続に失敗しました: {str(e)}")
大規模な環境では、エラーハンドリングは必須です。オフラインのスイッチが1台あるだけでスクリプト全体が停止してはいけません。「try-except」ブロックを使用することで、スクリプトは失敗をログに記録し、次のIPに移動できます。これは、自動化を成功させるか、一時的なタイムアウトのせいで作業が半分で止まったまま目覚めるかの違いを生みます。
設定モードとShowコマンドの使い分け
send_command()がデータ収集用であるのに対し、変更を加えるにはsend_config_set()が必要です。このメソッドは、自動的に設定モードに入り、コマンドを流し込み、正常に終了します。また、一部の古いスーパーバイザーが新しい設定を適用する際に必要とするわずかな遅延も処理します。
commands = [
'vlan 100',
'name VOIP_VLAN',
'interface GigabitEthernet0/1',
'description Pythonにより設定',
'switchport access vlan 100',
'switchport mode access'
]
with ConnectHandler(**cisco_router) as net_connect:
output = net_connect.send_config_set(commands)
print(output)
net_connect.send_command("write memory")
複雑な変更とセキュリティの管理
自動化の規模が大きくなると、200行のACLのような大規模な設定ブロックを流し込む必要が出てきます。Netmikoはこれをsend_config_from_file()で処理します。これにより、Pythonのロジックをベンダー固有の構文から分離でき、コードの可読性が大幅に向上します。
セキュリティも大きな課題です。スクリプトにパスワードをハードコードするのは、懲戒解雇レベルのミスです。代わりに環境変数やVaultを使用しましょう。Linuxでは、osモジュールを使用してシェル環境から直接認証情報を取得できます。
import os
password = os.getenv("NET_PASS")
マルチベンダー環境はどうでしょうか? Netmikoは100以上のプラットフォームをサポートしています。Cisco IOSとJuniper Junosが混在している場合は、device_typeキーを'juniper_junos'に切り替えるだけです。APIは同じままです。これは、ヘテロジニアス(異機種混在)なネットワークにおいて大幅な時間の節約になります。
安全な自動化のための実践的なルール
ネットワークの自動化は非常に重要です。1分間に1,000台のデバイスを修正できますが、同じ速さでそれらを壊すこともできます。スクリプト内の「no」の記述ミスでラック全体がダウンするのを見たことがあります。安全性を保つために、以下のルールに従ってください。
- ラボでのシミュレーション: GNS3やCisco Modeling Labs (CML)を使用してください。仮想IOSインスタンスで動作すれば、実機でも95%の確率で動作します。
- すべてのバイトをログに記録: スクリプトの出力をタイムスタンプ付きのファイルにリダイレクトします。ネットワークに問題が発生した場合、何がどこに送信されたかの正確な記録が必要です。
- 分かりやすいタグを使用: スクリプトがインターフェースを変更するときは、
description Configured by Python-Auto [2026-04-10](Python自動設定により構成)のような説明を追加します。これにより、誰が(あるいは何が)設定を触ったのか同僚に正確に伝わります。 - まずは読み取り専用から: ‘show inventory’のようなデータを取得するだけのスクリプトを書いて自信をつけましょう。接続ロジックに100%の確信が持てるまで、設定モードには触れないでください。
最後にアドバイスです。fast_cliオプションを無視しないでください。ネットワークが安定しており、ハードウェアが最新であれば、'fast_cli': Trueに設定することで実行時間を50%短縮できます。これにより、コマンド間の人工的な「待機」タイマーが短縮されます。ただし、古い2960シリーズなどには注意してください。それらは入力を処理するためにまだ数ミリ秒の余裕を必要とします。
日常業務の自動化は、単なる時間の節約ではありません。一貫性が重要です。スクリプトは「write memory」を忘れたり、「no shutdown」コマンドを見落としたりしません。Netmikoをマスターしたら、NornirやAnsibleのような高度なオーケストレーションツールにステップアップできます。

