ネットワークエンジニアのプログラミング入門として、PythonでSNMPGetを行い、ネットワーク機器からトラフィック情報を取得します。また、トラフィックグラフもPythonで作成します。
SNMPの基礎については、下記を参照してください。

トラフィックグラフをブラウザ上で表示する方法は、下記を参照してください。

- Progate 〜 プログラミングの入門なら基礎から学べるProgate[プロゲート]
- ドットインストール 〜 3分動画でマスターできるプログラミング学習サービス
どちらのサイトも無料で学習可能な範囲があります。有料コンテンツに関しては、月額1000円程度です。
目標作成物
Pythonでコーディングして、2つのツールを作成します。
- SNMPGetツール(snmpget.py)
- ネットワーク機器に対してSNMPGetを実行しトラフィック情報を取得し、CSVファイルに保存する。
CSVファイルの例
date,time,In,Out
2022/09/17,16:35:00,6870336,4061131
2022/09/17,16:36:00,6871637,4061602
2022/09/17,16:37:00,6872998,4062073
2022/09/17,16:38:00,6874359,4062561
2022/09/17,16:39:00,6875660,4063032
- トラフィックグラフ作成ツール(trafficgraph.py)
- トラフィック情報(CSVファイル)をグラフ化する。
トラフィックグラフの例
PythonによるSNMPGetツール
ネットワーク環境
3台のルーターに対してSNMPGetを実行し、トラフィック情報を取得します。
各ルーターの設定は下記の通りです。
interface GigabitEthernet0/0
ip address 192.168.100.1 255.255.255.0
snmp-server community public RO
interface GigabitEthernet0/0
ip address 192.168.100.2 255.255.255.0
snmp-server community public RO
interface GigabitEthernet0/0
ip address 192.168.100.3 255.255.255.0
snmp-server community public RO
利用するライブラリ
Pythonでは様々な便利な機能が使える「ライブラリ」というものを利用します。
- pysnmp
- PythonでSNMPを利用するためのライブラリ
- schedule
- 定期的に処理を実行するためのライブラリ
- datetime
- 日時(日付や時間・時刻)の情報を処理するためのライブラリ
- time
- 時間を扱うためのライブラリ
ディレクトリ構成 ・出力先ファイル作成
ディレクトリ構成は下記の通りです。
- snmpget.py (Pythonプログラム)
- pysnmplog (出力先ファイル格納ディレクトリ)
- Router1_pysnmp.csv
- Router2_pysnmp.csv
- Router3_pysnmp.csv
出力先のcsvファイルを作成します。
echo date,time,In,Out > Router1_pysnmp.csv
echo date,time,In,Out > Router2_pysnmp.csv
echo date,time,In,Out > Router3_pysnmp.csv
Terminal[pysnmplog]: echo date,time,In,Out > Router1_pysnmp.csv
Terminal[pysnmplog]: cat Router1_pysnmp.csv
date,time,In,Out
Pythonコード
SNMPGetを実行するプログラムは『snmpget.py』として、下記のコードを記述します。
from pysnmp.hlapi import *
import schedule
import datetime
import time
def job():
# 日付と時刻をカンマ区切りで取得
dt_now = datetime.datetime.now().strftime('%Y/%m/%d,%H:%M:%S')
print(dt_now)
# 取得対象機器を定義
node_list = {
"Router1": "192.168.100.1",
"Router2": "192.168.100.2",
"Router3": "192.168.100.3"
}
# 対象機器の台数分を繰り返し処理
for name in node_list.keys():
f = open('./pysnmplog/' + name + '_pysnmp.csv', 'a')
iterator = getCmd(
SnmpEngine(),
CommunityData('public'),
UdpTransportTarget((node_list[name], 161)),
ContextData(),
ObjectType(ObjectIdentity('IF-MIB', 'ifHCInOctets', 1)),
ObjectType(ObjectIdentity('IF-MIB', 'ifHCOutOctets', 1))
)
errorIndication, errorStatus, errorIndex, varBinds = next(iterator)
if errorIndication:
print(errorIndication)
elif errorStatus:
print('%s at %s' % (errorStatus.prettyPrint(),
errorIndex and varBinds[int(errorIndex) - 1][0] or '?'))
else:
print(name + " " + str(varBinds[0][1]) + "," + str(varBinds[1][1]))
f.write(dt_now + "," + str(varBinds[0][1]) + "," + str(varBinds[1][1]) + '\n')
f.close()
# 1分毎に実行
schedule.every().minute.at(":00").do(job)
while True:
schedule.run_pending()
time.sleep(1)
SNMPGetツールの実行結果
SNMPGetツールを実行すると、下記の通り表示され、出力先ファイルに追記されていきます。
python snmpget.py
cat ./pysnmplog/Router1_pysnmp.csv
Terminal[python]: cat ./pysnmplog/Router1_pysnmp.csv
date,time,In,Out
2022/09/17,16:35:00,6870336,4061131
2022/09/17,16:36:00,6871637,4061602
2022/09/17,16:37:00,6872998,4062073
2022/09/17,16:38:00,6874359,4062561
2022/09/17,16:39:00,6875660,4063032
Pythonによるトラフィックグラフ作成ツール
利用するライブラリ
- pandas
- データを扱うためのライブラリ
- matplotlib
- グラフを描画するためのライブラリ
ディレクトリ構成
Pythonプログラムとトラフィック情報ファイルを同一ディレクトリに格納します。
- trafficgraph.py (Pythonプログラム)
- Router1_pysnmp.csv (トラフィック情報ファイル)
トラフィック情報ファイルは、1時間分のサンプルデータを利用しています。
Pythonコード
トラフィックグラフを作成するプログラムは『trafficgraph.py』として、下記のコードを記述します。
import pandas as pd
import matplotlib.pyplot as plt
def mbscalc(x):
x = x / 1024 / 1024 * 8 /60
return x
datetime = pd.read_csv('Router1_pysnmp.csv', usecols=[0, 1], encoding = 'UTF8')
inout = pd.read_csv('Router1_pysnmp.csv', usecols=[2, 3], encoding = 'UTF8')
inoutdiff = inout.diff()
inoutdiff = inoutdiff.drop([0])
inoutdiff['In'] = inoutdiff['In'].astype(int)
inoutdiff['Out'] = inoutdiff['Out'].astype(int)
data = datetime['date'] + " " + datetime['time'] + "," + inoutdiff['In'].astype(str) + "," + inoutdiff['Out'].astype(str)
data = data.str.split(',', expand=True)
data.columns = ['datetime', 'In', 'Out']
data = data.drop([0])
data['In'] = data['In'].astype(int)
data['Out'] = data['Out'].astype(int)
data['In'] = data['In'].apply(mbscalc)
data['Out'] = data['Out'].apply(mbscalc)
plt.plot(data['datetime'], data['In'], data['Out'])
plt.xticks([0, len(data)-1])
plt.ylim(0,100)
plt.ylabel('Mbps')
plt.legend(['In', 'Out'])
plt.show()
トラフィックグラフ作成ツールの実行結果
トラフィックグラフ作成ツールを実行すると、下記のグラフが表示されます。
python trafficgraph.py
以上で、ネットワークエンジニアのプログラミング【Python入門(SNMPGet実行)】の説明は完了です!プログラミングができると、仕事の効率化ができますし、何より仕事を楽しむことができます!!
- Progate 〜 プログラミングの入門なら基礎から学べるProgate[プロゲート]
- ドットインストール 〜 3分動画でマスターできるプログラミング学習サービス
どちらのサイトも無料で学習可能な範囲があります。有料コンテンツに関しては、月額1000円程度です。