22 de abr. de 2018

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

Nenhum comentário:

LinkWithin

Related Posts with Thumbnails