30 de abr. de 2018

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

Nenhum comentário:

LinkWithin

Related Posts with Thumbnails