5.4.1. 変数を応用してログファイル名を設定
前回までで、変数に対する抵抗感は殆どなくなったのではないでしょうか。
今回はさらに変数を応用して、マクロをもっと使いやすくしていきましょう。
5.4.1.1. 前回までに作成したマクロの振り返り
以下は前回までに作成したマクロです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 |
;================================= ;変数格納 ;================================= PWD = 'cisco123' IP_ADDR = '172.16.0.1' ;IPアドレスに必要なオプションを追加する strconcat IP_ADDR ':23 /nossh /T=1' ;================================= ;telnet接続、ログ保存ディレクトリ ;================================= connect IP_ADDR getdir DIR changedir DIR ;================================= ;show runのログを取得 ;================================= logopen 'show_run.log' 0 0 wait 'Password:' sendln PWD wait '>' pause 3 sendln 'en' wait 'Password' pause 3 sendln PWD wait '#' pause 3 sendln 'terminal length 0' wait '#' pause 3 sendln 'show run' pause 5 sendln '' wait '#' logclose ;================================= ;show logのログを取得 ;================================= logopen 'show_log.log' 0 0 sendln 'show log' pause 5 sendln '' wait '#' sendln 'exit' end |
いよいよマクロが長くなってきましたね。
さて、これまでマクロを走らせてきて、「ログファイル」の不便なところはなかったでしょうか?
5.4.1.2. ログファイルのファイル名をユニークにする
マクロを走らせるたびにログファイルが作成されるけど、「ログのファイル名が毎回同じだから、上書きされてしまう」という状況が起きていると思います。
そこで、今回は変数、strconcat、新たなコマンドの仕組みを使って、ログファイルにユニークなファイル名をつけていくことにしましょう。
ユニークなファイル名と言っても、何をつければいいでしょうか。一般的に運用の中で用いられるのは、ログを取得した「日付」や「時間」です。
日付と時間を細かくつければつけるほど、ログファイル名に一意性が生まれますし、上書きされることもありません。その反面、ログファイル名が長くなる、などの弊害があります。
ですから、最も長いファイル名で学習しておいて、状況に合わせてファイル名を短くする手法をとるのがよいと思います。
5.4.2. ログファイル名に日付を使う
日付をファイル名に適用するにはどうすればいいでしょうか。
マクロがファイル名として日付を格納するためには、マクロ自体が現在の日時を知る必要があります。
5.4.2.1. 日付を取得するコマンド
前回のgetdirコマンドで行ったように、日付を取得する必要があるのです。
前回のgetdirコマンドを軽くおさらいすると、
1 |
getdir DIR |
でDIR変数にカレントディレクトリを格納してくれました。
getdirと同じようなコマンドで、現在の日時を取得するには、
1 |
getdate 日付を格納する変数名 型 |
と
1 |
gettime 時間を格納する変数名 型 |
という二つのコマンドが用意されています。
getdateコマンドもgettimeコマンドも、変数名の後ろに形式を記載すれば、現在の日付+時間が取得できます。つまり、基本的には同じ動作をするコマンドだと考えていいでしょう。
私の場合、getdateコマンドの方が使い慣れているので、基本的にはgetdateコマンドを使っています。gettimeコマンドはコマンド文の中でtが重なるので、タイプしづらいというところもありますし、読みにくいのであまり使用しません。
5.4.2.2. getdateコマンドで日時を取得する
では、実際にgetdateを使ってみましょう。
getdateコマンドを使い、DATEという変数に、現在の日時を格納したいと思います。
1 |
getdate DATE |
このコマンドを走らせると、DATE変数内には、『YYYY-MM-DD』の形式で、日付が格納されます。
2014年11月22日にこのコマンドを走らせた場合、『2014-11-22』の形で文字列が格納されます。
日付だけ格納する場合はこれで問題ないのですが、日付の真ん中のハイフンがいらないなあというのと、時刻もファイル名に加えたいところです。
そこで、形式を指定することによって、変数に格納する際のファイル名の型を定めることができます。
型はいくつも用意されていて覚えにくいように思いますが、実は簡単です。
アルファベットでは”YymdHMS”の7つだけ覚えておけばいいです。他にも色々な型があるのですが、ほとんど使っているのを見た事がありません。
私としては、そんな使わない型を覚えるのに労力を使うのはもったいないと思いますので、最低限だけ覚えておけばいいと思います。
5.4.2.3. getdateコマンドで使われる型
では、一覧にして記述してみましょう。仮に、現在日時を2014/11/22 01:23:45だとします。
型 | 形式 | サンプル |
%Y | 年YYYY | 2014 |
%y | 年YY(下二桁) | 14 |
%m | 月(二桁) | 11 |
%d | 日(二桁) | 22 |
%H | 時(二桁) | 01 |
%M | 分(二桁) | 23 |
%S | 秒(二桁) | 45 |
実際にコマンドを使ったサンプルで書いていきます。
1 |
getdate DATE '%y%m%d-%H%M%S' |
DATEに格納される値は、’141122-012345’です。
1 |
getdate DATE '%Y-%m-%d--%H-%M-%S' |
DATEに格納される値は、’2014-11-22–01-23-45’です。
私は個人的に_(アンダースコア)が好きなので、いつも下記の型を使っています。
1 |
getdate DATE '%Y%m%d_%H%M%S' |
せいぜい10分に一回しかログをとらないような場合は、
1 |
getdate DATE '%Y%m%d_%H%M' |
のような形で、秒を型に含めなければファイル名を短くする事ができます。
ちなみに上記の場合、DATEに格納される値は、’20141122_0123’です。
5.4.2.4. getdateを実際に使う
では、実際にマクロの中に取り込んでいきましょう。
今回、最終的に目指すファイル形式としては’show_run_20141122_012345.log’のような形にしたいと思います。
まず、getdateコマンドで
1 |
getdate DATE '%Y%m%d_%H%M%S.log' |
ファイル名につける日時を取得し、その型を決めてしまいます。
そして、この時点で.logという拡張子も型の中に含めてしまいましょう。
次に、’show_run_’を変数宣言してしまいましょう。
今回は、’show_run’分と、’show_log’分の二つを変数宣言する事にします。変数名はSHRUNとSHLOGにしてみましょう。
1 2 |
SHRUN = 'show_run_' SHLOG = 'show_log_' |
ここまで書けたら、それぞれのログとDATEをstrconcatしましょう。
1 2 |
strconcat SHRUN DATE strconcat SHLOG DATE |
これで、SHRUNとSHLOGには
‘show_run_20141122_012345.log’
‘show_log_20141122_012345.log’
が、それぞれ格納されているはずです。
5.4.2.5. マクロの中にgetdateを組み込む
では、実際にマクロに組み込んでみます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 |
;================================= ;変数格納 ;================================= PWD = 'ciscoshun' IP_ADDR = '172.16.1.2' ;IPアドレスに必要なオプションを追加する strconcat IP_ADDR ':23 /nossh /T=1' ;================================= ;telnet接続、ログ保存ディレクトリ ;================================= connect IP_ADDR getdir DIR changedir DIR ;================================= ;ログ保存名の確定 ;================================= getdate DATE '%Y%m%d-%H%M%S.log' SHRUN = 'show_run_' SHLOG = 'show_log_' strconcat SHRUN DATE strconcat SHLOG DATE ;================================= ;show runのログを取得 ;================================= logopen SHRUN 0 0 wait 'Password:' sendln PWD wait '>' pause 3 sendln 'en' wait 'Password' pause 3 sendln PWD wait '#' pause 3 sendln 'terminal length 0' wait '#' pause 3 sendln 'show run' pause 5 sendln '' wait '#' logclose ;================================= ;show logのログを取得 ;================================= logopen SHLOG 0 0 sendln 'show log' pause 5 sendln '' wait '#' sendln 'exit' end |
20から28行目にログ保存名を確定する変数宣言と、コメントを作成しました。
そして、logopenコマンドのログ名をそれらの変数に置き換えているのが、36行目と61行目です。
マクロがかなり複雑な動きをするようになってきましたね。
しかし、ステップを踏んで機能を追加してきたので、読み返してもわからない箇所というのはないと思います。コマンドのど忘れは誰にでもありますし、そこはゆっくり振り返ればいいでしょう。
次章からは、いよいよ、初心者殺しと言われる『ループ』処理に入っていきましょう。