Pythonでプログラミングしたツールを利用して、ネットワーク機器(Cisco)のコンフィグ取得を自動化・効率化します。
ネットワーク機器のコンフィグ取得
ネットワーク機器のコンフィグを取得する場合、Teratermなどのターミナルソフトでコンソール接続orリモート接続(SSH/Telet)を行い、コマンド入力を行います。自動化・効率化する場合は、Teratermのマクロを使うことが多いと思います。
しかし、Pythonで簡単なコードが書くことができれば、定期的なバックアップ処理にも利用できますし、柔軟なカスタマイズも可能です。
今回は、Cisco機器を例として、Pythonで簡単なコンフィグ取得ツールを作ります。
Pythonによる簡単なコンフィグ取得ツール
ネットワーク環境
下記のネットワーク環境で、ルーター2台とL2スイッチ1台に対して、コンフィグ取得を行います。
各機器には、SSHでリモートログインできるように設定を行います。
Cisco機器のSSH設定は、下記のページで説明しています。
実行環境・前提条件
実行環境
今回の実行端末の環境は下記の通りです。Windowsでも、Pythonをインストールしていれば、実行可能です。
- OS:macOS
- Pythonバージョン:3.9.13
対象機器リスト
コンフィグを取得する対象の機器を『host_list.csv』として、Pythonプログラムと同じフォルダに保存します。カラム区切りで、左から「ホスト名」「IPアドレス」「ユーザー名」「ログインパスワード」「enableパスワード」を記述します。
hostname,ipaddress,username,loginpass,enablepass
Router1,192.168.1.101,cisco,cisco,cisco
Router2,192.168.1.102,cisco,cisco,cisco
Switch1,192.168.1.103,cisco,cisco,cisco
コンフィグ格納フォルダ
Pythonプログラムと同じフォルダに、『logfile』フォルダを作成します。(取得したコンフィグを格納するフォルダ)
Terminal[python]: ls -l
-rw-r--r--@ 1 xxxxxxxx staff 169 7 31 08:40 host_list.csv
drwxr-xr-x 5 xxxxxxxx staff 160 7 31 10:00 logfile
-rw-r--r--@ 1 xxxxxxxx staff 1412 7 31 08:57 pygetconfig.py
Pythonコード
コンフィグ取得を実行するプログラムは『pygetconfig.py』として、下記のコードを記述します。
from netmiko import ConnectHandler
import csv
import datetime
#ログファイルに付与する日時形式を定義
datetime_now = datetime.datetime.now().strftime('%Y%m%d%H%M%S')
#ホスト一覧を開く
csv_file = open("host_list.csv", "r", encoding="ms932", errors="", newline="" )
f = csv.reader(csv_file, delimiter=",", doublequote=True, lineterminator="\r\n", quotechar='"', skipinitialspace=True)
#1行目はヘッダーのためスキップ
header = next(f)
#ホスト一覧を一行ずつ実施
for row in f:
#コンフィグ取得中のホスト名を表示
print('Getting Log for ' + row[0])
#ホスト一覧から接続先設定を読み込む
my_device = {
'device_type': 'cisco_ios', #デバイスはcisco固定
'host': row[1], #IPアドレスは2カラム目
'username': row[2], #ユーザー名は3カラム目
'password': row[3], #パスワードは4カラム目
'port' : 22, #SSHポートは22固定
'secret': row[4], #enableパスワードは5カラム目
}
#ログファイル名を設定(ホスト名+日時)
logfile = './logfile/' + row[0] + '_' + datetime_now + '.log'
#対象機器へ接続
net_connect = ConnectHandler(**my_device)
net_connect.enable()
#コマンドを実行
output = net_connect.send_command('show run')
with open(logfile, 'w') as f:
print(output, file=f)
#対象機器から切断
net_connect.disconnect()
★★ コードの詳細説明はこちらをクリックしてください ★★
from netmiko import ConnectHandler
import csv
import datetime
Pythonでは様々な便利な機能が使える「ライブラリ」というものを利用します。今回は『netmiko』『csv』『datetime』というライブラリを利用します。
・netmiko 〜 ネットワーク機器を操作するためのライブラリ
・csv 〜 CSVファイルの読み込みや書き込みを行うためのライブラリ
・datetime 〜 時間に関するデータを扱うためのライブラリ
datetime_now = datetime.datetime.now().strftime('%Y%m%d%H%M%S')
ログファイルに付与する日時形式を定義して、変数(datetime_now)に格納します。
csv_file = open("host_list.csv", "r", encoding="ms932", errors="", newline="" )
f = csv.reader(csv_file, delimiter=",", doublequote=True, lineterminator="\r\n", quotechar='"', skipinitialspace=True)
CSVファイル(host_list.csv)を読み込み、変数(f)に格納します。
header = next(f)
1行目はヘッダーのため、処理をスキップします。
for row in f:
1行ずつ読み込んで、最終行まで繰り返します。(for関数によるループ処理です。)
print('Getting Log for ' + row[0])
コンフィグ取得中のホスト名を出力します。
my_device = {
'device_type': 'cisco_ios', #デバイスはcisco固定
'host': row[1], #IPアドレスは2カラム目
'username': row[2], #ユーザー名は3カラム目
'password': row[3], #パスワードは4カラム目
'port' : 22, #SSHポートは22固定
'secret': row[4], #enableパスワードは5カラム目
}
host_list.csvから読み込んだパラメータをセットします。
logfile = './logfile/' + row[0] + '_' + datetime_now + '.log'
ログファイル名を「ホスト名+日時.log」に設定します。
net_connect = ConnectHandler(**my_device)
対象機器へ接続します。
net_connect.enable()
enableモードへ移行します。
output = net_connect.send_command('show run')
“show run” コマンドを実行し、結果を変数(output)に格納します。
with open(logfile, 'w') as f:
print(output, file=f)
ログファイルを開き、コマンドの結果を書き込みます。
net_connect.disconnect()
対象機器から切断します。
コンフィグ取得ツールの実行結果
作成したPythonプログラムを実行します。
python pygetconfig.py
3台分のログファイルが保存されていることがわかります。Teratermマクロのように、画面に取得中のログが表示されることはありません。
取得したログの内容を確認します。
cat ./logfile/Router1_XXXXXXXXXXXXXX.log
Terminal[python]: cat ./logfile/Router1_XXXXXXXXXXXXXX.log
Building configuration...
〜〜 中略 〜〜
hostname Router1
〜〜 中略 〜〜
interface GigabitEthernet0/0
ip address 192.168.1.101 255.255.255.0
〜〜 中略 〜〜
end
今回は、入門編としての説明のため、SSH接続がNGだった場合などのエラー処理は入れていません。そのため、接続NGの場合は、エラーで途中終了してしまうので、注意してください。
コンフィグ取得ツールのカスタマイズ
今回は対象機器にログインして、”show run” の結果を取得するツールでしたが、下記のようなカスタマイズも自由にできます。
- 複数のコマンドを実行して結果を取得する。
- 取得したコマンド結果を整形して、比較しやすくする。
これで、ネットワークエンジニアのプログラミング【Python入門(コンフィグ取得)】の説明は完了です!プログラミングができると、仕事の効率化ができますし、何より仕事を楽しむことができます!!
- Progate 〜 プログラミングの入門なら基礎から学べるProgate[プロゲート]
- ドットインストール 〜 3分動画でマスターできるプログラミング学習サービス
どちらのサイトも無料で学習可能な範囲があります。有料コンテンツに関しては、月額1000円程度です。