Pythonでログ解析(4) 〜【番外編①】ログの定期取得マクロ〜

ベル

さて、Pythonの続きと言いたいところですが、前回の記事の際に、しれっと取得ログを使いましたが、そもそもどうやって定期的にログ取得するんだ!という質問を受けましたので、ちょっと番外編として、『ログ取得と定期実行について』授業をしておきたいと思います。

 

前回までのPython授業を受けていない方は、こちらから読んでもらえれば、なぜ定期実行のマクロを作ろうとしているのかがわかってもらえると思います。

 

Pythonでログ解析(1) ~パソコンにPythonを入れるまで~

Pythonでログ解析(2) ~プログラムを実行するまで~

Pythonでログ解析(3) ~ログの読み込みからCSVファイルの作成まで~

 

 

これだけです。これさえあれば、マクロの定期実行は可能です。それでは、まず、マクロを書いていきましょう!

 

teratermマクロとは?

定期実行マクロを学ぶ前に、そもそもteratermマクロをご存知ですか?通常、ネットワーク機器やサーバなどにターミナル接続する際に、手動でアクセスしていると思いますが、それを自動でアクセスさせたりログを自動取得させたりするマクロのことです。これを作り込むことで設定変更すら自動で行うことが出来るんです。(※リスクもあるので、あまりオススメは出来ませんが。)以前の授業でteratermマクロを紹介していますので、よかったら、こちらも見てくださいね。

 

TeraTermマクロの入門

 

定期実行マクロの作成

それでは定期実行マクロの作成をしていきましょう!

 

ログイン情報の入力

まずは、以下のように事前にログイン先を指定しておきましょう。複数のログイン先にアクセスする必要がある場合は、テキストファイルなどに記載して、繰り返し読み込ませることも出来ますが、今回は1つの決められたアドレスだけにします。

 

; 基本情報の入力
HOSTADDR = ‘10.1.1.1’
HOSTNAME = ‘Bell’
PASSWORD = ‘cisco’

 

最初の『HOSTADDR』は、パソコンから直接telnet接続するアドレスになります。次の『USERNAME』『PASSWORD』は、アクセスした機器に設定された際に使用するユーザ名とパスワードになります。ユーザ名を使用していない場合、なくても問題ありません。

 

ログインコマンドの作成

それでは、先程のログイン情報を使ってログインコマンドを作成していきましょう。

 

; コマンド作成
COMMAND = HOSTADDR
strconcat COMMAND ‘:23 /nossh /T=1’

 

先程作成したログイン情報の中で、まず先に使用するのが、『HOSTADDR』です。ログイン先アドレスを代入していたと思いますが、それをまた、『COMMAND』という変数に入れ替えます。次に、この『COMMAND』とログインパラメータをつなげます。今回は、sshではなくtelnetを使用するので、このような書き方になります。

 

ログインの実行

ここまで入力してきた内容を使ってTelnetアクセスしていきましょう。今回はCiscoルータにTelnet接続する応答結果をベースに作成していますが、使用する機器の応答内容に合わせて修正してくれればと思います。

 

; 対象機器にログイン
connect COMMAND

; ログイン応答
wait ‘Password:’
sendln PASSWORD
wait ‘>’
sendln ‘enable’
wait ‘Password’
sendln PASSWORD

 

『connect』でログインを開始します。ログイン先は、先程指定して『10.1.1.1』になります。その後は、ログイン応答を想定してコマンドを投入していくわけですが、最初は『wait』『Password:』と表示されるのを待ちます。表示されたら『sendln』で先程指定した『cisco』を投入します。ユーザ名を使っている機器であれば、『Username:』などと表示されるのを待ち、先程指定したユーザ名を投入するように修正してもらえれば問題ないと思います。

 

一時ログファイルの作成

ログインが完了したら、ログを取得していきましょう。複数のファイルに分割してログ保存する場合、同じファイル名してしまうと、上書きになるかログが混ざるかしてしまうので別名保存をおすすめします。最初は同一ファイル名(log)に保存し、ログが全て取り終えた後に、ログを取得した時間と取得した機器のホストをファイル名に入れておくことでファイル名が被ることを防げます。

 

初めから時間とホスト名を入れたファイルでログを取得しないのは、ログインしてみないとホスト名を取得できないからです。複雑になってしまう部分もあるかもしれませんが、お付き合いください。

 

; MACROとTera Termのディレクトリを現在のディレクトリに変更する
; ログの保存先を現在のディレクトリに変更する
getdir DIR
setdir DIR
changedir DIR
LOG_DIR = DIR

; getdateで日付(年月)を取得してDATESTRに格納する

getdate DATESTR ‘%Y%m%d’
strconcat LOG_DIR ‘\’
strconcat LOG_DIR DATESTR
strconcat MACRO_DIR LOG_DIR

; フォルダ作成
MAKE_DIR = ‘cmd /c md ‘
strconcat MAKE_DIR LOG_DIR
exec MAKE_DIR

; LOG_DIRに「\log」を追加する
strconcat LOG_DIR ‘\log’

 

最初に『getdir DIR』『setdir DIR』『changedir DIR』『LOG_DIR = DIR』と続けて書かれていますが、これによりログの保存先をこのTera Termマクロのファイルを基準にするように変更しています。最後の『LOG_DIR = DIR』により、変数『LOG_DIR』にTera Termマクロの保存先のパスを代入しています。これをしないで相対パスを指定してしまうと、Tera Termマクロが保存されているディレクトリを基準になってしまい、ログの保存先がわからなくなってしまうことがあるので、ご注意を!

 

次に、『getdate』で現在の時間を取得します。これを先程のディレクトリと組み合わせることで、Tera Termマクロの保存先フォルダを作成する準備をします。『cmd /c md』コマンドでWindowsのコマンドプロンプトを立ち上げ先程のディレクトリを作成し、コマンドプロンプトを閉じてくれます。その後、同ディレクトリに『log』ファイルを作成します。これが一時ログ保存するファイルになるのです。

 

最後に『log』ファイルはリネームするので、覚えておいてくださいね!

 

ログ取得準備

ログインができたら、ログ取得の事前準備をしていきます。

 

; 対象機器でログ取得

sendln ‘ter le 0’
mpause 500
waitregex ‘(.+)\#’

HOSTNAME = matchstr
strsplit HOSTNAME ‘#’
HOST_NAME = groupmatchstr1
waitregex ‘(.+)\#’

; ログ取得開始
logopen LOG_DIR 1 0

 

まず、ログインしたら『terminal length 0』を入れて、ログが途中で切れないようにしておきましょう。その後、『mpause 500』を入れていますが、これは500msecを待ってから次の処理をするようにする指示になります。この後にも出てくることがありますが、同じような意味となります。これは処理が速すぎてコケてしまう場合などに入れますが、入れてもうまくいかな場合は値を変えたりしてみてください。作業しているパソコンやLAN環境によってチューニングする必要が出てきたりするので、うまくいかない時は試してみてください。

 

次に来る『waitregex ‘(.+)\#’』で、「ホスト名#」が表示されるのを待ちます。これは正規表現を利用しており、「任意の複数の文字列」+「#」という意味になっています。

 

次に表示された文字列(ホスト名+#)を「HOSTNAME」と「#」に『strsplit』で分割しています。その分割した1番目の値を、『groupmatchstr1』で取り出し、変数(HOST_MANE)に代入します。このようにホスト名だけを抽出しておき、後でログファイルに使用します。これも覚えておいてくださいね!

 

それでは、『logopen LOG_DIR 1 0』でログ取得を開始します。ちなみに最後に『1』『0』の数字がありますが、最初の『1』バイナリモードでの記録を意味します。最後の『0』は、上書きモードでの書き込みを意味しており、追記モードで書き込みたければ『1』に変更してもらえればと思います。

 

 

コマンド投入

それでは取得したいコマンドを入れていきましょう。今回は、以下のコマンドを取得したいと思います。

 

 

上記のコマンドを1秒間隔で10回取得します。これにより10秒間のデータが取得することができます。

; コマンド投入
for i 1 10
sendln ‘show clock’
sendln ‘show ip interface brief’
sendln ‘ping 10.10.1.1 repeat 3’
mpause 1000
next

; ログ取得
mpause 1000
logclose

 

今回は、for文を使ってログの繰り返し取得を実施していきます。『for i 1 10』と書かれている部分を注目してもらいたいのですが、意味としては、『変数(i)』に初期値『1』を入れて、以下のコマンドを実行したらプラス1ずつしていき、『10』になったらループを終了することになります。また実行間隔は、『mpause 1000』と記載されていますので、「1000msec=1秒」で実行するようにしていますので、取得したい間隔に合わせて使用してください。そこまでいったら、ログファイルを閉じます。

 

 

 

ファイル名のリネーム

この状態では、拡張子のない「log」ファイルのままになってしまうので、リネームしてわかりやすい名前にしていきます。

 

; ファイル名の加工
; getdateで日付(年月日_時分秒)を取得しDATESTRに格納する
getdate DATESTR ‘_%Y%m%d_%H%M%S.txt’

; strconcatで変数FILE_HOST_NAMEの末尾に日付を追加する
FILE_HOST_NAME = HOST_NAME
strconcat FILE_HOST_NAME DATESTR
strconcat MACRO_DIR ‘\’
strconcat MACRO_DIR FILE_HOST_NAME

; ファイル名を変更する
; log→変数FILE_HOST_NAME
filerename LOG_DIR MACRO_DIR

 

先程も使用した『getdate』で現在時刻を取得し、『変数(DATESTR)』に代入するのですが、その際に『_%Y%m%d_%H%M%S.txt』のフォーマットに合わせます。『%Y%m%d_%H%M%S』とは、年月日と時分秒を組み合わせたフォーマットになります。例えば、2018年1月1日の12時34分56秒にログ取得していたら、「20180101_123456」と表記されます。

 

『FILE_HOST_NAME』に、先程取得したホスト名(『HOST_NAME』)を代入し、その後、日時(『DATESTR』)をつなげてファイル名にします。そしたら、変数(『MACRO_DIR』)に『\』と変数(『FILE_HOST_NAME』)をつなげて、この『log』の保存先までのパスとファイル名をつなげて完成です。

 

この時点で、『MACRO_DIR』の中には、Tera Termマクロの保存先から見て以下のようになっているはずです。

 

 

それでは、『filerename』で、『LOG_DIR』から『MACRO_DIR』にファイルをリネームしておしまいですね。

 

マクロの終了

それでは、マクロを終了していきましょう。

 

; マクロの終了
wait ‘#’
mpause 500
sendln ‘exit’
end

 

500msec待った後に、『exit』を入力してtelnetから抜けたら、『end』でマクロを終了します。

 

サンプル

今回、使用したマクロを載せておきます。ここまでに解説させてもらった内容となりますので、コピペして使ってもらえればと思います。

 

; 基本情報の入力
HOSTADDR = ‘10.1.1.1’
HOSTNAME = ‘Bell’
PASSWORD = ‘cisco’

; コマンド作成
COMMAND = HOSTADDR
strconcat COMMAND ‘:23 /nossh /T=1’

; 対象機器にログイン
connect COMMAND

; ログイン応答
wait ‘Password:’
sendln PASSWORD
wait ‘>’
sendln ‘enable’
wait ‘Password’
sendln PASSWORD

; MACROとTera Termのディレクトリを現在のディレクトリに変更する
; ログの保存先を現在のディレクトリに変更する
getdir DIR
setdir DIR
changedir DIR
LOG_DIR = DIR

; getdateで日付(年月)を取得してDATESTRに格納する
getdate DATESTR ‘%Y%m%d’
strconcat LOG_DIR ‘\’
strconcat LOG_DIR DATESTR
strconcat MACRO_DIR LOG_DIR

; フォルダ作成
MAKE_DIR = ‘cmd /c md ‘
strconcat MAKE_DIR LOG_DIR
exec MAKE_DIR

; LOG_DIRに「\log」を追加する
strconcat LOG_DIR ‘\log’

; 対象機器でログ取得

sendln ‘ter le 0’
mpause 500
waitregex ‘(.+)\#’

HOSTNAME = matchstr
strsplit HOSTNAME ‘#’
HOST_NAME = groupmatchstr1
waitregex ‘(.+)\#’

; ログ取得開始
logopen LOG_DIR 1 0

for i 1 10
sendln ‘show clock’
sendln ‘show ip interface brief’
sendln ‘ping 10.10.1.1 repeat 3’
mpause 1000
next

; ログ取得
mpause 1000
logclose

; ファイル名の加工
; getdateで日付(年月日_時分秒)を取得しDATESTRに格納する
getdate DATESTR ‘_%Y%m%d_%H%M%S.txt’

; strconcatで変数FILE_HOST_NAMEの末尾に日付を追加する
FILE_HOST_NAME = HOST_NAME
strconcat FILE_HOST_NAME DATESTR
strconcat MACRO_DIR ‘\’
strconcat MACRO_DIR FILE_HOST_NAME

; ファイル名を変更する
; log→変数FILE_HOST_NAME
filerename LOG_DIR MACRO_DIR

; マクロの終了
wait ‘#’
mpause 500
sendln ‘exit’
end

 

 

まとめ

ベル

Windowsのタスクスケジューラまで書きたかったのですが、長くなってしまったので、今回はここまでにします。次回は、この続きを教えていこうと思いますので、ここまでをしっかり覚えておいてくださいね!

次の授業ができましたよ。タスクスケジューラを使ってTera Termマクロを定期実行する方法を教えます!

Pythonでログ解析 〜【番外編②】ログの定期取得マクロ〜

Follow me!

Pythonでログ解析(4) 〜【番外編①】ログの定期取得マクロ〜” に対して1件のコメントがあります。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です