:: Redes de Computadores | Cursos | Certificações | Dicas | Notícias | Tutoriais | Nossas Experiências ::
Acesse via RSS/Feeds: http://netfindersbrasil.blogspot.com/feeds/posts/default
Siga-nos no X: https://x.com/NETFINDERSBR
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
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
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.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
Até agora somente temos feito um upload do arquivo de configuração. Vamos colocar ele em operaçao:
>>> device.commit_config()
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
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
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
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.comAs 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')
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]
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
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
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
#!/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}
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
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
!
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$
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
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 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()
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$
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$
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