30 de abr. de 2018

Curso de Python para Engenheiros de Redes


Foram-se os tempos em que um engenheiro de redes somente precisava conhecer o sistema operacional dos equipamentos de networking, seja ele Cisco IOS, JunOS, etc. Com a chegada das novas tendências de mercado, chegou o paradigma de DevOps, no qual os mundos de Desenvolvimento e Operações se fundiram a fim de obter uma melhor comunicação, colaboração e coesão entre estas áreas.

Descrição:

Segundo https://newrelic.com/devops/what-is- devops “Em vez de ter duas áreas diferentes, trabalhando digamos que de forma independente
uma da outra executando tarefas específicas; a metodologia DevOps reconhece uma interdependência de ambas as áreas. Dessa forma DevOps ajuda a desenvolver um software com maior agilidade, mantendo o serviço estavél, e ganhando a velocidade necessária para uma maior inovação.”

Um dos itens no paradigma de DevOps é o chamado “Infraestructure as Code IAC”, no qual um tem a capacidade de administrar e configurar toda uma infraestrutura de TI via código, em vez de ser um processo manual. O IAC se aplica ao mundo do Networking, onde temos por exemplo o conceito de SDN, no qual a camada de controle é desacoplada da camada de fordwarding. Dessa forma o controle é feito no chamado SDN Controller, e é ele que se encarrega de configurar as caixas de fordwarding, switches. Dessa forma toda à programação da sua rede você faz no SDN controller. Sendo assim, se faz necessário o aprendizado de alguma linguagem de programação afim de poder estar atualizados com as novas necessidades.

Porque python?

Não existe uma regra na linguagem de programação a ser utilizada no IAC, mas sendo python uma linguagem de fácil aprendizado, gratuito, com muitas livrarias, e com uma comunidade de desenvolvimento da linguagem sempre ativa; digamos que é a linguagem perfeita para nosso propósito, que é o de programar a nossa rede.


Metodologia E-Doing (Aprenda Fazendo):

Os alunos irão construindo exemplos práticos de Scripts em Sala de Aula para automatizar tarefas nos Ambientes Cisco, Juniper e Arista

Público-Alvo: Profissionais de TI que desejam dominar os fundamentos da Programação em Python voltada para a Carreira de Routing & Switching.

Local:

Rua Marquês de Itu, 408 - Conjunto 24
Vila Buarque - São Paulo - SP (Próximo a Estação República do Metrô)


Obs: Os alunos poderão optar por participar de forma presencial (apenas 10 vagas) ou remotamente, em Tempo Real, deste curso via Plataforma Wiziq (limitado a 50 vagas)


Conteúdo Programático:

1. Linux para Sobrevivientes.
- Tipos de Usuários.
- Navegando nos diretórios Linux.
- Aprendendo a lidar com arquivos, permissões de arquivos.
- Aprendendo a lidar com processos.
- Instalação de pacotes em Ubuntu.
- Ferramentas de networking, ping trace, netstat, ifconfig etc

2. Python
- Porque Python?
- Qual versão de python utilizar?
- Linux ou Windows?
- Paradigmas da programação
- O interpretador de python, variáveis e estrutura de dados.
- Python em modo scripting, Indentação.
- Sentenças de Programação
+"if"
+"for"
+"while"
+"break"
- Funções.
- Tratamento de Exceções.
- Utilizando módulos, instalando módulos com "pip".
- Operações em Arquivos, sentença with.
- operações em Banco de Dados, exemplo MySql.

3. Aprendendo a Utilizar PARAMIKO.

4. APIs,REST,JSON,YAML e JINJA2. Exemplo utilizando Arista eAPI.

5. NetMiko, coleta de informação e modificação de configurações. Lab com Cisco IOS e IOS-XR.

6. NAPALM, coleta de informação e modificação de configurações. Lab Com Cisco IOS e JunOS.

Periodo:

Turma no período Noturno: De 04/06/2018 até 08/06/2018 e de 11/06/2018 até 15/06/2018 - das 19:00 as 23:00 horas

Carga Horária: 40 horas

Investimento:

R$ 1.190,00 - Podendo ser parcelado em até 12X via PagSeguro


Mini-Curriculum do Instrutor:

José Balbuena - CCIE R&S #35681 - profissional com muitos anos de experiência na área de Redes de Computadores e que nos últimos anos tem trabalhado como sysadmin com diversas tecnologias emergentes, especialmente Big Data, Virtualização e DevOps.

Está longe de SP ? Acompanhe o curso remotamente em Tempo Real!!!

Garanta já a sua vaga comprando este curso pelo botão abaixo:









Dúvidas ? Envie- e-mail para adilson.aflorentino@eamsoft.com.br

NAPALM - Parte II

Olá Pessoal Boa Tarde, hoje vamos continuar com o nosso segundo post sobre NAPALM. Dessa vez vamos utilizar o NAPALM, para alterar configurações em nossos dispositivos de redes.

O nosso LAB vai ser o mesmo do post anterior:


O Roteador R1, é um Cisco IOS, e  R2 um JunOS. Para o NAPALM trabalhar corretamente em Cisco IOS, precisamos que o dispositivo tenha um lugar onde sejam armazenados os arquivos de configuração. Para o caso de Cisco IOS vamos utilizar a funcionalidade de "archive" e vou adicionar um disco "PCMCIA disk0:" no meu roteador 7200 emulado via GNS3. Podem também ser utilizados o "flash:", "bootflasg:" p.e

R1#sh disk0:
Unformatted Partition, please format it.
R1#format disk0:
Format operation may take a while. Continue? [confirm]
Format operation will destroy all data in "disk0:".  Continue? [confirm]

Primary Partition created...Size 10 MB

Drive communication & 1st Sector Write OK...
Writing Monlib sectors....
Monlib write complete 

Format: All system sectors written. OK...

Format: Total sectors in formatted partition: 20448
Format: Total bytes in formatted partition: 10469376
Format: Operation completed successfully.

Format of disk0: complete
R1#sh disk0:    
No files on device

8380416 bytes available (1794048 bytes used)

R1#conf t
R1(config)#archive 
R1(config-archive)#path disk0:
R1(config)#ip scp server enable 

Além disso precisamos ter um usuário com privilege=15, para poder copiar os arquivos via SCP.

username napalm privilege 15 password 0 napalm

No caso de JunOS a única configuração necessária é ter habilitado os serviços SSH, NETCONF-SSH e ter um usuário da classe "super-user".

set system host-name R2
set system login user napalm class super-user
set system login user napalm authentication plain-text napalm
set system services ssh
set system services netconf ssh
set system domain-name R2.com

As configurações completas encontran-se em :

https://github.com/JoseBalbuena/BlogNetFinders

Alterando Configurações:

Imaginemos que nós é solicitado configurar o SNMP de ambos os roteadores de forma que eles enviem seus traps para o servidor de gerenciamento NMS com ip 3.3.3.3.

O primeiro passo é criar os arquivos de configuração. Vou criar "R1_snmp.conf" e "R2_snmp.conf"

R1:
jose@rejane:~/Automatizacao$ more R1_snmp.conf 
snmp-server community NAPALM RO
snmp-server host 3.3.3.3 version 2c NAPALM 
snmp-server enable traps
jose@rejane:~/Automatizacao$

R2:
jose@rejane:~/Automatizacao$ more R2_snmp.conf 
set snmp description "R2 - SNMP Configurado via NAPALM"
set snmp community NAPALM
set snmp trap-group NAPALM targets 3.3.3.3
jose@rejane:~/Automatizacao$ 


Vamos mostrar o que NAPALM faz por trâs dos panos para o caso de Cisco IOS. Para isso vamos iniciar o python em modo interativo e abrir uma sessão em R1:

jose@rejane:~/Automatizacao$ python
Python 2.7.6 (default, Oct 26 2016, 20:30:19) 
[GCC 4.8.4] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import napalm
>>> driver = napalm.get_network_driver('ios')
>>> device = driver('1.1.1.1','napalm','napalm',optional_args={'secret':'cisco'})
>>> device.open()
>>> device.load_merge_candidate(filename='R1_snmp.conf')


O método utilizado é o load_merge_candidate(), o método load_merge_candidate irá juntar a configuração atual com a nossa nova configuração.

Quando enviamos o load_merge_candidate(), em R1 foi criado um arquivo chamado merge_config.txt

R1#sh disk0: 
-#- --length-- -----date/time------ path
1          101 Apr 30 2018 14:18:22 +00:00 merge_config.txt

8376320 bytes available (1798144 bytes used)

R1#


Até agora somente temos feito um upload do arquivo de configuração. Vamos colocar ele em operaçao:

>>> device.commit_config()

Em R1 vamos ver que apareceu um arquivo chamado rollback_config.txt

R1#sh disk0: 
-#- --length-- -----date/time------ path
1          101 Apr 30 2018 14:18:22 +00:00 merge_config.txt
2         1344 Apr 30 2018 14:22:14 +00:00 rollback_config.txt

8372224 bytes available (1802240 bytes used)

R1#


Verificando R1, podemos apreciar que a nova configuração foi aplicada:

R1#sh run | inc snmp
snmp-server community NAPALM RO
snmp-server enable traps snmp authentication linkdown linkup coldstart warmstart
snmp-server enable traps vrrp
snmp-server enable traps flowmon
.....
.....
snmp-server enable traps vrfmib vrf-up vrf-down vnet-trunk-up vnet-trunk-down
snmp-server host 3.3.3.3 version 2c NAPALM 
R1#

Agora se quisernos fazer rollback, voltar a configuração anterior:

>>> device.rollback()
>>> 

E R1 voltará a configuração anterior:

R1#sh run | inc snmp
R1#

Em R2 podemos fazer a mesma coisa, lembrando que NAPALM utiliza para JunOS o driver pyEZ que se comunica com os roteadores via protocolo NETCONF. 

>>> driver = napalm.get_network_driver('junos')
>>> device = driver('2.2.2.2','napalm','napalm123')
>>> device.open()
>>> device.load_merge_candidate(filename='R2_snmp.conf')
>>> 
>>> device.commit_config()
>>>

Em R2:

....
....
snmp {
    description "R2 - SNMP Configurado via NAPALM";
    community NAPALM;
    trap-group NAPALM {
        targets {
            3.3.3.3;
        }
    }
}
....
....


O nosso script final ficaria(esse é um script básico, da para melhorar colocando alguns prints para saber o que ele esta fazendo, algum arquivo de logging etc) :

jose@rejane:~/Automatizacao$ more napalm_alterconf_ex2.py 
#!/usr/bin/python

import napalm

#Router diccionario
R1={'so':'ios','hostname':'R1','ip':'1.1.1.1','username':'napalm','password':'napalm','secret':'cisco','alterfile':'/home/jose/Automatizacao/R1_snmp.c
onf'}
R2={'so':'junos','hostname':'R2','ip':'2.2.2.2','username':'napalm','password':'napalm123','alterfile':'/home/jose/Automatizacao/R2_snmp.conf'}

#Listado dos meus roteadores
routers=[R1,R2]


#BEGIN


#Loop para fazer varredura
for router in routers:
 #Caso seja um roteador IOS, utilizar o parametro optional_args com a senha de enable
 if router['so'] == 'ios':
  optional_args={'secret':router['secret']}
 else:
  optional_args={}
 #Selecctiona o driver
 driver = napalm.get_network_driver(router['so'])
 #Coneta ao roteador, dentro de um try..execpt, caso de algum erro o erro eh printado
 try:
  device = driver (hostname=router['ip'], username=router['username'], password=router['password'],optional_args=optional_args)
  device.open()
  #Carrega o arquivo das atualizacoes a serem feitas
  device.load_merge_candidate(filename=router['alterfile'])
  #Fecha a conexao
  device.close()
 except Exception as error:
  print "Problemas com driver/sessao do roteador %s" % router['ip']
  print error

#FIM

Executando o script não recebemos nenhum erro:

jose@rejane:~/Automatizacao$ ./napalm_alterconf_ex2.py 
jose@rejane:~/Automatizacao$ 

E verificando R1 e R2, as configurações foram aplicadas com sucesso:

R1#sh run | inc snmp
snmp-server community NAPALM RO
snmp-server enable traps snmp authentication linkdown linkup coldstart warmstart
snmp-server enable traps vrrp
snmp-server enable traps flowmon
.....
.....
snmp-server enable traps vrfmib vrf-up vrf-down vnet-trunk-up vnet-trunk-down
snmp-server host 3.3.3.3 version 2c NAPALM 
R1#



....
....
snmp {
    description "R2 - SNMP Configurado via NAPALM";
    community NAPALM;
    trap-group NAPALM {
        targets {
            3.3.3.3;
        }
    }
}
....
....


Por hoje é isso pessoal...semana que vem vamos utilizar NAPALM, para carregar toda uma configuração nova em nosos dispositivos.

Abçs e Bom Feriado
Jose

22 de abr. de 2018

Oficina de MPLS e VPN L3 - Lab 100% Hands-On


Curso voltado a criação de Redes MPLS e VPN L3 em Roteadores Cisco - Assista de Forma Remota ou Presencial!!!

Descrição:

O MPLS (Multiprotocol Label Switching) é uma técnica de Comutação baseada em LAbels muito utilizada no Ambiente de Service Providers. Este curso se propõe a realizar, de forma prática, a configuração e o Troubleshooting de Redes MPLS em Ambiente Cisco de forma 100% prática através de um Estudo de Caso.

Metodologia E-Doing (Aprenda Fazendo):

Os alunos irão construir um cenário a partir do zero, levantando todas as configurações, de modo a ter um exemplo de um Core MPLS, com roteadores PE e P, interligados a Roteadores de Cliente (CE) configurando todos os protocolos necessários para tornar a Rede estável e segura.

Público-Alvo: Profissionais de TI que desejam dominar os fundamentos de MPLS para prestar Exames Cisco da Carreira de Routing & Switching e Service Provider ou para melhorar suas capacidades de configuração e troubleshooting em Roteadores Cisco de forma a melhor atuar no Mundo Corporativo.

Local:

Rua Marquês de Itu, 408 - Conjunto 24
Vila Buarque - São Paulo - SP (Próximo a Estação República do Metrô)
Obs: Os alunos poderão optar por participar de forma presencial (apenas 10 vagas) ou remotamente, em Tempo Real, desta Oficina via Plataforma Wiziq (limitado a 50 vagas)


Conteúdo Programático:

Dia 01
Fundamentos de MPLS:
- Arquitetura IP MPLS
- Surgimento da tecnologia
- Roteamento convencional X baseado em rótulos
- O cabeçalho MPLS
- Estrutura MPLS
- Componentes da arquitetura
- Funcionamento
- vantagens e desvantagens do MPLS

Implementação pura de MPLS no backbone IP:
- Topologia de teste utilizada
- Configurações IP da topologia de teste
- endereços nas interfaces
- protocolo de roteamento interno
- testes de conectividade
- Configurações de MPLS na topologia de teste
- testes de conectividade relativos ao MPLS

MPLS e VPN de camada 3
- VPN's - Conceito
- Tipos de VPN
- Arquitetura IP VPN MPLS
- Configurações relativas a criação das VPN's
- BGP e MPBGP
- Testes de conectividade das VPN's criadas
- Configurando VRFs para servir o lado cliente
- Integração com protocolos de roteamento OSPF, IS-IS
- Uso de rotas estáticas


Dia 02
QOS com MPLS:
- Conceitos de QoS
- Modelo de Serviços Integrados
- Modelo de Serviços Diferenciados
- Como prover Eficiência no Link
- Uso de DSCP com labels MPLS

Engenharia de tráfego com MPLS
- Conceitos fundamentais
- A engenharia de tráfego sobre MPLS
- Extensões do OSPF para engenharia de tráfego
- Extensões do IS IS para engenharia de tráfego
- Protocolo RSVP TE
- Operação do MPLS TE
- Atributos de túneis MPLS TE
- Proteção e restauração FRR GMPLS

Pseudowire:
- AToM - Any Transport over MPLS
- Ethernet
- Frame Relay
- ATM—AAL5, cell mode
- PPP
- Cisco HDLC

IPV6 sobre MPLS:
- O protocolo IPv6
- Endereçamento IPv6
- Técnica 6PE
- Técnica 6VPE

Diferenciais:

Uso do Emulador EVE (Emulated Virtual Environment) que permite a criação de cenários Multivendor com soluções de dezenas de fabricantes. Os alunos poderão baixar e criar seu próprio servidor local, de modo a utiliza-lo para testes e homologação de cenários de Redes Reais.
120 dias de acesso a Plataforma NetFindersBrasil, onde o aluno poderá interagir via Fóruns de Aula para sanar suas dúvidas após a realização do Treinamento

Periodo:

Dias 12/05/2018 e 19/05/2018 - das 09:00 as 18:00 - com intervalo de 01 hora para almoço e coffee-breaks nos períodos da manhã e tarde

Carga Horária: 16 horas

Investimento:

R$ 590,00 - Podendo ser parcelado em até 12X via PagSeguro

Mini-Curriculum do Instrutor:
·Adilson Aparecido Florentino é Tecnólogo em Processamento de Dados pela Universidade Mackenzie e Especialista em Redes de Computadores pela FASP - Faculades Associadas de São Paulo. Atua como Instrutor Cisco desde 2001, primeiro no Programa Cisco Network Academy e atualmente como Instrutor Cisco CCSI # 33706.Possui as Certificações CCNA RS, CCNA Voice, CCNA Security, CCNA Wireless, CCDA, CCDP e CCNP RS.
·Fundador e CEO da EAMSOFT Consultoria e Treinamento em Informática Ltda. Atuou como Professor Universitário em diversas Instituições de Ensino tais como FATEC, IFSP, UNICID, FIAP e IBTA. Prestador de SErviços para o NIC.br nos cursos de IPv6 e Boas Práticas em BGP
·Autor do Livro IPv6 na Prática - primeiro livro em português sobre o tema. Consultor independente atuando em várias empresas em Projetos de Rede e treinamento utilizando roteadores Cisco, Juniper e Mikrotik

Está longe de SP ? Acompanhe o curso remotamente em Tempo Real!!! Garanta já a sua vaga comprando esta Oficina Hand-On pelo botão abaixo:








Maiores Informações, envie e-mail para adilson.aflorentino@eamsoft.com.br




NAPALM - Parte 1



Como já sabemos utilizar o Netmiko, hoje vou lhes apresentar uma ferramenta chamada de NAPALM (Network Automation and Programmability Abstraction Layer with Multivendor support).

NAPALM nasceu como o objetivo de ser uma livraria única de comunicação com dispositivos de diferentes sistemas operacionais e diferentes fabricantes, IOS, IOS-XR, NX-OS, JunOS etc.

NAPALM é um 'wrapper' em linguagem de programação, é dizer é uma função que chama a outra função, no caso de NAPALM ele chama as livrarias de conexão como Netmiko para IOS, pyeapi para EOS etc. Segue o link onde mostra quais livrarias o NAPALM utiliza:

https://napalm.readthedocs.io/en/latest/support/index.html

NAPALM, executa operações em arquivos dentro dos dispositivos, com o objetivo de mudar configuração, adicionar alguma configuração nova a uma já existente, ou simplesmente executar operações de comparação entre configurações. NAPALM também tem algumas operações de coleta de informação, via funções "get". O listado completo das funções get também encontra-se no link anterior.

Instalando NAPALM

Para instalar o NAPALM basta enviar o comando:

jose@rejane:~$ sudo pip install napalm


Utilizando o NAPALM

Para utilizar o NAPALM via python, precisamos chamar a livraria via comando import:

import napalm

Com a livraria carregada, precisamos escolher qual driver utilizar, isso depende do dispositivo com o qual queremos trabalhar:

driver = napalm.get_network_driver('Nome_do_driver')

Por exemplo se desejamos nós conetar a um dispositivo EOS, colocamos:

driver = napalm.get_network_driver('eos')

Uma vez escolhido o driver, precisamos utilizar o mesmo para abrir uma conexão ao dispositivo, lembrando que o metodo de transporte utilizado depende do driver a ser utilizado p.e para Cisco IOS o transporte é via SSH, para NXOS é via NX-OS API ou seja HTTP/HTTPS e por ai vai.

device = driver(hostname, username, password, timeout=60, optional_args=None)

Exemplo:

device = driver (hostname='1.1.1.1', username='cisco', password='cisco', timeout=60,optional_args={'secret': cisco}


Depois é somente abrir a conexão e começar a trabalhar :) 

device.open()

Exemplo

Nesse post vamos utilizar NAPALM para coletar informação dos nossos dispositivos.

Eu vou utilizar a seguinte topologia:



Dessa vez vou utilizar um roteador Cisco IOS, R1 e um JunOS R2. Ambos rodam OSPF, tem SSH configurado e o acesso a eles é via interfaces de Loopback:

R1: Lo0 1.1.1.1
R2: Lo0 2.2.2.2

Eu vou utilizar NAPALM com o próposito de coletar informação sobre os roteadores.

Carregando a livraria NAPALM no meu script python:

#!/usr/bin/python

import napalm

Criando um diccionário para cada roteador, e logo uma lista com ambos os roteadores:

R1={'so':'ios','hostname':'R1','ip':'1.1.1.1','username':'napalm','password':'napalm','secret':'cisco'}
R2={'so':'junos','hostname':'R2','ip':'2.2.2.2','username':'napalm','password':'napalm123'}

routers=[R1,R2]

Agora preciso fazer um loop para varrer todos os roteadores da minha lista. Existe um detalhe os roteadores Cisco IOS foram configurados com uma senha de enable, então preciso ter isso em consideração:

for router in routers:
 if router['so'] == 'ios':
  optional_args={'secret':router['secret']}
 else:
  optional_args={}


O código acima diz: "faz uma varredura para todos os meus roteadores na lista routers, caso sejam IOS coloca como argumento adicional a senha de enable

Dentro do loop, eu vou abrir  a conexão remota ao roteador e executar o método get_facts(). Tudo isso dentro de um "try...except" caso de algum problema na conexão para algum dos roteadores.

 driver = napalm.get_network_driver(router['so'])
 try:
  device = driver (hostname=router['ip'], username=router['username'], password=router['password'],optional_args=optional_args)
  device.open()
  router_facts = device.get_facts()
  print router_facts
  device.close()
 except Exception as error:
  print "Problemas com driver/sessao do roteador %s" % router['ip']
  print error 

O código completo ficaria:

#!/usr/bin/python

import napalm

#Router diccionario
R1={'so':'ios','hostname':'R1','ip':'1.1.1.1','username':'napalm','password':'napalm','secret':'cisco'}
R2={'so':'junos','hostname':'R2','ip':'2.2.2.2','username':'napalm','password':'napalm123'}

#Listado dos meus roteadores
routers=[R1,R2]


#BEGIN
#Loop para fazer varredura
for router in routers:
 #Caso seja um roteador IOS, utilizar o parametro optional_args com a senha de enable
 if router['so'] == 'ios':
  optional_args={'secret':router['secret']}
 else:
  optional_args={}
 #Selecctiona o driver
 driver = napalm.get_network_driver(router['so'])
 #Coneta ao roteador, dentro de um try..execpt, caso de algum erro o erro eh printado
 try:
  device = driver (hostname=router['ip'], username=router['username'], password=router['password'],optional_args=optional_args)
  device.open()
  #Executa o metodo get_facts
  router_facts = device.get_facts()
  #Imprime o resultado do get_facts, o resultado eh uma variavel do tipo diccionario
  print ("---------------- %s ---------------------" % router['hostname'])
  print router_facts
  #Fecha a conexao
  device.close()
 except Exception as error:
  print "Problemas com driver/sessao do roteador %s" % router['ip']
  print error

#FIM

Ao executar o script, obtenho como resultado:

jose@rejane:~/Automatizacao$ ./napalm_ex1.py 
---------------- R1 ---------------------
{u'os_version': u'7200 Software (C7200-ADVENTERPRISEK9-M), Version 15.2(4)M9, RELEASE SOFTWARE (fc2)', u'uptime': 14040, u'interface_list': [u'FastEthernet0/0', u'FastEthernet1/0', u'Loopback0'], u'vendor': u'Cisco', u'serial_number': u'4279256517', u'model': u'7206VXR', u'hostname': u'R1', u'fqdn': u'R1.R1.com'}
---------------- R2 ---------------------
{u'os_version': u'12.1R1.9', u'uptime': 21092, u'interface_list': ['.local.', 'cbp0', 'demux0', 'dsc', 'em0', 'em1', 'gre', 'ipip', 'irb', 'lo0', 'lsi', 'mtun', 'pimd', 'pime', 'pip0', 'pp0', 'tap'], u'vendor': u'Juniper', u'serial_number': u'None', u'model': u'OLIVE', u'hostname': u'JunOS-R2', u'fqdn': u'JunOS-R2.R2.com'}
jose@rejane:~/Automatizacao$ 


Bom Pessoal por hoje é isso, de momento temos utilizado o NAPALM somente para coletar informação. O próximo post vamos utilizar ele para operações de configuração.

Abcs e Obrigado!!
Jose

16 de abr. de 2018

Fazendo Backup de Routers Cisco IOS utilizando Netmiko

Olá Pessoal Boa Tarde, depois de um tempo sumido por problemas diversos vamos continuar com nossos posts de automatização.

O dia de hoje vou criar um script em python que se coneta a vários roteadores Cisco IOS executa o comando "sh run", e armazena o resultado em um diretório de backups.


A Topologia que vou utilizar é a seguinte:



O roteador IOU1, IOU2 e IOU4 rodam OSPF entre eles.  Eu tenho conetividade SSH a eles via interfaces de Loopback:

IOU1: 1.1.1.1
IOU2: 2.2.2.2
IOU4: 4.4.4.4

Todos eles tem configurado um usuário e senha padrão cisco/cisco e um enable também de cisco.

A configuração dos roteadores não é importante para esse post. O que é do nosso interesse é como armazenar a saída do comando "sh run" em um arquivo de texto.

O primeiro passo é definir os roteadores, cada roteador tem uma ip, usuário, senha, nome de host etc. Para isso vamos utilizar um dicciónario por cada roteador:

cisco_iou1={'device_type':'cisco_ios','ip':'1.1.1.1','username':'cisco','password':'cisco','secret':'cisco','timeout':10}
cisco_iou2={'device_type':'cisco_ios','ip':'2.2.2.2','username':'cisco','password':'cisco','secret':'cisco','timeout':10}
cisco_iou3={'device_type':'cisco_ios','ip':'3.3.3.3','username':'cisco','password':'cisco','secret':'cisco','timeout':10}
cisco_iou4={'device_type':'cisco_ios','ip':'4.4.4.4','username':'cisco','password':'cisco','secret':'cisco','timeout':10}

Vocês podem ver que eu adicionei um roteador a mais o IOU3, no decorrer do post vocês iram ver o porque de eu fazer isso.

Logo eu vou definir uma lista contendo cada um dos roteadores:

cisco_routers=[cisco_iou1,cisco_iou2,cisco_iou3,cisco_iou4]


Agora que temos definido quais elementos queremos coletar informação, o seguinte passo é fazer uma varredura em todos esses elementos, para isso utilizamos um laço "for".

for cisco_router in cisco_routers:
 net_connect=ConnectHandler(**cisco_router)
 net_connect.enable()
 output=net_connect.send_command('sh run')
 print output
 net_connect.exit_enable_mode()
 net_connect.disconnect()

O código acima pode ser explicado como: "para cada roteador, abre uma sessão SSH, troca para o modo enable,executa o comando "sh run", printa na tela o resultado ...logo sai do enable, e fecha a conexão"....Simples verdad!!..

O script completo ficaria:

#!/usr/bin/python


from netmiko import ConnectHandler

cisco_iou1={'device_type':'cisco_ios','ip':'1.1.1.1','username':'cisco','password':'cisco','secret':'cisco','timeout':10}
cisco_iou2={'device_type':'cisco_ios','ip':'2.2.2.2','username':'cisco','password':'cisco','secret':'cisco','timeout':10}
cisco_iou3={'device_type':'cisco_ios','ip':'3.3.3.3','username':'cisco','password':'cisco','secret':'cisco','timeout':10}
cisco_iou4={'device_type':'cisco_ios','ip':'4.4.4.4','username':'cisco','password':'cisco','secret':'cisco','timeout':10}


cisco_routers=[cisco_iou1,cisco_iou2,cisco_iou3,cisco_iou4]

for cisco_router in cisco_routers:
 net_connect=ConnectHandler(**cisco_router)
 net_connect.enable()
 output=net_connect.send_command('sh run')
 print output
 net_connect.exit_enable_mode()
 net_connect.disconnect()

Vamos rodar ele e ver o que acontece:

jose@rejane:~/Automatizacao$ ./backup.py 
Building configuration...

Current configuration : 2199 bytes
!
! Last configuration change at 11:44:14 -03 Mon Apr 16 2018
version 15.2
service timestamps debug datetime msec
service timestamps log datetime msec
no service password-encryption
!
hostname IOU1
......
......
line vty 0 4
 login local
 transport input ssh
!
!
end

Traceback (most recent call last):
  File "./backup.py", line 15, in <module>
    net_connect=ConnectHandler(**cisco_router)
  File "/usr/local/lib/python2.7/dist-packages/netmiko/ssh_dispatcher.py", line 173, in ConnectHandler
    return ConnectionClass(*args, **kwargs)
  File "/usr/local/lib/python2.7/dist-packages/netmiko/base_connection.py", line 187, in __init__
    self.establish_connection()
  File "/usr/local/lib/python2.7/dist-packages/netmiko/base_connection.py", line 654, in establish_connection
    raise NetMikoTimeoutException(msg)
netmiko.ssh_exception.NetMikoTimeoutException: Connection to device timed-out: cisco_ios 3.3.3.3:22
jose@rejane:~/Automatizacao$ 

Hummm...o script começou a rodar, ele printou o "sh run" do IOU1, IOU2 e parou em IOU3, o qual esta certo, visto que IOU3 não existe, mas nós queriamos o print de IOU4 que sabemos é um roteador ativo...o que fazer???.........Lembram da sentença "try...except"... ela é uma sentença que tenta fazer alguma coisa e se der erro executa um código de exceção e depois continua com o código normal...

Vamos modificar o nosso código para uma nova versão "backupv2.py", dessa vez com a sentença "try..except":

Script backupv2.py

#!/usr/bin/python


from netmiko import ConnectHandler

cisco_iou1={'device_type':'cisco_ios','ip':'1.1.1.1','username':'cisco','password':'cisco','secret':'cisco','timeout':10}
cisco_iou2={'device_type':'cisco_ios','ip':'2.2.2.2','username':'cisco','password':'cisco','secret':'cisco','timeout':10}
cisco_iou3={'device_type':'cisco_ios','ip':'3.3.3.3','username':'cisco','password':'cisco','secret':'cisco','timeout':10}
cisco_iou4={'device_type':'cisco_ios','ip':'4.4.4.4','username':'cisco','password':'cisco','secret':'cisco','timeout':10}


cisco_routers=[cisco_iou1,cisco_iou2,cisco_iou3,cisco_iou4]

for cisco_router in cisco_routers:
 try:
  net_connect=ConnectHandler(**cisco_router)
  net_connect.enable()
  output=net_connect.send_command('sh run')
  print output
  net_connect.exit_enable_mode()
  net_connect.disconnect()
 except:
  print("Erro de conexao ao roteador %s" % cisco_router['ip'])

Executando o mesmo temos:

jose@rejane:~/Automatizacao$ ./backupv2.py 
Building configuration...

Current configuration : 2199 bytes
!
! Last configuration change at 11:44:14 -03 Mon Apr 16 2018
version 15.2
service timestamps debug datetime msec
service timestamps log datetime msec
no service password-encryption
!
hostname IOU1
!
.....
.....
Erro de conexao ao roteador 3.3.3.3
Building configuration...
....
.....

Beleza!..agora nosso script funciona, e quando da algum erro em algum elemento, o script printa uma mensagem de erro.

Agora que o "core" do nosso script funciona, precisamos lhe adicionar algumas coisas, como por exemplo um arquivo log, de forma a que tudo o que seja feito por nosso script seja armazenado logeado, dessa forma é possivél detetar e corrigir falhas. Também precisamos que os "sh run" dos roteadores sejam armazenados em arquivos e não somente que sejam printados na tela.

Primeiro vou criar dois diretorios no home da minha máquina Linux:

mkdir /home/jose/backupciscorouters
mkdir /home/jose/backupciscorouters/logs

No primeiro diretório seram armazenados os "sh run", e no segundo o arquivo log, um arquivo log por dia.

O arquivos de "sh run", assim como o arquivo log precisam ter uma extensão que nos diga a data que foram criados. Para isso vamos utilizar as funções dos módulos "time" e "datetime". Para a criação do arquivo log, utilizamos o módulo "logging".

O script completo fico assim:

#!/usr/bin/python

from netmiko import ConnectHandler
import time
import datetime
import logging

#Diretorio de Backup
BackupDir='/home/jose/backupciscorouters'
#Data que sera concatenada no nome do arquivo log: backup.YYYYMMDD.log , um arquivo log por dia
LogData=datetime.datetime.now().strftime("%Y%m%d")
Log = BackupDir + "/logs/backup." + LogData + ".log"
#Configuracao basica do logging, o nivel de logging vai ser INFO, caso seja preciso mais informacao podemos colocar DEBUG
logging.basicConfig(filename=Log,
                            filemode='a',
                            format='%(asctime)s,%(msecs)d %(name)s %(levelname)s %(message)s',
                            datefmt='%H:%M:%S',
                            level=logging.INFO)

#Inicio do Script, escrevo no arquivo log
logging.info('Inicio')
logging.info(datetime.datetime.now().strftime("%Y-%m-%d %H%M%S"))

#Definicao dos nossos roteadores
cisco_iou1={'device_type':'cisco_ios','ip':'1.1.1.1','host':'IOU1','username':'cisco','password':'cisco','secret':'cisco','timeout':10}
cisco_iou2={'device_type':'cisco_ios','ip':'2.2.2.2','host':'IOU2','username':'cisco','password':'cisco','secret':'cisco','timeout':10}
cisco_iou3={'device_type':'cisco_ios','ip':'3.3.3.3','host':'IOU3','username':'cisco','password':'cisco','secret':'cisco','timeout':10}
cisco_iou4={'device_type':'cisco_ios','ip':'4.4.4.4','host':'IOU4','username':'cisco','password':'cisco','secret':'cisco','timeout':10}

#Lista com os nossos roteadores
cisco_routers=[cisco_iou1,cisco_iou2,cisco_iou3,cisco_iou4]

#Laco para executar o comando sh run roteador por roteador
for cisco_router in cisco_routers:
 try:
  #Abrindo uma conexao SSH
  net_connect=ConnectHandler(**cisco_router)
  #Trocando para enable
  net_connect.enable()
  #Executando o comando sh run
  output=net_connect.send_command('sh run')
  #Nome do arquivo de backup no formato hostname.YYYY-MM-DD-HH:MM:SS
  BackupNameOfFile=BackupDir + "/" + cisco_router['host'] + "." + datetime.datetime.now().strftime("%Y-%m-%d-%H:%M:%S")
  #Escrevendo no arquivo a saida do comando sh run
  with open(BackupNameOfFile,'w') as fh:
   fh.write(output)
  #Saindo do enable
  net_connect.exit_enable_mode()
  #Fechando a sessao SSH
  net_connect.disconnect()
 except:
  logging.info("Erro de conexao ao roteador %s" % cisco_router['ip'])

#Escrevendo lo log a palavra Fim e colocando a hora que finalizou
logging.info('Fim')
logging.info(datetime.datetime.now().strftime("%Y-%m-%d %H%M%S"))

Ao rodar o mesmo obtemos como resultado:

jose@rejane:~/Automatizacao$ ./backupv3.py 
jose@rejane:~/Automatizacao$ 

Ele nao mostra nada na tela, isso esta ok. Vejamos o diretório de backup:

jose@rejane:~/backupciscorouters$ ls -ltrah
total 40K
drwxr-xr-x 82 jose jose  20K Abr 16 12:27 ..
drwxrwxr-x  2 jose jose 4,0K Abr 16 21:07 logs
-rw-rw-r--  1 jose jose 2,3K Abr 16 21:07 IOU1.2018-04-16-21:07:37
-rw-rw-r--  1 jose jose 2,1K Abr 16 21:07 IOU2.2018-04-16-21:07:42
-rw-rw-r--  1 jose jose 2,1K Abr 16 21:07 IOU4.2018-04-16-21:07:48
drwxrwxr-x  3 jose jose 4,0K Abr 16 21:07 .
jose@rejane:~/backupciscorouters$ 

Show!..os arquivos com o conteúdo do "sh run" foram criados e eles tem a data que foram criados.

E o arquivo log como será que fico?..Vejamos:

jose@rejane:~/backupciscorouters/logs$ ls -ltrah
total 12K
drwxrwxr-x 2 jose jose 4,0K Abr 16 21:07 .
drwxrwxr-x 3 jose jose 4,0K Abr 16 21:07 ..
-rw-rw-r-- 1 jose jose  662 Abr 16 21:07 backup.20180416.log
jose@rejane:~/backupciscorouters/logs$ 

jose@rejane:~/backupciscorouters/logs$ more backup.20180416.log 
21:07:32,282 root INFO Inicio
21:07:32,283 root INFO 2018-04-16 210732
21:07:32,331 paramiko.transport INFO Connected (version 2.0, client Cisco-1.25)
21:07:32,623 paramiko.transport INFO Authentication (password) successful!
21:07:37,800 paramiko.transport INFO Connected (version 2.0, client Cisco-1.25)
21:07:38,75 paramiko.transport INFO Authentication (password) successful!
21:07:43,194 root INFO Erro de conexao ao roteador 3.3.3.3
21:07:43,221 paramiko.transport INFO Connected (version 2.0, client Cisco-1.25)
21:07:43,490 paramiko.transport INFO Authentication (password) successful!
21:07:48,620 root INFO Fim
21:07:48,621 root INFO 2018-04-16 210748
jose@rejane:~/backupciscorouters/logs$ 

O arquivo log ficou OK também. E ele nos informa da falha na conexão ao roteador 3.3.3.3.

Podemos utilizar multiprocess para executar várias sessões SSH em paralelo, ou se por exemplo se minha rede tiver 20 roteadores, posso utilizar 4 scripts cada um rodando para 5 roteadores, e fazer o agendamento na cron do Linux.

Por hoje é isso pessoal, próximos posts vamos continuar com mais automatização e exemplos.

Abcs
Jose

12 de abr. de 2018

Já temos o primeiro ganhador do Prêmio Topologia Premiada - Eli Junior


O Eli Junior foi o primeiro ganhador do Prêmio Topologia Premiada, sua Topologia teve nada menos que 80 Curtidas (e não pára de crescer).

Parabéns Eli, fico muito feliz em saber que vc é assinante aqui do EVE Cloud e criou sua obra-prima aqui em nossos Servidores! rs rs rs

Assim que possivel, entre em contato e escolha qual dos cursos do NetFinderBrasil vc vai querer levar como prêmio.

A Lista está disponível em:

http://netfindersbrasil.blogspot.com.br/p/cursos.html

Pacote NetWork Specialist - 4 Cursos com 50% de Desconto


Precisando qualificar a mão-de-obra de sua empresa? Precisa ensinar desde as 7 Camadas do Modelo OSI até a Configuração de Protocolos como OSPF e BGP? É muita coisa para um curso só, mas o NetFindersBrasil tem a Solução: 4 Cursos com 50% de Desconto, do básico até o avançado, que capacitarão sua equipe a entender o funcionamento das Redes de Computadores e a configurar sua Rede de forma mais eficiente.

Confira os cursos presentes neste pacote:

Introdução a Redes de Computadores - valor unitário: R$ 60,00
Maiores detalhes em: http://netfindersbrasil.blogspot.com.br/2014/01/novo-curso-online-introducao-redes-de.html

CCNA RS 200-125 - valor unitário - R$ 99,00
Maiores detalhes em: http://netfindersbrasil.blogspot.com.br/2018/01/preparatorio-ccna-r-em-modo-gravado.html

CCNP ROUTE 300-101 - valor unitário R$ 99,00
Maiores detalhes em: http://netfindersbrasil.blogspot.com.br/2018/03/ccnp-route-300-101-em-modo-gravado-e.html

BGP - Fundamentos e Estratégias de Implementação - valor unitário: R$ 120,00
Maiores detalhes em: http://netfindersbrasil.blogspot.com.br/2015/08/bgp-em-modo-gravado-agora-com-4-meses.html

Oferta Promocional - 50% de desconto na compra dos 4 cursos (de R$ 378,00 por apenas R$ 189,00 - podendo ser parcelado via PagSeguro)

01 Ano de Acesso nos 4 Cursos Oferecidos - Vc pode optar por oferecer todos os cursos a um único funcionário ou repartir o pacote entre os membros de sua equipe (limitado a 1 vaga por curso de cada pacote adquirido)

Adquira já o Pacote com o valor Promocional (oferta válida até 30/11/2018). Clique no botão abaixo para realizar a Compra:








Maiores Informações: envie e-mail para adilson.aflorentino@eamsoft.com.br