Pythonで作成したツールを利用して、ネットワーク機器(Cisco)の設定変更を自動化・効率化します。
ネットワーク機器の設定変更作業
ネットワーク機器の設定変更を手動で行う場合、下記のような手順で作業することがあります。
ネットワーク機器にリモート接続し、設定変更前のコンフィグ情報を取得します。
事前に作成した変更用のコンフィグを、1行ずつコピー&ペーストで設定します。
設定変更後のコンフィグ情報を取得します。
設定変更前後のコンフィグを、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文の説明は省略しています)
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)に格納します。
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)
事前ログファイルを開き、コマンドの結果を書き込みます。
command = ["interface loopback1",
"ip address 1.1.1.1 255.255.255.255",
"no shutdown"]
設定変更内容をリスト形式で記述し、変数(command)に格納します。
net_connect.send_config_set(command)
設定変更を実施します。
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()
対象機器から切断します。
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入門(設定変更)】の説明は完了です!プログラミングができると、仕事の効率化ができますし、何より仕事を楽しむことができます!!
- Progate 〜 プログラミングの入門なら基礎から学べるProgate[プロゲート]
- ドットインストール 〜 3分動画でマスターできるプログラミング学習サービス
どちらのサイトも無料で学習可能な範囲があります。有料コンテンツに関しては、月額1000円程度です。