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