ネットワークエンジニアのプログラミング【Python入門(設定変更)】

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

Pythonで作成したツールを利用して、ネットワーク機器(Cisco)の設定変更を自動化・効率化します。

目次

ネットワーク機器の設定変更作業

ネットワーク機器の設定変更を手動で行う場合、下記のような手順で作業することがあります。

ネットワーク機器の設定変更手順
STEP
事前ログ取得

ネットワーク機器にリモート接続し、設定変更前のコンフィグ情報を取得します。

事前ログを取得する人
STEP
設定変更

事前に作成した変更用のコンフィグを、1行ずつコピー&ペーストで設定します。

設定変更する人
STEP
事後ログ取得

設定変更後のコンフィグ情報を取得します。

事後ログを取得する人
STEP
事前ログと事後ログを比較(作業エビデンスとして保存)

設定変更前後のコンフィグを、Diffソフトでの比較、もしくはエクセルに貼り付けて、設定変更箇所に問題が無いか確認します。また、Diffソフトの場合は、作業エビデンスとして、比較結果をエクスポートして保存します。

差分比較する人

この作業手順にはいくつかの課題があります。

設定変更作業の課題
  • 全て手動での作業のため時間が掛かる
  • 設定変更作業時にオペレーションミスの可能性がある
  • オペレーションミスの可能性があるため、2人体制が必須の場合がある
  • 確認作業のためにDiffツールやエクセルが必要となる
  • エビデンスを保存する作業が必要となる

今回は、Cisco機器の設定変更を例として、Pythonで設定変更ツールを作成し、上記の4ステップを自動的に処理できるようにしていきます。事前・事後の比較結果をHTMLファイルに出力し、エビデンスの保存までを自動化します。

Pythonによる設定変更ツール

ネットワーク環境

下記のネットワーク環境で、ルーター1台に対して、設定変更を行います。

ネットワーク構成

Router1には、SSHでリモートログインできるようにしておきます。

Cisco機器のSSH設定は、下記のページで説明しています。

実行環境・前提条件

実行環境

今回の実行端末の環境は下記の通りです。Windowsでも、Pythonをインストールしていれば、実行可能です。

  • OS:macOS
  • Pythonバージョン:3.9.13

設定変更内容

ループバックインターフェースを作成し、IPアドレスを設定します。

interface loopback1
 ip address 1.1.1.1 255.255.255.255
 no shutdown

ログ格納フォルダ

Pythonプログラムと同じフォルダに、『logfile』フォルダを作成します。(事前・事後のコンフィグと比較結果を格納するフォルダ)

Terminal[python]: ls -l

drwxr-xr-x  2 XXXXXXXX  staff    64  8  3 08:30 logfile
-rw-r--r--@ 1 XXXXXXXX  staff  2390  8  2 20:23 pychange.py

Pythonコード

設定変更を実行するプログラムは『pychange.py』として、下記のコードを記述します。

from netmiko import ConnectHandler
import datetime
import difflib


#設定変更対象ホスト名
hostname = 'Router1'


#接続情報
target_device = {
   'device_type': 'cisco_ios',
   'host':   '192.168.1.100',
   'username': 'cisco',
   'password': 'cisco',
   'port' : 22,
   'secret': 'cisco',
}


#ログファイルに付与する日時形式を定義(yyyymmddHHMMSS)
datetime_now = datetime.datetime.now().strftime('%Y%m%d%H%M%S')


#接続
print('------------------------------------------------')
print('Connect to ' + hostname)
print('------------------------------------------------')

net_connect = ConnectHandler(**target_device)
net_connect.enable()


#事前ログ取得
print('Getting Before-Log for ' + hostname)
print('------------------------------------------------')

before_logfile = './logfile/00_before_' + hostname + '_' + datetime_now + '.log'	

output = net_connect.send_command('show run')
with open(before_logfile, 'w') as f:
    print(output, file=f)


#設定変更
print('Changing Config ' + hostname)
print('------------------------------------------------')

command = ["interface loopback1",
           "ip address 1.1.1.1 255.255.255.255",
           "no shutdown"]

net_connect.send_config_set(command)

	
#事後ログ取得
print('Getting After-Log for ' + hostname)
print('------------------------------------------------')

after_logfile = './logfile/10_after_' + hostname + '_' + datetime_now + '.log'	

output = net_connect.send_command('show run')
with open(after_logfile, 'w') as f:
    print(output, file=f)


#切断
print('Disconnect from ' + hostname)
print('------------------------------------------------')

net_connect.disconnect()


#事前事後のコンフィグ比較(htmlファイルを生成)
print('Export Diff Before and After')
print('------------------------------------------------')

diff = difflib.HtmlDiff()
diff_htmlfile = './logfile/20_diff_' + hostname + '_' + datetime_now + '.html'

file1 = open(before_logfile)
file2 = open(after_logfile)
output = open(diff_htmlfile, 'w')

output.writelines(diff.make_file(file1, file2))

file1.close()
file2.close()
output.close()

print('Configuration Change Completed!')
print('------------------------------------------------')
★★ コードの詳細説明はこちらをクリックしてください ★★(print文の説明は省略しています)
STEP
各種定義
from netmiko import ConnectHandler
import datetime
import difflib

Pythonでは様々な便利な機能が使える「ライブラリ」というものを利用します。今回は『netmiko』『datetime』『difflib』というライブラリを利用します。
・netmiko 〜 ネットワーク機器を操作するためのライブラリ
・datetime 〜 時間に関するデータを扱うためのライブラリ
・difflib 〜 ファイルを比較し、一致箇所や差分を抽出するためのライブラリ

hostname = 'Router1'

設定変更対象のホスト名を記載します。ログファイルにホスト名を付与するために利用します。

target_device = {
   'device_type': 'cisco_ios',
   'host':   '192.168.1.100',
   'username': 'cisco',
   'password': 'cisco',
   'port' : 22,
   'secret': 'cisco',
}

接続先の情報を記載します。

datetime_now = datetime.datetime.now().strftime('%Y%m%d%H%M%S')

ログファイルに付与する日時形式を定義して、変数(datetime_now)に格納します。

STEP
対象機器へ接続・事前ログ取得
net_connect = ConnectHandler(**target_device)

対象機器へ接続します。

net_connect.enable()

enableモードへ移行します。

before_logfile = './logfile/00_before_' + hostname + '_' + datetime_now + '.log'	

設定変更前のログファイル名を「”00_before_” + ホスト名+日時.log」に設定します。

output = net_connect.send_command('show run')

“show run” コマンドを実行し、結果を変数(output)に格納します。

with open(before_logfile, 'w') as f:
    print(output, file=f)

事前ログファイルを開き、コマンドの結果を書き込みます。

STEP
設定変更
command = ["interface loopback1",
           "ip address 1.1.1.1 255.255.255.255",
           "no shutdown"]

設定変更内容をリスト形式で記述し、変数(command)に格納します。

net_connect.send_config_set(command)

設定変更を実施します。

STEP
事後ログ取得・対象機器から切断
after_logfile = './logfile/10_after_' + hostname + '_' + datetime_now + '.log'

設定変更後のログファイル名を「”10_after_” + ホスト名+日時.log」に設定します。

output = net_connect.send_command('show run')

“show run” コマンドを実行し、結果を変数(output)に格納します。

with open(after_logfile, 'w') as f:
    print(output, file=f)

事後ログファイルを開き、コマンドの結果を書き込みます。

net_connect.disconnect()

対象機器から切断します。

STEP
事前ログと事後ログを比較(比較結果をHTMLファイルで保存)
diff = difflib.HtmlDiff()

比較結果をHTMLで出力するための変数(diff)を定義します。

diff_htmlfile = './logfile/20_diff_' + hostname + '_' + datetime_now + '.html'

比較結果のHTMLファイル名を「”20_diff_” + ホスト名+日時.html」に設定します。

file1 = open(before_logfile)
file2 = open(after_logfile)
output = open(diff_htmlfile, 'w')

事前・事後ログと比較結果出力用のHTMLファイルを開きます。

output.writelines(diff.make_file(file1, file2))

事前・事後ログの比較結果をHTMLファイルに書き込みます。

file1.close()
file2.close()
output.close()

事前・事後ログと比較結果出力用のHTMLファイルを閉じます。

設定変更ツールの実行

ツール実行

作成したPythonプログラムを実行します。

python pychange.py
設定変更ツールの実行画面

ログ確認

ログが出力されていることを確認します。

ls ./logfile
Terminal[python]: ls ./logfile
00_before_Router1_20220803161332.log
10_after_Router1_20220803161332.log
20_diff_Router1_20220803161332.html

事前・事後の差分ファイル確認

出力されたHTMLファイルを開くと下記の通り表示され、設定変更箇所が明確にわかります。

下記は一部抜粋しています。全体のイメージはこちらをクリックしてください。(別ウィンドウでHTMLファイルを開きます。)

差分比較ファイルの内容

事前・事後の差分比較ファイルを自動保存するため、大幅に作業時間が短縮できます。エビデンス保存のためのコピー&ペーストも不要になります。

設定変更ツールのカスタマイズ

今回は対象機器にログインして、「事前ログ取得」→「設定変更」→「事後ログ取得」→「変更前後の差分確認」を自動化するツールでしたが、下記のようなカスタマイズも自由にできます。

設定変更ツールのカスタマイズの例
  • 複数の機器に対して設定変更を実施する。
  • 事前・事後ログとして、”show run” 以外のステータス確認コマンドも実行する。
  • 設定変更コマンドを実施した結果を表示する。(設定エラーが出ていないか確認する)

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

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

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

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

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