カテゴリー
2022年 CCNP Enterprise Cisco コマンド コンピューター トラブルシューティング 技術一般 自動化 認定資格

Cisco EEM とは

CCNP R&S を CCNP Enterprise で更新しようと勉強を始めました。今回は、Enterprise Core の試験範囲の 1つである EEM について調べてみました。

PVアクセスランキング にほんブログ村 にほんブログ村 ブログブログへ
にほんブログ村

EEM とは

EEM (Embedded Event Manager) を使うことで、何らかのイベント発生時をトリガーとして、指定したアクションを実行することが可能となります。

IOS、IOS XR、IOS XE、NX-OS で利用ができ、EEM は IPBASE から利用できるので、安価なモデルでも使用可能となります。

利用シーンとして例えば、以下のようなケースがあります。

  • 特定のインターフェースを監視し、そのインターフェースがっダウンとなったら、管理者へメールを送信
  • CPU 使用率を監視し、事前に決めた閾値を超えたら、CPU 使用率の情報を取得してシスログで送信
  • インターフェースのエラー率を監視し、事前に決めたエラー率を超えた場合、該当インターフェースをシャットダウンさせSNMP トラップを送信

私のケースでは、IOS version 15.9 を使用して確認してます。

EEM の構成要素

以下の3つから構成されます。

  1. Event Director
  2. Policy
  3. EEMサーバ

事前に定義した Event と Action を Policy と呼びます。

Event DirectorPolicy に従ってイベントを監視し、

アクションを実行させる場合に、EEM サーバーに通知をします。

具体的には、Event Manager の中で、以下の項目を指定できます。

C892-02(config)#event manager ?
  applet       Register an Event Manager applet
  detector     Set Embedded Event Manager detector information
  directory    Set Embedded Event Manager directory information
  environment  Set an Embedded Event Manager global environment variable
  history      Set Embedded Event Manager history information
  policy       Register an Embedded Event Manager policy
  scheduler    Set Event Manager scheduler options
  session      Set Embedded Event Manager session attributes

Event Director で監視可能な対象(よく使うだろうもの)は、以下の通りとなります。

  • SNMP
    SNMP MIBオブジェクトを監視し、オブジェクトの値が任意の値とマッチするか、任意の閾値を越えた場合にイベント通知
  • Syslog
    事前に定義した文字列をトリガーにイベント通知
  • Timer
    absolute-time-of-day、countdown、watchdog、CRON の 4 タイプのタイマーをサポートし、それぞれイベントを通知
  • Interface Counter
    インタフェースカウンタが閾値を超えた際にイベントを通知
  • CLI
    CLIを正規表現で検査し、マッチした場合にイベントを通知
  • OIR
    モジュール等のOIRを検知した場合にイベント通知(Online Insertion and Removal:活性挿抜(いわゆるホットスワップ))
  • SNMP Proxy
    外部からのSNMPトラップを受けてイベントを通知
  • Routing
    ルーティングテーブルの変化を検知した際にイベントを通知
  • NetFlow
    NetFlow情報監視し、オブジェクトの値が任意の値とマッチ、あるいは任意の閾値を越えた場合にイベント通知
  • Neighbor Discovery
    CDPまたはLLDPによる情報を受けてイベントを通知
  • Mac Address Table
    MACアドレステーブルの変化を検知した際にイベントを通知

Event Director の監視対象イベントとして設定できる項目全ては、以下の通りです。

C892-02(config-applet)#event ?
  application         Application specific event
  cli                 CLI event
  config              Configuration policy event
  counter             Counter event
  env                 Environmental event
  identity            Identity event
  interface           Interface event
  ioswdsysmon         IOS WDSysMon event
  ipsla               IPSLA Event
  neighbor-discovery  Neighbor Discovery event
  nf                  NF Event
  none                Manually run policy event
  oir                 OIR event
  resource            Resource event
  rf                  Redundancy Facility event
  routing             Routing event
  rpc                 Remote Procedure Call event
  snmp                SNMP event
  snmp-notification   SNMP Notification Event
  snmp-object         SNMP object event
  syslog              Syslog event
  tag                 event tag identifier
  timer               Timer event
  track               Tracking object event

イベントを受けた後に実行出来る主なアクションは、以下の通りです(よく使われるもの)。

  • コマンドの実行や結果の取得
  • SNMPへのアクセス
  • 再起動
  • EEM Policyの呼び出し
  • スイッチオーバー
  • Eメール送信
  • SNMP Trap送信
  • Syslog送信

アクションとして設定できる項目全ては、以下の通りです。

C892-02(config-applet)#action 1.0 ?
  add                Add
  append             Append to a variable
  break              Break out of a conditional loop
  cli                Execute a CLI command
  cns-event          Send a CNS event
  comment            add comment
  context            Save or retrieve context information
  continue           Continue to next loop iteration
  counter            Modify a counter value
  decrement          Decrement a variable
  divide             Divide
  else               else conditional
  elseif             elseif conditional
  end                end conditional block
  exit               Exit from applet run
  file               file operations
  force-switchover   Force a software switchover
  foreach            foreach loop
  gets               get line of input from active tty
  handle-error       On error action
  help               Read/Set parser help buffer
  if                 if conditional
  increment          Increment a variable
  info               Obtain system specific information
  mail               Send an e-mail
  multiply           Multiply
  policy             Run a pre-registered policy
  publish-event      Publish an application specific event
  puts               print data to active tty
  regexp             regular expression match
  reload             Reload system
  set                Set a variable
  snmp-object-value  Specify value for the SNMP get request
  snmp-trap          Send an SNMP trap
  string             string commands
  subtract           Subtract
  syslog             Log a syslog message
  track              Read/Set a tracking object
  wait               Wait for a specified amount of time
  while              while loop

EEM の設定例

1. インターフェースが “Administratively down” されたら、”no shutdown” コマンドを発行

インタフェースがシャットダウンされると「Interface , changed state to administratively down」というログが出力されます。このシステムログのメッセージをイベントとして検出してそれをトリガーとして、CLI コマンドで “no shutdown” を発行するアクションを定義します。

まず、VLAN113をシャットダウンした時のシスログメッセージを確認します。

C892-02(config)#int vlan 113
C892-02(config-if)#shutdown
C892-02(config-if)#
017611: Mar  3 18:51:50.925: %LINK-5-CHANGED: Interface Vlan113, changed state to administratively down

上記のメッセージが出力されるのが分かります。

event manager applet No_Shutdown_VLAN113
 description "issue no shut"
 event syslog pattern "Interface Vlan113, changed state to administratively down"
 action 1.0 cli command "enable"
 action 2.0 cli command "config t"
 action 3.0 cli command "interface vlan113"
 action 4.0 cli command "no shutdown"

アクションを定義する時のポイントは、 “enable” や “config t”, “interface xxx” など、対象となるコマンドが発行できるモードまで進むコマンドも併せて定義するところです。

実行されたEEM のログを見たい場合、デバッグコマンドを実行しておきます。

debug event manager action cli

デバッグコマンド投入後、1の例の EEM を実行すると、以下のようなログが出力されます。VLAN113 がシャットされたことを検知して、”no shut” コマンドが発行されて、再び VLAN113 が Up になってますね。

C892-02(config)#int vlan 113
C892-02(config-if)#shut
C892-02(config-if)#
017631: Mar  3 18:58:36.864: %FW-6-DROP_PKT: Dropping tcp session 116.223.132.218:443 172.16.23.4:49699  due to  RST inside current window with ip ident 64807 tcpflags 0x8014 seq.no 3652153217 ack 1529682709
017632: Mar  3 18:58:38.468: %LINK-5-CHANGED: Interface Vlan113, changed state to administratively down
017633: Mar  3 18:58:38.472: %HA_EM-6-LOG: No_Shutdown_VLAN113 : DEBUG(cli_lib) : : CTL : cli_open called.
017634: Mar  3 18:58:38.480: %HA_EM-6-LOG: No_Shutdown_VLAN113 : DEBUG(cli_lib) : : OUT : CCC
017635: Mar  3 18:58:38.480: %HA_EM-6-LOG: No_Shutdown_VLAN113 : DEBUG(cli_lib) : : OUT : Cisco 982 (Serial Number: FGL151727WV)
017636: Mar  3 18:58:38.480: %HA_EM-6-LOG: No_Shutdown_VLAN113 : DEBUG(cli_lib) : : OUT : This is Cisco 982-02 @ Living room for Internet settings.
017637: Mar  3 18:58:38.480: %HA_EM-6-LOG: No_Shutdown_VLAN113 : DEBUG(cli_lib) : : OUT : No one is allowed to login to this system except Kanta Nakashima.
017638: Mar  3 18:58:38.480: %HA_EM-6-LOG: No_Shutdown_VLAN113 : DEBUG(cli_lib) : : OUT :
017639: Mar  3 18:58:38.480: %HA_EM-6-LOG: No_Shutdown_VLAN113 : DEBUG(cli_lib) : : OUT : C892-02>
017640: Mar  3 18:58:38.480: %HA_EM-6-LOG: No_Shutdown_VLAN113 : DEBUG(cli_lib) : : IN  : C892-02>enable
017641: Mar  3 18:58:38.492: %HA_EM-6-LOG: No_Shutdown_VLAN113 : DEBUG(cli_lib) : : OUT : C892-02#
017642: Mar  3 18:58:38.492: %HA_EM-6-LOG: No_Shutdown_VLAN113 : DEBUG(cli_lib) : : IN  : C892-02#config t
017643: Mar  3 18:58:38.508: %HA_EM-6-LOG: No_Shutdown_VLAN113 : DEBUG(cli_lib) : : OUT : Enter configuration commands, one per line.  End with CNTL/Z.
017644: Mar  3 18:58:38.508: %HA_EM-6-LOG: No_Shutdown_VLAN113 : DEBUG(cli_lib) : : OUT : C892-02(config)#
017645: Mar  3 18:58:38.508: %HA_EM-6-LOG: No_Shutdown_VLAN113 : DEBUG(cli_lib) : : IN  : C892-02(config)#interface vlan113
017646: Mar  3 18:58:38.520: %HA_EM-6-LOG: No_Shutdown_VLAN113 : DEBUG(cli_lib) : : OUT : C892-02(config-if)#
017647: Mar  3 18:58:38.520: %HA_EM-6-LOG: No_Shutdown_VLAN113 : DEBUG(cli_lib) : : IN  : C892-02(config-if)#no shutdown
017648: Mar  3 18:58:38.532: %HA_EM-6-LOG: No_Shutdown_VLAN113 : DEBUG(cli_lib) : : OUT : C892-02(config-if)#
017649: Mar  3 18:58:38.532: %HA_EM-6-LOG: No_Shutdown_VLAN113 : DEBUG(cli_lib) : : CTL : cli_close called.
017650: Mar  3 18:58:38.536:
017651: Mar  3 18:58:38.536: tty is now going through its death sequence
017652: Mar  3 18:58:40.524: %LINK-3-UPDOWN: Interface Vlan113, changed state to up
C892-02(config-if)#

2. 定期的にコマンドを実行し、その結果を NVRAM に書き込む

例えば、毎日午前 7時に “show ip route” コマンドを実行し、その内容を NVRAM に書き込んでいきます。

event manager applet Router-02
event timer cron name _EEMinternalname0 cron-entry "0 7 * * *"
action 1.0 cli command "enable"
action 2.0 cli command "show ip route | append nvram:Router-02"

まず、毎日午前7時という cron タイマをイベントとして登録します。「毎日午前7時」なので、cron-entry のあとに ”0 7 * * *” を指定します。

ちなみに、”0 18 * * *” だと「午後の6時」になります。

そして、アクションとして ”show ip route | append nvram:Router-02” の CLI コマンドを実行します。

“show ip route” の出力先として NVRAM 上の Router-02 ファイルを追記で指定しています。

NVRAM 上のファイルを表示する場合は、 more コマンドを使って、ファイルなを指定します。

more nvram:Router-02 <<< ファイル名を指定

EEM は CLI を使った設定と、Tcl スクリプトを使ってプログラミングする方法の 2種類があります。

CLI ベースは設定が簡単である反面、細かい制御をすることは出来ません。

逆に Tcl ベースだと、細かい制御をすることが出来ますが、Tcl スクリプトを扱えないといけませんので、若干敷居が高いかもしれません。ちょっとしたことをやりたいだけなら、CLI での設定でも十分でしょう。

この EEM はちょっといろいろ使えそうです。自宅の実環境で使ってみて、具体例をまた紹介したいと思います。

おもしろかったら、フォローしてください!

世の中には楽しいことがいっぱい - にほんブログ村

関連する記事:

最近の記事: