一般社団法人 全国個人事業主支援協会

COLUMN コラム

  • ネットワーク自動化入門:Pythonとnetmikoで始めるインフラ管理

ネットワーク自動化が必要な理由

ネットワークインフラの管理は、長らく手作業によるCLI操作が主流でした。しかし、クラウドやコンテナ環境の拡大に伴いネットワーク構成は複雑化の一途を辿っており、手動オペレーションでは対応しきれない規模になってきています。設定ミスによる障害、変更作業の属人化、監査対応の煩雑さなど、従来のやり方では解決困難な課題が山積しています。

Pythonはネットワーク自動化の分野で最も広く使われているプログラミング言語であり、netmikoはその中核を担うライブラリのひとつです。本記事では、netmikoを使ったネットワーク機器の自動化について、基礎から実践的なユースケースまでを解説します。

netmikoとは

netmikoは、Pythonでネットワーク機器にSSH接続し、コマンドの実行や設定変更を自動化するためのライブラリです。ParamikoというSSHライブラリをベースとしつつ、ネットワーク機器特有のプロンプト処理やページング制御を抽象化してくれるのが大きな特徴です。

対応機器はCisco IOS、Juniper JunOS、Arista EOS、Palo Alto PAN-OSなど非常に幅広いです。まずはインストールから始めよう。

pip install netmiko

基本的な接続と情報取得

netmikoの基本的な使い方として、まずはネットワーク機器への接続とshowコマンドの実行を見てみましょう。

from netmiko import ConnectHandler

device = {
"device_type": "cisco_ios",
"host": "192.168.1.1",
"username": "admin",
"password": "admin_pass",
"secret": "enable_pass",
}

with ConnectHandler(**device) as conn:
conn.enable()
output = conn.send_command("show running-config")
print(output)

ConnectHandlerに機器情報を渡して接続を確立し、send_commandでshowコマンドを実行します。device_typeを正しく指定することで、netmikoが適切なプロンプトパターンやコマンド送信方法を自動的に選択してくれます。

設定変更の自動化

showコマンドだけでなく、設定変更も自動化できます。以下はVLANの作成とインターフェースへの割り当てを行う例です。

config_commands = [
"vlan 100",
"name PRODUCTION",
"exit",
"interface GigabitEthernet0/1",
"switchport mode access",
"switchport access vlan 100",
"no shutdown",
]

with ConnectHandler(**device) as conn:
conn.enable()
output = conn.send_config_set(config_commands)
print(output)
conn.save_config()

send_config_setメソッドは、自動的にconfiguration modeに入り、コマンドリストを順次実行し、最後にconfiguration modeを抜ける処理を行ってくれます。save_configで設定の永続化も忘れずに行おう。

複数機器への一括操作

実運用では、数十台から数百台の機器に対して同じ操作を実行する場面が頻繁にあります。Pythonのマルチスレッドを組み合わせることで効率的に処理できます。

from concurrent.futures import ThreadPoolExecutor
from netmiko import ConnectHandler

devices = [
{"device_type": "cisco_ios", "host": "192.168.1.1", "username": "admin", "password": "pass"},
{"device_type": "cisco_ios", "host": "192.168.1.2", "username": "admin", "password": "pass"},
{"device_type": "cisco_ios", "host": "192.168.1.3", "username": "admin", "password": "pass"},
]

def get_version(device):
try:
with ConnectHandler(**device) as conn:
output = conn.send_command("show version")
return {"host": device["host"], "status": "success", "output": output}
except Exception as e:
return {"host": device["host"], "status": "error", "output": str(e)}

with ThreadPoolExecutor(max_workers=5) as executor:
results = list(executor.map(get_version, devices))

for result in results:
print(f"{result['host']}: {result['status']}")

ThreadPoolExecutorを使うことで、複数機器への接続を並列に実行できます。max_workersは同時接続数を制御するパラメータだが、あまり大きくするとネットワーク機器側のSSHセッション上限に達する場合があるため、適切な値を設定しましょう。

実践的なユースケース:設定バックアップ

日常的なネットワーク運用で最もニーズが高いのが、設定のバックアップでしょう。以下は設定を取得してファイルに保存する実用的なスクリプトです。

import os
from datetime import datetime
from netmiko import ConnectHandler

def backup_config(device, backup_dir="./backups"):
os.makedirs(backup_dir, exist_ok=True)
hostname = device["host"]
timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
filename = f"{backup_dir}/{hostname}_{timestamp}.cfg"

with ConnectHandler(**device) as conn:
conn.enable()
config = conn.send_command("show running-config")

with open(filename, "w") as f:
f.write(config)

print(f"Backup saved: {filename}")
return filename

このスクリプトをcronやスケジューラで定期実行すれば、自動バックアップの仕組みが構築できます。さらにGitリポジトリにコミットするように拡張すれば、設定の変更履歴も追跡可能になります。

エラーハンドリングとタイムアウト

ネットワーク機器への自動化では、接続エラーやタイムアウトへの対処が不可欠です。netmikoでは以下のようにタイムアウトやリトライを設定できます。

from netmiko import ConnectHandler
from netmiko.exceptions import NetmikoTimeoutException, NetmikoAuthenticationException

device = {
"device_type": "cisco_ios",
"host": "192.168.1.1",
"username": "admin",
"password": "pass",
"timeout": 30,
"conn_timeout": 15,
}

try:
with ConnectHandler(**device) as conn:
output = conn.send_command("show interfaces", read_timeout=60)
print(output)
except NetmikoTimeoutException:
print(f"接続タイムアウト: {device['host']}")
except NetmikoAuthenticationException:
print(f"認証エラー: {device['host']}")
except Exception as e:
print(f"予期しないエラー: {e}")

timeoutはSSH接続全体のタイムアウト、conn_timeoutはTCP接続のタイムアウト、read_timeoutはコマンド実行時の応答待ちタイムアウトです。機器の応答が遅いコマンド(show techなど)ではread_timeoutを長めに設定することを推奨します。

netmikoの先にあるもの

netmikoはネットワーク自動化の入口として最適なライブラリだが、さらにスケールする場合はAnsible(ansible.netcommonコレクション)やNornir、NAPALMといったフレームワークも検討するとよいです。特にNornirはPythonネイティブなフレームワークで、netmikoをプラグインとして利用しながらインベントリ管理やタスク並列実行を統合的に扱える。

筆者の経験では、まずnetmikoで自動化の基礎を学び、機器台数が増えてきたらNornirやAnsibleへステップアップするのが王道のパスです。重要なのは、小さく始めて着実に自動化の範囲を広げていくことです。

まとめ

Pythonとnetmikoの組み合わせは、ネットワーク自動化への第一歩として非常に強力です。手動オペレーションをスクリプトに置き換えることで、作業の再現性と効率が劇的に向上します。まずは情報取得の自動化から始め、徐々に設定変更の自動化へと範囲を広げていくことを推奨します。

この記事をシェアする

  • Twitterでシェア
  • Facebookでシェア
  • LINEでシェア