CTC 教育サービス
[IT研修]注目キーワード Python Power Platform 最新技術動向 生成AI Docker Kubernetes
みなさん、こんにちは。
前回は、NAPALMやNetmikoを使ってネットワーク機器の状態を自動的に取得する方法を紹介しました。これにより、複数の機器に対して定期的に情報を取得し、手間なく一元的に状況を把握できるようになりました。ただ、取得した情報をその場で画面に表示するだけでは、後から分析したり可視化したりすることができません。そこで今回は、収集した情報を時系列で記録・蓄積し、後続のExcel出力やダッシュボード構築にも活用できるように、SQLiteを使ってデータベースに保存する仕組みを構築します。
SQLiteは、サーバー不要でファイル単体で扱える軽量なRDBMSです。Pythonには標準でsqlite3モジュールが用意されており、追加のインストールが不要で手軽に使える点が魅力です。また、ファイル単位で管理できるため、バックアップやレポート用途に最適です。 今回は、以下のような情報を保存することを想定しています。
まずは、保存するデータの構造を設計します。以下のような2つのテーブルを用意するとシンプルで使いやすくなります。
CREATE TABLE device_status (
id INTEGER PRIMARY KEY AUTOINCREMENT,
hostname TEXT,
ip_address TEXT,
timestamp TEXT,
cpu_usage REAL,
memory_usage REAL
);
CREATE TABLE interface_traffic (
id INTEGER PRIMARY KEY AUTOINCREMENT,
device_id INTEGER,
interface_name TEXT,
tx_bytes INTEGER,
rx_bytes INTEGER,
FOREIGN KEY(device_id) REFERENCES device_status(id)
);
この構造により、1回の取得に対して全体のステータスとインターフェースごとの詳細がきれいに分離できます。
それでは、NAPALMで取得した情報をSQLiteに保存する処理をPythonで実装してみましょう。
import sqlite3
from datetime import datetime
from napalm import get_network_driver
# データベースに接続(なければ作成)
conn = sqlite3.connect(’network_monitor.db’)
cur = conn.cursor()
# テーブル作成(初回のみ)
cur.execute(’’’
CREATE TABLE IF NOT EXISTS device_status (
id INTEGER PRIMARY KEY AUTOINCREMENT,
hostname TEXT,
ip_address TEXT,
timestamp TEXT,
cpu_usage REAL,
memory_usage REAL
)
’’’)
cur.execute(’’’
CREATE TABLE IF NOT EXISTS interface_traffic (
id INTEGER PRIMARY KEY AUTOINCREMENT,
device_id INTEGER,
interface_name TEXT,
tx_bytes INTEGER,
rx_bytes INTEGER,
FOREIGN KEY(device_id) REFERENCES device_status(id)
)
’’’)
# 監視対象のデバイス
devices = [
{’hostname’: ’192.168.1.1’, ’username’: ’admin’, ’password’: ’admin123’, ’platform’: ’ios’}
]
# 情報取得と保存
for device_info in devices:
driver = get_network_driver(device_info[’platform’])
device = driver(device_info[’hostname’], device_info[’username’], device_info[’password’])
device.open()
facts = device.get_facts()
env = device.get_environment()
intfs = device.get_interfaces_counters()
timestamp = datetime.now().isoformat()
cpu = env[’cpu’][0][’usage’]
mem = env[’memory’]
memory_usage = mem[’used_ram’] / mem[’available_ram’] * 100
# デバイス全体の情報を保存
cur.execute(’’’
INSERT INTO device_status (hostname, ip_address, timestamp, cpu_usage, memory_usage)
VALUES (?, ?, ?, ?, ?)
’’’, (facts[’hostname’], device_info[’hostname’], timestamp, cpu, memory_usage))
device_id = cur.lastrowid
# 各インターフェースのトラフィックを保存
for intf, data in intfs.items():
cur.execute(’’’
INSERT INTO interface_traffic (device_id, interface_name, tx_bytes, rx_bytes)
VALUES (?, ?, ?, ?)
’’’, (device_id, intf, data[’tx_octets’], data[’rx_octets’]))
device.close()
conn.commit()
conn.close()
このスクリプトを実行すると、収集したデータがnetwork_monitor.dbというSQLiteファイルに時系列で保存されます。なお、今回の監視対象デバイスは、「’platform’: ’ios’」としており、これはCisco機器用です。YamahaやJuniperなど他ベンダーを対象にする場合は、事前に対応状況を確認しておく必要があります。また、認証情報は環境変数や外部ファイル(YAML)で管理したほうがよいでしょう。
今回は、ネットワーク機器から収集した情報をSQLiteに保存する方法を紹介しました。単なる一時的な出力ではなく、履歴として記録していくことで、後からの分析や可視化、レポート作成に大きく役立ちます。
今回のスクリプトは日次または週次で実行されることを前提としているので、次回(第3回)では、cronなどを使った定期実行の仕組みを紹介します。スクリプトを一定の間隔で実行することで、常に最新のデータがDBに反映され、リアルタイムに近い可視化が実現できるようになります。次回もどうぞお楽しみに。
[IT研修]注目キーワード Python Power Platform 最新技術動向 生成AI Docker Kubernetes