The Netmiko library
Paramiko is a great library to do low-level interactions with Cisco IOS and other vendor devices. But as you have noticed from previous examples, we are repeating many of the same steps between lax-edg-r1
and lax-edg-r2
for device login and execution. Once we start to develop more automation commands, we also start to repeat ourselves in capturing terminal outputs and formatting 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
>>> net_connect = ConnectHandler(
... device_type="cisco_ios",
... host="192.168.2.51",
... username="cisco",
... password="cisco",
... )
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()
'lax-edg-r1#'
>>> output = net_connect.send_command('show ip int brief')
>>> print(output)
Interface IP-Address OK? Method Status Protocol
GigabitEthernet0/0 192.168.2.51 YES NVRAM up up
GigabitEthernet0/1 10.0.0.1 YES NVRAM up up
Loopback0 192.168.0.10 YES NVRAM up up
Let’s see another example for the second Cisco IOS device in our lab 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="192.168.2.52",
... username="cisco",
... password="cisco",
... )
>>> output = net_connect_2.send_config_set(['logging buffered 19999'])
>>> print(output)
configure terminal
Enter configuration commands, one per line. End with CNTL/Z.
lax-edg-r2(config)#logging buffered 19999
lax-edg-r2(config)#end
lax-edg-r2#
>>> exit()
How cool is that? Netmiko automatically took care of the nitty-gritty stuff for us, allowing us to focus on the commands themselves. 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 also aims to simplify low-level interactions.