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
Nenhum comentário:
Postar um comentário