ネットワークエンジニアのプログラミング【Python入門(SNMPGet実行)】

当ページのリンクには広告が含まれています。
ネットワークエンジニアのプログラミング【Python入門(SNMPGet実行)】

ネットワークエンジニアのプログラミング入門として、PythonでSNMPGetを行い、ネットワーク機器からトラフィック情報を取得します。また、トラフィックグラフもPythonで作成します。

SNMPの基礎については、下記を参照してください。

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

プラグラミング学習サイト・スクール情報

簡単なツール作成であれば、独学でも十分にプログラミングが可能になると思います。短期間で体系的に学習するのであれば、「有料学習サイト」や「オンラインスクール」の利用をおすすめします。

どちらのサイトも無料で学習可能な範囲があります。有料コンテンツに関しては、月額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を実行し、トラフィック情報を取得します。

ネットワーク環境

各ルーターの設定は下記の通りです。

Router1
interface GigabitEthernet0/0
 ip address 192.168.100.1 255.255.255.0

snmp-server community public RO
Router2
interface GigabitEthernet0/0
 ip address 192.168.100.2 255.255.255.0

snmp-server community public RO
Router3
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)

各ルーターに対して、1分毎にトラフィック量(ifHCInOctets, ifHCOutOctets)を取得するプログラムです。

★★ コードの詳細説明はこちらをクリックしてください ★★
from pysnmp.hlapi import *
import schedule
import datetime
import time

ライブラリをインポートします。pysnmpは、「High-Level API」という機能を利用できるようにします。

def job():

SMMPGetを実施するための関数を定義します。

    # 日付と時刻をカンマ区切りで取得
    dt_now = datetime.datetime.now().strftime('%Y/%m/%d,%H:%M:%S')
    print(dt_now)

日時の形式を「YYYY/MM/DD,hh:mm:ss」の形式で定義して、表示します。

    # 取得対象機器を定義
    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))
        )

SNMPGetコマンドの内容を定義します。node_list[name]とすることで、対象機器のIPアドレスを取得しています。

        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 '?'))

エラーが発生した時の処理を記載しています。※PySNMPの公式ドキュメントのサンプル通りです。

SNMP library for Python

https://pysnmp.readthedocs.io/en/latest/#
        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)

毎分0秒に実行するための定義を行います。

while True:
    schedule.run_pending()
    time.sleep(1)

1分毎の実行を無限ループで繰り返します。

SNMPGetツールの実行結果

SNMPGetツールを実行すると、下記の通り表示され、出力先ファイルに追記されていきます。

python snmpget.py
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時間分のサンプルデータを利用しています。

★★ サンプルデータは、こちらをクリックして確認してください ★★
date,time,In,Out
2022/8/18,17:59:00,1113152536,1113073622
2022/8/18,18:00:00,1235056092,1164996546
2022/8/18,18:01:00,1535296858,1225215608
2022/8/18,18:02:01,1845412770,1295330405
2022/8/18,18:03:00,2245528622,1395445125
2022/8/18,18:04:00,2625844594,1515759785
2022/8/18,18:05:00,2935846446,1615760505
2022/8/18,18:06:00,3435848298,1765761225
2022/8/18,18:07:00,3876664090,1906575945
2022/8/18,18:08:01,4396666002,2086576665
2022/8/18,18:09:00,4936667914,2286577385
2022/8/18,18:10:00,5496669766,2496578105
2022/8/18,18:11:00,5917085618,2676992825
2022/8/18,18:12:00,6327087530,2866993545
2022/8/18,18:13:00,6697089622,3006994342
2022/8/18,18:14:00,7017092434,3176995002
2022/8/18,18:15:00,7357097646,3336995722
2022/8/18,18:16:00,7657101178,3516996442
2022/8/18,18:17:00,7927103090,3636997162
2022/8/18,18:18:01,8217105002,3726997882
2022/8/18,18:19:00,8487106914,3826998602
2022/8/18,18:20:00,8727108946,3906999382
2022/8/18,18:21:00,8947110738,3977000102
2022/8/18,18:22:01,9127112602,4057000822
2022/8/18,18:23:00,9327114454,4117001542
2022/8/18,18:24:00,9477116486,4167002339
2022/8/18,18:25:01,9637118278,4207003059
2022/8/18,18:26:00,9817120070,4277003779
2022/8/18,18:27:00,10007121982,4377004499
2022/8/18,18:28:00,10147123954,4427005219
2022/8/18,18:29:01,10237125866,4481005939
2022/8/18,18:30:00,10317127778,4525006599
2022/8/18,18:31:00,10567129570,4587007319
2022/8/18,18:32:00,10807131482,4672008039
2022/8/18,18:33:00,11087133514,4787008759
2022/8/18,18:34:00,11487135426,4917009556
2022/8/18,18:35:01,11927137338,5077010276
2022/8/18,18:36:00,12457139190,5263010996
2022/8/18,18:37:00,12957141102,5457011716
2022/8/18,18:38:00,13477142954,5677012436
2022/8/18,18:39:00,13987144866,5927013156
2022/8/18,18:40:00,14597146778,6137013936
2022/8/18,18:41:01,15187148570,6437014656
2022/8/18,18:42:00,15837150374,6787015316
2022/8/18,18:43:01,16517152226,7197016053
2022/8/18,18:44:00,17177154138,7597016713
2022/8/18,18:45:00,17767156050,7937017433
2022/8/18,18:46:00,18327157794,8127018093
2022/8/18,18:47:00,18827159826,8327018813
2022/8/18,18:48:00,19367161738,8512019533
2022/8/18,18:49:01,19877163650,8682020193
2022/8/18,18:50:00,20327165622,8817020913
2022/8/18,18:51:00,20797167474,8927021633
2022/8/18,18:52:00,21197169326,9107022353
2022/8/18,18:53:00,21537171298,9284023073
2022/8/18,18:54:00,21847173270,9427023793
2022/8/18,18:55:00,22137175182,9567024590
2022/8/18,18:56:01,22387177034,9687025310
2022/8/18,18:57:00,22627178946,9824026030
2022/8/18,18:58:00,22817517908,9917371076
2022/8/18,18:59:00,23017934580,10001784344
2022/8/18,19:00:00,23198040634,10065884190

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()
★★ コードの詳細説明はこちらをクリックしてください ★★
import pandas as pd
import matplotlib.pyplot as plt

ライブラリをインポートします。


def mbscalc(x):
    x = x / 1024 / 1024 * 8 /60
    return x

1分間の平均通信速度(Mbps)を計算するための関数を定義します。

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])

送受信データ量は、一つ前の値との差分を計算します。1行目は差分が計算できないため、削除します。

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])

「日時」と「送受信データ」を結合し、列名を設定します。1行目が不要なデータとなるため、削除します。

data['In'] = data['In'].astype(int)
data['Out'] = data['Out'].astype(int)

データを結合するときに、一度文字列としたため、整数に変換します。

data['In'] = data['In'].apply(mbscalc)
data['Out'] = data['Out'].apply(mbscalc)

送受信データ量をMbpsに計算します。

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.xticks:x軸を最初と最後の日付だけ表示させています。
  • plt.ylim:y軸の最小値と最大値の設定です。
  • plt.ylabel:y軸のラベルの設定です。
  • plt.legend:凡例を表示させています。
plt.show()

グラフを表示します。

トラフィックグラフ作成ツールの実行結果

トラフィックグラフ作成ツールを実行すると、下記のグラフが表示されます。

python trafficgraph.py
トラフィックグラフ

以上で、ネットワークエンジニアのプログラミング【Python入門(SNMPGet実行)】の説明は完了です!プログラミングができると、仕事の効率化ができますし、何より仕事を楽しむことができます!!

プラグラミング学習サイト・スクール情報

簡単なツール作成であれば、独学でも十分にプログラミングが可能になると思います。短期間で体系的に学習するのであれば、「有料学習サイト」や「オンラインスクール」の利用をおすすめします。

どちらのサイトも無料で学習可能な範囲があります。有料コンテンツに関しては、月額1000円程度です。

  • URLをコピーしました!
  • URLをコピーしました!
目次