NetworkPython

PythonでCiscoスイッチのInterface情報をSQLへ一括インポートする【Netmiko+Pandas】

Network

社内でCatalystシリーズなどのCiscoスイッチを多く使われているかたは多いと思われます。

私自身も社会人になってから20年以上前からもCiscoスイッチを利用していますが、Ciscoスイッチはまだまだ一線で活躍しています。やはり、他メーカーに比べても故障も少なく、動作も安定しています。

今回はそんなCiscoスイッチの設定を自動化する案件があり、そのためにCiscoスイッチのConfigからポート番号、vlanID、descriptionなどの「show Interface status」で取得できるInterfaceの情報を取り出して、MS SQLのDatabaaseにインポートする、という事を行いましたのでご紹介いたします。

Pythonのnetmikoとpandasというライブラリを利用することがかなり簡単に実現することができました。

※実機で試してますが、今回の記事内では結果のデータについては記載できてません。方法の説明だけになります。

試した環境

・Pythonの実行環境
 ・Windows 10 Pro
 ・Python 3.8.5
 ・pandas
 ・pyodbc
 ・pymssql

・Ciscoスイッチの確認環境
 ・Catalyst 2960系、3700系、4500系

・MSSQL 2017(Linux版)
 ※SQLサーバはDockerでLinux版のMSSQLを以下の手順で構築しました

やり方の概要説明:PythonのNetmiko/Pandasを利用

今回はいくつかのPythonのテクニック(モジュールなど)を組み合わせて使ているので、どのように行ったかについての概要を説明します。

上でツイートしているようにNetmikoを使ってCiscoスイッチの情報を取り出した後に、pandasを使ってDataFrame化して、SQLへインサートしています。

これだけだと、いきなりすぎて理解できないと思いますので、細かく説明していきます。

Netmikoでネットワーク機器接続→任意コマンド実行→結果取得

通常、Ciscoスイッチへのログオンにはsshかtelnetを利用するかと思います。

PowerShellやphpやrubyなどにもあるssh接続するためのモジュールを使って、ゴリゴリとプログラムを書いてもいいのですが、機種によってログオンの際の表示内容が異なったりしてなかなかコントロールするのが難しいかと思います。

そんなときにおすすめなのが、Pythonのnetmikoというモジュールです。

Netmikoを利用することで、Ciscoなどのネットワーク機器へリモート接続して任意のコマンドを実行して、機器の差分も調整されたうえで、結果をうまいこと取得してくれます。
https://github.com/ktbyers/netmiko

なお、NetmikoではSSHだけではなくてTELNETでの接続にも対応していますので、SSHに対応していないモデルにも対応することが可能です

日経ネットワークなどにも記事がありますので持っている方は参考にどうぞ。記事もかなりわかりやすいです。
https://xtech.nikkei.com/atcl/nxt/mag/nnw/18/012100077/012100004/

PandasでNetmikoの結果をDataFrameへ変換

Netmikoで取得した結果は(おそらく)Dict形式になってますが、Pandasのモジュールを使うことで「DataFrame」に変更することが可能となります。

「DataFrame」形式にすることでJsonやCSV、今回の場合にはSQLクエリなどの様々な形式に出力することができて中間データを扱う際は常に便利です。

結果をSQLへインポート

最後にmssqlに接続するモジュール(pyodbc/pymssql)とを使って任意のテーブルにInsertしていきます。

Pythonスクリプトの説明

では、実際のPythonスクリプトについて記載します。

事前に必要なモジュールインストール

事前に必要となるモジュール類をインストールしておきます。

> pip install netmiko
> pip install pandas
> pip install pyodbc
> pip install pymssql
> pip install sqlalchemy

サンプルスクリプト

たったこれだけです。
show interfaces statusコマンドの結果が直接SQLのTableにインサートされます。鍵カッコで囲まれた部分は自分の環境に応じて変えてください。

import netmiko
from pprint import pprint
import pandas as pd
import pyodbc
import pymssql
from sqlalchemy import create_engine

# ①netmikoで接続して結果を取得
connect_info = {
    "device_type" : "cisco_ios", # ssh接続、telnet接続する場合はcisco_ios_telnet
    "host" : "192.168.xx.xx",
    "password" : "PASSWORD",
    "secret" : "PASSWORD"
}

with netmiko.ConnectHandler(**connect_info) as con:
    con.enable()
    output = con.send_command("show interfaces status", use_textfsm=True)
    con.disconnect()

# ②pandasでDataFrameに変換
df = pd.DataFrame(output)
df["switch_name"] = "スイッチ名"
pprint(df)

# ③SQL接続の準備
connection_string = 'mssql+pymssql://SA:【Password】@localhost/【DatabaseName】'
engine = create_engine(connection_string)

# DataFrameをSQLに変更してInsert
df.to_sql(name=【TableName】, con=engine, schema='dbo', if_exists="replace", index=True)

スクリプト解説

①Netmikoの部分はdevice_typeでcisco_iosを指定しています。telnetの場合にはcisco_ios_telnetを指定して下さい。
なお、Cisco以外のベンダー(JuniperやHPE、vYOSなど)のデバイスについても指定することで接続することが可能です。すごいですね。
サンプルでは1つのデバイスだけですが、複数のデバイスについてもforなどで繰り返せば簡単に連続で取得できます。

②ではpandasを使ってDataFrame化してます。最終的なテーブルにswitch_name列を追加したかったので、追加してます。簡単に列が追加できるので便利です。

③はよくあるSQLへの接続部分です。
df.to_sqlでDataFrameをSQL文に変換してデータをインサートしています。if_exists=”replace”としてデータが存在しても置き換えしてます。appnedとすることで追加することも可能です。

まとめ

今回はかなり簡単ですが、Ciscoスイッチのインターフェース情報をSQLに一括でインサートする方法について紹介しました。

定期的に実行することでスイッチポート台帳としても利用することができます。

また、これらのスイッチの設定変更を自動化する情報基盤としてもスイッチポート情報は必須となりますので、是非設定の自動化について検討してみてはいかがでしょうか。

Pythonのオススメ勉強方法

私がオススメするPython初心者向けの最初に購入すべき書籍は「シリコンバレー一流プログラマーが教える Pythonプロフェッショナル大全です。

シリコンバレー一流プログラマーが教える Pythonプロフェッショナル大全

この書籍は実際にシリコンバレーの一流エンジニアとして活躍している酒井潤さんが書いた本です。

内容も初心者から上級者までまとめられており、各Lessonも長すぎずに分かりやすくまとめられているので、初心者の方にもおすすめです。

シリコンバレー一流プログラマーが教える Pythonプロフェッショナル大全

CCNAを最短で取得したい方は・・・

今回は以上となります。

コメント