The Netmiko library
Paramiko is a great library to do low-level interactions with Cisco IOS and other vendor devices. But if you have noticed from previous examples, we are repeating many of the same steps between iosv-1
and isov-2
for device login and execution. Once we start to develop more automation commands, we also start to repeat ourselves to capture outputs and format them into a usable format. Wouldn't it be great if somebody could write a Python library that simplifies these low-level steps and share it with other network engineers?
Ever since 2014, Kirk Byers (https://github.com/ktbyers) has been working on open source initiatives to simplify the management of network devices. In this section, we will take a look at an example of the Netmiko (https://github.com/ktbyers/netmiko) library that he created.
First, we will install the netmiko
library using pip
:
(venv) $ pip install netmiko
We can use the example published on Kirk's website, https://pynet.twb-tech.com/blog/automation/netmiko.html, and apply it to our labs. We will start by importing the library and its ConnectHandler
class. Then we will define our device
parameter as a Python dictionary and pass it to the ConnectHandler
. Notice that we are defining a device_type
of cisco_ios
in the device
parameter.
>>> from netmiko import ConnectHandler
>>> ios_v1 = {'device_type': 'cisco_ios', 'host': '172.16.1.20', 'username': 'cisco', 'password': 'cisco'}
>>> net_connect = ConnectHandler(**ios_v1)
This is where the simplification begins. Notice that the library automatically determines the device prompt as well as formatting the returned output from the show
command:
>>> net_connect.find_prompt()
'iosv-1#'
>>> output = net_connect.send_command('show ip int brief')
>>> print(output)
Interface IP-Address OK? Method Status Protocol
GigabitEthernet0/0 172.16.1.20 YES NVRAM up up
GigabitEthernet0/1 10.0.0.5 YES NVRAM up up
Loopback0 192.168.0.1 YES NVRAM up up
Let's see another example for the second Cisco IOS device in our lab, but this time we will define the iosv-2
parameter when we initiate the ConnectHandler
object and send a configuration
command instead of a show
command. Note that the command
attribute is a list that can contain multiple commands:
>>> net_connect_2 = ConnectHandler(device_type='cisco_ios', host='172.16.1.21', username='cisco', password='cisco')
>>> output = net_connect_2.send_config_set(['logging buffered 19999'])
>>> print(output)
config term
Enter configuration commands, one per line. End with CNTL/Z.
iosv-2(config)#logging buffered 19999
iosv-2(config)#end
iosv-2#
>>> exit()
The netmiko
library is a great time saver and is used by many network engineers. In the next section, we will take a look at the Nornir (https://github.com/nornir-automation/nornir) framework, which aims to simplify low-level interactions.