Learning EEM (Embedded Event Manager).


Awesome. Got alot of EEM ground covered today.

Seems like a very powerful scripting engine that stands out, by having the ability to be triggered under certain

circumstances.

Lets check out an example using the topology below:

EEM Topology

R1 is connected to an ethernet segment. Imagine that on this ethernet segment we have multiple things running.
In order to test things out, imagine that R2 is our NMS.
The ethernet segment is using the following subnet: 192.168.100.0/24.
Imagine that R1 is tracking an interface which is directly connected to a segment that contains your SQL cluster.
If for some reason this interface goes down, you want to be alerted immediately.
In addition to this, R1 is locked down pretty tight, only allowing incomming routing information and nothing else.
Here’s some configuration snippets from R1:

R1(config-if)#do sh ip int b
Interface                  IP-Address      OK? Method Status                Protocol
FastEthernet0/0            192.168.100.1   YES manual up                    up
FastEthernet0/1            172.16.0.1      YES manual up                    up
R1(config-if)#do sh int descr
Interface                      Status         Protocol Description
Fa0/0                          up             up       LAN-Segment
Fa0/1                          up             up       SQL-Cluster-Segment
R1(config-router)#do sh run | sec eigrp
router eigrp 100
 network 192.168.0.0 0.0.255.255
 auto-summary
 R1(config-router)#do sh ip ei nei
IP-EIGRP neighbors for process 100
H   Address                 Interface       Hold Uptime   SRTT   RTO  Q  Seq
 (sec)         (ms)       Cnt Num
0   192.168.100.2           Fa0/0             13 00:00:11    1  5000  2  0
interface FastEthernet0/0
 description LAN-Segment
 ip address 192.168.100.1 255.255.255.0
 ip access-group 110 in
 duplex auto
 speed auto
end
R1(config)#do sh access-list
Extended IP access list 110
 10 permit eigrp any any (36 matches)

As you can see, we have our interfaces defined, they are in an up state, we have EIGRP working, we have an access-list applied,

which is denying anything else than EIGRP.

Lets make sure that we cannot access R1 from R2 in a normal situation:

R2#telnet 192.168.100.1
Trying 192.168.100.1 ...
% Destination unreachable; gateway or host down

Alright, so everything is in a stable state.

So the task is, if the Fa0/1 interface on R1 goes down, we want to try and put the interface back up. In addition to this

we want to send an email to the administrator, generate a syslog message (i know this can be done by other means) and

allow access to the router for telnet administration. So three things:

1) Put interface back up.

2) Generate a syslog message.

3) Open up for telnet administration to the router.

4) Email the administrator.

Lets setup some things we need to utilize in our EEM applet.

First off, lets setup a tracking object to track the interface to the SQL Cluster Segment:

track 1 interface f0/1 line-protocol

This should now list something like this:

R1#sh track
Track 1
 Interface FastEthernet0/1 line-protocol
 Line protocol is Up
 9 changes, last change 00:21:27

With this, we are now actively tracking the interface toward the SQL Cluster.

Now to create the access-list we want implemented in case the interface goes down:

access-list 120 permit tcp any any eq telnet
access-list 120 permit tcp host 192.168.100.100 any
access-list 120 permit eigrp any any

This states, that in addition to the EIGRP that was originally allowed, it is now possible to use telnet to access R1. We are also allowing traffic from the SMTP server.

We now have things in place to create the EEM applet:

event manager applet OUR-APP
 event track 1 state down
 action 2.0 syslog msg "Oh dear. The interface has gone down."
 action 3.0 cli command "enable"
 action 3.1 cli command "conf t"
 action 3.2 cli command "int f0/1"
 action 3.3 cli command "no sh"
 action 4.0 cli command "int f0/0"
 action 4.1 cli command "ip access-group 120 in"
 action 5.0 mail server "192.168.100.100" to "admin@local" from "R1@local" subject "SQL Cluster Segment down" body "SQL Cluster Segment is down. I have tried putting the interface back up, and i have now allowed you telnet access."

Lets analyse this a bit further.

We will use an event that tells the applet to track the number 1 tracking object. Only if this tracking object is in a down state, do we want to execute this applet.

Things are then executed in order.

The 2.0 action, sends a syslog message.

The 3.x actions performs some CLI tasks, that will try and put the f0/1 interface back into an up state.

The 4.x actions also performs CLI tasks, going into the f0/0 interface and applies a different ACL to allow access through telnet.

Finally the 5.0 action sends a mail to the administrator through a certain SMTP server (relaying and all that assumed to be working).

Thats basically all there is to it!

Now to verify it all. We will shut down the f0/1 interface and see what happens:

R1(config)#int f0/1
R1(config-if)#sh
R1(config-if)#^Z
R1#
*Mar  1 00:56:28.155: %TRACKING-5-STATE: 1 interface Fa0/1 line-protocol Up->Down
*Mar  1 00:56:28.223: %HA_EM-6-LOG: OUR-APP: Oh dear. The interface has gone down.
*Mar  1 00:56:28.299: %SYS-5-CONFIG_I: Configured from console by console
*Mar  1 00:56:28.439: %TRACKING-5-STATE: 1 interface Fa0/1 line-protocol Down->Up
*Mar  1 00:56:30.151: %LINK-3-UPDOWN: Interface FastEthernet0/1, changed state to up
*Mar  1 00:56:40.711: %HA_EM-3-FMPD_SMTP: Error occured when sending mail to SMTP server: 1.2.3.4 : error in connecting to SMTP server
*Mar  1 00:56:40.711: %HA_EM-3-FMPD_ERROR: Error executing applet OUR-APP statement 5.0

and lets check if we are now able to telnet to R1 from R2:

R2#telnet 192.168.100.1
Trying 192.168.100.1 ... Open
User Access Verification
Password:

Great! we can now access the router and perform further troubleshooting. Note in the output above, that we do log a syslog message. Also note

that we try and send an email, but since i dont have any SMTP server on that network, it wont work.

Task performed. Hope it helped clear up some stuff on when and how to use this feature!

Take care!