Práticas recomendadas e scripts úteis para EEM
Contents
Introduction
Prerequisites
Requirements
Componentes Utilizados
Convenções
Melhores práticas
Confirme se a autenticação apropriada está no lugar
Adicionar restrições para tempo de execução do EEM e limite de taxa
Evite a execução fora de ordem
Desativar paginação
Scripts de projeto para manutenção futura
Padrões lógicos comuns de EEM
Caminhos do código da filial com if/else
Declarações de Loop Over
Extrair saída por expressões regulares (Regex)
Scripts úteis do EEM
Rastrear endereço MAC específico para o endereço MAC Saiba mais
Monitorar CPU alta via SNMP OID
Corresponder dinamicamente uma saída PID e gravar pilha
Atualizar um Switch
Descarregar dados de diagnóstico para um arquivo quando um objeto rastreado por SLA de IP é
desativado
Enviar um e-mail do EEM
Desligar uma porta em uma programação
Desligar uma interface se uma determinada taxa de pacotes por segundo (PPS) for alcançada
Referências
Introduction
Este documento descreve as práticas recomendadas de configuração de script do Embedded
Event Manager (EEM) em dispositivos Cisco IOS-XE e fornece exemplos de sintaxe comum e
scripts úteis.
Prerequisites
Requirements
Este documento pressupõe que o leitor já está familiarizado com o recurso Cisco IOS/IOS-XE
Embedded Event Manager (EEM). Se você ainda não está familiarizado com este recurso, leia a
Componentes Utilizados
As informações neste documento são baseadas nestas versões de software e hardware:
Switches Cisco Catalyst 9300, 9400 e 9500 que executam o Cisco IOS Software versão 16.X
ou 17.X
●
Esses scripts não são suportados pelo Cisco TAC e são fornecidos no estado em que se
encontram para fins educacionais.
As informações neste documento foram criadas a partir de dispositivos em um ambiente de
laboratório específico. All of the devices used in this document started with a cleared (default)
configuration. If your network is live, make sure that you understand the potential impact of any
command.
Convenções
Consulte as Convenções de Dicas Técnicas da Cisco para obter informações sobre convenções
de documentos
Melhores práticas
Esta seção aborda alguns dos problemas mais comuns observados com o projeto e a
implementação de scripts de EEM. Para obter informações adicionais sobre as melhores práticas
do EEM, consulte o documento Melhores práticas do EEM mencionado na seção Referências.
Confirme se a autenticação apropriada está no lugar
Se seu dispositivo usa AAA, você deve garantir que os scripts EEM configurados no dispositivo
sejam configurados com um usuário AAA capaz de executar os comandos no script ou que o
desvio de autorização seja configurado com o comando authorization bypass na definição do
script.
Adicionar restrições para tempo de execução do EEM e limite de taxa
Por padrão, os scripts EEM podem ser executados por no máximo 20 segundos. Se você projetar
um script que levará mais tempo para ser executado ou terá que esperar entre a execução do
comando, especifique um valor maxrun no disparo de eventos do applet para alterar o
temporizador de execução padrão.
Também é importante considerar com que frequência o evento que dispara seu script EEM pode
ser executado. Se você disparar um script de uma condição que ocorre rapidamente em um curto
período de tempo (ou seja, o acionador de syslog para flaps MAC), é importante incluir uma
condição de limite de taxa no script EEM para evitar um número excessivo de execuções em
paralelo e impedir a exaustão dos recursos do dispositivo.
Evite a execução fora de ordem
Conforme descrito na documentação do EEM, a ordem de execução das instruções de ação é
controlada pela sua etiqueta (ou seja, 'action 0001 cli command enable tem um rótulo 0001). Este
valor de rótulo NÃO é um número, mas sim alfanumérico. As ações são ordenadas em sequência
de teclas alfanuméricas ascendentes, usam o argumento label como a chave de ordenação e são
executadas nesta sequência. Isso pode levar a uma ordem de execução inesperada, com base
na forma como você estrutura suas etiquetas de ação.
Considere este exemplo:
event manager applet test authorization bypass event timer watchdog time 60 maxrun 60
action 13 syslog msg "You would expect to see this message first" action 120 syslog msg "This message will print first"
Como 120 é anterior a 13 em uma comparação alfanumérica, este script não será executado na
ordem esperada. Para evitar isso, é útil usar um sistema de preenchimento como este:
event manager applet test authorization bypass event timer watchdog time 60 maxrun 60
action 0010 syslog msg "This message will appear first" action 0020 syslog msg "This message will appear second" action 0120 syslog msg "This message will appear third"
Devido ao preenchimento aqui, as instruções numeradas serão avaliadas na ordem esperada. O
incremento de 10 entre cada rótulo permite que instruções adicionais sejam inseridas no script
EEM posteriormente, quando necessário, sem a necessidade de renumerar todas as instruções
subsequentes.
Desativar paginação
O EEM procura o prompt do dispositivo para determinar quando a saída do comando está
completa. Os comandos que produzem mais dados e, em seguida, podem ser exibidos em uma
tela (conforme configurado pelo comprimento do terminal), podem impedir que os scripts de EEM
sejam concluídos (e eventualmente mortos pelo temporizador de execução máxima), pois o
prompt do dispositivo não será exibido até que todas as páginas da saída sejam visualizadas.
Configure o termo len 0 no início dos scripts EEM que examinam grandes saídas.
Scripts de projeto para manutenção futura
Ao projetar um script EEM, deixe lacunas entre os rótulos de ação para facilitar a atualização da
lógica do script EEM no futuro. Quando estiverem disponíveis lacunas adequadas (ou seja, duas
declarações, como a ação 0010 e a ação 0020, deixam uma lacuna de 9 rótulos que podem ser
inseridos), podem ser acrescentadas novas afirmações, se necessário, sem renumeração ou
reverificação dos rótulos de ação e asseguram que as ações continuem a ser executadas na
ordem prevista.
Há comandos comuns que você pode precisar executar no início dos scripts do EEM. Isso pode
incluir:
set terminal length to 0
●
entrar no modo de ativação
●
habilitar timestamp automático para saída de comando
●
Você verá isso como um padrão comum nos exemplos mostrados neste documento, onde muitos
dos scripts começam com as mesmas 3 instruções de ação para configurá-lo.
Padrões lógicos comuns de EEM
Esta seção aborda alguns padrões lógicos comuns e blocos de sintaxe usados em scripts EEM.
Os exemplos aqui não são scripts completos, mas demonstrações de como uma funcionalidade
específica pode ser usada para criar scripts complexos de EEM.
Caminhos do código da filial com if/else
As variáveis EEM podem ser usadas para controlar o fluxo de execução de scripts EEM.
Considere este script EEM:
event manager applet snmp_cpu authorization bypass event timer watchdog time 60
action 0010 info type snmp oid 1.3.6.1.4.1.9.9.109.1.1.1.1.3.1 get-type exact action 0020 if $_info_snmp_value ge "50"
action 0030 syslog msg "This syslog message will be sent if CPU utilization is above 50%" action 0040 elseif $_info_snmp_value ge "30"
action 0050 syslog msg "This syslog message will be sent if CPU utilization is above 30% and below 50%"
action 0060 else
action 0070 syslog msg "This syslog message will only be sent if CPU utilization is below 30%" action 0080 end
Esse script será executado a cada minuto, examinará o valor do OID SNMP para utilização da
CPU e, em seguida, inserirá um dos três caminhos de execução diferentes com base no valor do
OID. Instruções semelhantes podem ser usadas em qualquer outra variável de EEM legal para
criar fluxos de execução complexos em scripts de EEM.
Declarações de Loop Over
Os loops de execução podem ser usados para encurtar significativamente os scripts do EEM e
torná-los mais fáceis de explicar. Considere este script, projetado para obter as estatísticas da
interface para Te2/1/15 6 vezes em um período de 1 minuto para verificar se há pequenos
períodos de alta utilização:
event manager applet int_util_check auth bypass event timer watchdog time 300 maxrun 120
action 0001 cli command "enable"
action 0002 cli command "term exec prompt timestamp" action 0003 cli command "term length 0"
action 0010 syslog msg "Running iteration 1 of command"
action 0020 cli command "show interface te2/1/15 | append flash:interface_util.txt" action 0030 wait 10
action 0040 syslog msg "Running iteration 2 of command"
action 0050 cli command "show interface te2/1/15 | append flash:interface_util.txt" action 0060 wait 10
action 0070 syslog msg "Running iteration 3 of command"
action 0080 cli command "show interface te2/1/15 | append flash:interface_util.txt" action 0090 wait 10
action 0100 syslog msg "Running iteration 4 of command"
action 0110 cli command "show interface te2/1/15 | append flash:interface_util.txt" action 0120 wait 10
action 0130 syslog msg "Running iteration 5 of command"
action 0140 cli command "show interface te2/1/15 | append flash:interface_util.txt" action 0150 wait 10
action 0160 syslog msg "Running iteration 6 of command"
action 0170 cli command "show interface te2/1/15 | append flash:interface_util.txt"
Com construções de loop EEM, este script pode ser significativamente reduzido:
event manager applet int_util_check auth bypass event timer watchdog time 300 maxrun 120
action 0001 cli command "enable"
action 0002 cli command "term exec prompt timestamp" action 0003 cli command "term length 0"
action 0010 set loop_iteration 1 action 0020 while $loop_iteration le 6
action 0030 syslog msg "Running iteration $loop_iteration of command"
action 0040 cli command "show interface te2/1/15 | append flash:interface_util.txt" action 0050 wait 10
action 0060 increment loop_iteration 1 action 0070 end
Extrair saída por expressões regulares (Regex)
A instrução EEM regexp pode ser usada para extrair valores da saída do comando a ser usado
em comandos subsequentes e ativar a criação de comandos dinâmicos dentro do próprio script
EEM. Consulte este bloco de código para obter um exemplo para extrair o PID do SNMP ENGINE
da saída de show proc cpu | i mecanismo SNMP e imprima-o em uma mensagem syslog. Esse
valor extraído também pode ser usado em outros comandos que exigem um PID para ser
executado.
event manager applet check_pid auth bypass event none
action 0010 cli command "show proc cpu | i SNMP ENGINE"
action 0020 regexp "^[ ]*([0-9]+) .*" $_cli_result match match1 action 0030 syslog msg "Found SNMP Engine PID $match1"
Scripts úteis do EEM
Rastrear endereço MAC específico para o endereço MAC Saiba mais
Neste exemplo, o endereço MAC b4e9.b0d3.6a41 é rastreado. O script verifica a cada 30
segundos se o endereço MAC especificado foi aprendido nas tabelas ARP ou MAC. Se o MAC for
visto, o script executa estas ações:
gera uma mensagem de syslog (isso é útil quando você deseja confirmar onde um endereço
MAC é aprendido ou quando/com que frequência ele é aprendido).
●
Implementação
event manager applet mac_trace authorization bypass event timer watchdog time 30
action 0001 cli command "enable"
action 0002 cli command "term exec prompt timestamp"
action 0003 cli command "term length 0" action 0010 cli command "show ip arp | in
b4e9.b0d3.6a41" action 0020 regexp ".*(ARPA).*" $_cli_result action 0030 if $_regexp_result eq 1 action 0040 syslog msg $_cli_result action 0050 end action 0060 cli command "show mac add vlan 1 | in b4e9.b0d3.6a41" action 0070 regexp ".*(DYNAMIC).*" $_cli_result action 0080 if
$_regexp_result eq 1 action 0090 syslog msg $_cli_result action 0100 end
Este script monitora um OID SNMP usado para ler a porcentagem de ocupação da CPU nos
últimos 5 segundos. Quando a CPU está mais de 80% ocupada, o script executa estas ações:
cria um carimbo de data e hora a partir da saída de show clock e usa isso para criar um nome
de arquivo exclusivo
●
as saídas sobre o processo e o estado do software são gravadas nesse arquivo
●
uma Captura de Pacotes Integrados (EPC - Embedded Packet Capture) é configurada para
capturar 10 segundos de tráfego destinado ao plano de controle e grava-o em um arquivo.
●
uma vez concluída a captura do EPC, a configuração do EPC é removida e o script sai.
●
Implementação
event manager applet high-cpu authorization bypass
event snmp oid 1.3.6.1.4.1.9.9.109.1.1.1.1.3.1 get-type next entry-op gt entry-val 80 poll-interval 1 ratelimit 300 maxrun 180
action 0001 cli command "enable"
action 0002 cli command "term exec prompt timestamp" action 0003 cli command "term length 0"
action 0010 syslog msg "High CPU detected, gathering system information." action 0020 cli command "show clock"
action 0030 regex "([0-9]|[0-9][0-9]):([0-9]|[0-9][0-9]):([0-9]|[0-9][0-9])" $_cli_result match match1
action 0040 string replace "$match" 2 2 "."
action 0050 string replace "$_string_result" 5 5 "." action 0060 set time $_string_result
action 0070 cli command "show proc cpu sort | append flash:tac-cpu-$time.txt" action 0080 cli command "show proc cpu hist | append flash:tac-cpu-$time.txt"
action 0090 cli command "show proc cpu platform sorted | append flash:tac-cpu-$time.txt" action 0100 cli command "show interface | append flash:tac-cpu-$time.txt"
action 0110 cli command "show interface stats | append flash:tac-cpu-$time.txt" action 0120 cli command "show log | append flash:tac-cpu-$time.txt"
action 0130 cli command "show ip traffic | append flash:tac-cpu-$time.txt" action 0140 cli command "show users | append flash:tac-cpu-$time.txt"
action 0150 cli command "show platform software fed switch active punt cause summary | append flash:tac-cpu-$time.txt"
action 0160 cli command "show platform software fed switch active cpu-interface | append flash:tac-cpu-$time.txt"
action 0170 cli command "show platform software fed switch active punt cpuq all | append flash:tac-cpu-$time.txt"
action 0180 cli command "no monitor capture tac_cpu"
action 0190 cli command "monitor capture tac_cpu control-plane in match any file location flash:tac-cpu-$time.pcap"
action 0200 cli command "monitor capture tac_cpu start" pattern "yes" action 0210 cli command "yes"
action 0220 wait 10
action 0230 cli command "monitor capture tac_cpu stop" action 0240 cli command "no monitor capture tac_cpu"
Corresponder dinamicamente uma saída PID e gravar pilha
Este script procura uma mensagem de syslog de que a fila de entrada SNMP está cheia e
executa estas ações:
registra a saída de show proc cpu sort para um arquivo
●
extrai o PID do processo SNMP ENGINE via regex
●
usa o SNMP PID em comandos subsequentes para obter os dados da pilha para o PID
●
remove o script da configuração para que não ocorram mais execuções dele
●
event manager applet TAC-SNMP-INPUT-QUEUE-FULL authorization bypass event syslog pattern "INPUT_QFULL_ERR" ratelimit 40 maxrun 120 action 0010 cli command "en"
action 0020 cli command "show proc cpu sort | append flash:TAC-SNMP.txt" action 0030 cli command "show proc cpu | i SNMP ENGINE"
action 0040 regexp "^[ ]*([0-9]+) .*" $_cli_result match match1 action 0050 syslog msg "Found SNMP Engine PID $match1"
action 0060 cli command "show stacks $match1 | append flash:TAC-SNMP.txt" action 0070 syslog msg "$_cli_result"
action 0080 cli command "configure terminal"
action 0090 cli command "no event manager applet TAC-SNMP-INPUT-QUEUE-FULL" action 0100 cli command "end"
Atualizar um Switch
Este script é configurado para correspondência padrão no prompt não padrão retornado pelo
comando install add file <file> ativate commit e responda aos prompts. Nenhum evento de disparo
está configurado, portanto, o script EEM deve ser acionado manualmente por um usuário quando
a atualização precisa ocorrer por meio de UPGRADE de execução do gerenciador de eventos. O
temporizador de execução máxima é definido para 300 segundos em vez do valor padrão de 20
segundos, pois o comando install add leva um tempo significativo para ser executado.
Implementação
event manager applet UPGRADE authorization bypass event none maxrun 300
action 0001 cli command "enable"
action 0002 cli command "term length 0" action 0020 cli command "install add file
flash:cat9k_iosxe.16.06.02.SPA.bin activate commit" pattern "y\/n" action 0030 cli command "y" pattern "y\/n" action 0040 syslog msg "Reloading device to upgrade code" action 0050 cli command "y"
Descarregar dados de diagnóstico para um arquivo quando um objeto rastreado por
SLA de IP é desativado
Este script é acionado quando o objeto SLA IP 11 é desativado e executa estas ações:
Coletar tabela MAC, tabela ARP, syslogs e tabela de roteamento
●
Escrever informações em um arquivo na flash: chamado sla_track.txt
●
Implementação
ip sla 10 icmp-echo 10.10.10.10 source-ip 20.20.20.20 frequency 10 exitip sla schedule 10 life forever start-time now track 11 ip sla 10 reachability
exit
event manager applet track-10 authorization bypass event track 11 state down
action 0001 cli command "enable"
action 0002 cli command "term exec prompt timestamp"
action 0003 cli command "term length 0" action 0010 syslog msg "IP SLA object 10 has gone down" action 0020 cli command "show mac address-table detail | append flash:sla_track.txt" action 0030 cli command "show ip arp | append flash:sla_track.txt" action 0040 cli command "show log | append flash:sla_track.txt" action 0050 cli command "show ip route | append flash:sla_track.txt"
Enviar um e-mail do EEM
Este script é acionado quando o padrão descrito na instrução de padrão syslog de evento é visto
e executa estas ações:
envia um e-mail de um servidor de e-mail interno (isso pressupõe que o servidor de e-mail
interno permita autenticação aberta do dispositivo).
●
Implementação
event manager environment email_from [email protected] event manager environment email_server 192.168.1.1
event manager environment email_to [email protected] event manager applet email_syslog
event syslog pattern "SYSLOG PATTERN HERE” maxrun 60 action 0010 info type routername
action 0020 mail server "$email_server" to "$email_to" from "$email_from" subject "SUBJECT OF EMAIL - Syslog seen on $_info_routername" body “BODY OF YOUR EMAIL GOES HERE”
Desligar uma porta em uma programação
Este script desliga a porta Te2/1/15 todos os dias às 18h.
Implementação
event manager applet shut_port authorization bypass event timer cron cron-entry "0 18 * * *"
action 0001 cli command "enable"
action 0002 cli command "term exec prompt timestamp"
action 0003 cli command "term length 0" action 0010 syslog msg "shutting port Te2/1/15 down" action 0030 cli command "config t" action 0040 cli command "int Te2/1/15" action 0050 cli command "shutdown" action 0060 cli command "end"
Desligar uma interface se uma determinada taxa de pacotes por segundo (PPS) for
alcançada
Este script verifica a taxa de PPS na interface Te2/1/9 na direção TX a cada segundo. Se a taxa
de PPS exceder 100, ele executará estas ações:
registra a saída show int da interface para syslog
●
desliga a interface
●
Implementação
event manager applet disable_link authorization bypass
event interface name te2/1/9 parameter transmit_rate_pps entry-op ge entry-val 100 poll-interval 1 entry-type value
action 0001 cli command "enable"
action 0002 cli command "term length 0" action 0010 syslog msg "Detecting high input rate on interface te2/1/9. Shutting interface down." action 0020 cli command "show int te2/1/9" action 0030 syslog msg $_cli_result action 0040 cli command "config t" action 0050 cli command "int te2/1/9" action 0060 cli command "shutdown" action 0070 cli command "end"