みなさん、こんにちは。
楊(ヤン)です。
今回は、ネットワーク運用自動化ツールの話をしたいです。
運用業務では、対象ネットワークの規模により、何十台、何百台の機器に同じコンフィグを投入する作業が時々ありますね。
その時自動化ツールで作業を行うと、手動よりかなり工数が減り、効率を高めます。
では、実際に作ったツールを、これから紹介していきます。
目標
簡単な操作で大量なネットワーク機器にコンフィグ投入する作業をできるツールの作成
成果物のイメージ
エクセルファイルのシートに、
ユーザー名、パスワード、対象機器のIP&ホスト名、コマンド文を入力し、
生成されるpythonスクリプトのファイル名を指定して、
「スクリプト作成」ボタンを押したら、
「指定ファイル名 + .py」の名前のファイルが作成されます。
中身は、シートの第三列に記入した各ホストに、第四列のコンフィグを投入するスクリプトです。
必要なもの
- ・python
- ・VBA
作り方
今回のコードでは、ジュニパー機器を対象にします。
以下のように、大きく二つのパートに分けて作っていきます。
- ・pythonでネットワーク機器のコマンドを送るスクリプト
- ・VBAで複数のpythonスクリプトを一括作成できるシート
まずは、python
pythonで機器に
- ・自動ログイン&ログアウトする
- ・show xx, set xx, delete xx, commitなどのコマンドを送る
ことができるスクリプトを作ります。
1.冒頭にシェバンを書きます
1 2 3 |
#!/usr/bin/env python # -*- coding: utf-8 -*- |
2.モジュールをインポートします
1 2 3 |
import sys import pexpect |
3.関数を定義します
1 2 |
def CONFIG(): |
4.どんなコマンドを実行したのかをログに記録したいため、コマンドリストをコンソールにプリントします(ここは後でVBAで自動化させることでヒューマンミスを防ぎます)
1 2 3 4 5 6 |
print '----------------------------------------------------------------------' print '[command list]' print 'show interfaces' print 'show configuration |display set| no-more' print '----------------------------------------------------------------------' |
5.spawn()で子プロセスを立ち上げます。ここではsshを立ち上げます。
logfile=sys.stdoutで実行結果をコンソールに出力します(が、一部の文字表示がずれるので見にくくなります。そのため4番のコマンドリストが必要です。)
1 2 |
command=pexpect.spawn('ssh [ユーザー名]@'+ipaddr,logfile=sys.stdout) |
6.expect()とsendline()でコマンドを一行ずつ送ります。
「expect(xxx)」は「xxxという内容の質問を待っている」の意味です。
「sendline(ooo)」は「oooという内容の回答を送る」の意味です。
例えば、spawn()でsshプロセスを立ち上げた後、
「Password:」という入力欄がコンソールに表示するはずです。
pexpectの場合、
1 2 3 |
command.expect('Password') command.sendline('[ここにパスワードの文字列を書く]') |
と書けば、パスワードを送り、ログインできます。
ただ、ログインする時に、ジュニパー機器は「初めてログインするユーザーか」によって表示する文字列が異なります。
初回ログインする時だけ、「Are you sure you want to continue connecting」と表示します。
そのため、ここで分岐処理をします。
7.表示される二種類の文字で、配列を定義します。
1 2 |
ret = command.expect(['Are you sure you want to continue connecting','Password']) |
8.初回ログインの場合
1 2 3 4 5 6 7 8 9 10 11 12 |
if ret == 0: command.sendline('yes') command.expect('Password') command.sendline('[ここにパスワードの文字列を書く]') command.expect('[ユーザー名@ホスト名>]') command.sendline('show interfaces') command.expect('[ユーザー名@ホスト名>]') command.sendline('show configuration |display set | no-more') command.expect('[ユーザー名@ホスト名>]') command.sendline('exit') command.expect('Connection to') |
例ではshow コマンドだけを送りましたが、設定コマンドが必要な場合は下記のように修正します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
if ret == 0: command.sendline('yes') command.expect('Password') command.sendline('[ここにパスワードの文字列を書く]') command.expect('[ユーザー名@ホスト名>]') command.sendline('configure') #設定モード command.expect('[ユーザー名@ホスト名#]') command.sendline('[delete/setコマンドを書く]') command.expect('[ユーザー名@ホスト名#]') command.sendline('show |compare |no-more') command.expect('[ユーザー名@ホスト名#]') command.sendline('commit check') command.expect('[ユーザー名@ホスト名#]') command.sendline('commit') command.expect('[ユーザー名@ホスト名#]') command.sendline('exit') command.expect('[ユーザー名@ホスト名>]') command.sendline('exit') command.expect('Connection to') |
9.二回目以降ログインの場合
1 2 3 4 5 6 7 8 9 10 |
if ret == 1: command.sendline('[ここにパスワードの文字列を書く]') command.expect('[ユーザー名@ホスト名>]') command.sendline('set cli timestamp') command.expect('[ユーザー名@ホスト名>]') command.sendline('show configuration |display set |match storm | no-more') command.expect('[ユーザー名@ホスト名>]') command.sendline('exit') command.expect('Connection to') |
こちらも同様に、expect()の文字や送るコマンドを修正すれば設定モードに適用できます。
10.定義した関数を呼び出します。
1 2 3 |
if (__name__ == '__main__'): CONFIG() |
これで、一台の機器への設定手順が完了しました。
次のタスクは、VBAで複数のpythonスクリプトを一括作成することです。
VBAについては、また次回で触れていきたいと思います。
最後まで読んでいただき、ありがとうございました!