Edited at

Cisco IOS EEMを使ったTclスクリプトの実行

More than 1 year has passed since last update.


EEM(Embedded Event Manager)

シスコルータやスイッチで動作するIOSでは、事前定義した任意のイベント検出に基いてコマンド実行やSyslog送信といったアクションを実行する機能があります。イベントは、タイマーや装置内部でのSNMPポーリングといった周期的なものや、起動後に一回だけ、Syslogの正規表現によるマッチ、フローのカウンタの閾値やデルタ、任意のIPアドレスへのリンクダウン検出、など様々な定義が可能です。

アクションまで含めてIOS CLIで設定可能ですが、EEMロジックの定義として、Tcl(Tool Command Language)が古くからサポートされており、今後は全面的にPythonもサポートされてきます。Tclは、良くも悪くも「枯れきって」いるため、「困ったときのEEM/Tcl頼み」といった感じで、裏方では日本国内でも利用実績が豊富にあります。


やってみる

もっとも簡単なスクリプトを作成し、IOS上で動作させてみます。

Tclスクリプトを作成します。エディターは(もちろん)何でも結構です。


test.tcl

::cisco::eem::event_register_none

namespace import ::cisco::eem::*
namespace import ::cisco::lib::*

action_syslog msg "Hello Tcl from Syslog!"
puts "Hello Tcl!"


一行名はイベントの定義、ここではNONE(イベントなし)とし、テスト用に手動で実行とします。Tcl標準コマンドに加えて、シスコIOSがサポートするコマンド(syslog、CLI、ルータからメール送信、SNMPポーリングなどなど)を使えるようにnamespaceをimportしておきます。ほぼ、決め打ちだと思います。

作成後、ルータやスイッチに転送します。(copyコマンドや、USBフラッシュで物理的に..など。)

ルータ上でTclファイルが確認できます。


IOS

C4331-02#sh bootflash: | i .tcl

30 168 Mar 09 2017 01:44:45 +00:00 /bootflash/test.tcl

EEM用のTclスクリプトのPathを設定し、先ほど転送したtest.tclを登録します。以上で終了です。


IOS

C4331-02#conf t

C4331-02(config)#event manager directory user policy "bootflash:/"
C4331-02(config)#event manager policy test.tcl type user
C4331-02(config)#end
C4331-02#

さて、イベントを発行(NONEイベントを手動で実行)してみましょう!


IOS

C4331-02#event manager run test.tcl

Hello Tcl!

C4331-02#
Mar 9 02:02:18.369: %HA_EM-6-LOG: test.tcl: Hello Tcl from Syslog!
C4331-02#


putsと、syslogによるコンソール出力の二つが確認できました。実行させるだけなら、とても簡単ですが、スクリプトを工夫すれば(メーカーが機能として提供していないものも含めて)ものすごく高度なロジックが実装できます。

※アクセススイッチからコアルータまで、サポート範囲も広く、ライセンス料もかかりません。