Getting Started with Python Network Libraries for Network Engineers – Part 1
This blog post will be the first in a series covering common Python libraries that can be used to interact with network devices. In this post we will cover the Netmiko Python library by Kirk Byers. Netmiko is based on the Paramiko Python library, but whereas Paramiko was designed to interact with standard OpenSSH devices (like Linux), Netmiko was designed to interact with network devices. It has a large number of supported platforms included for connecting via SSH, and it can also accommodate limited Telnet or serial connections as well as Secure Copy (SCP) for file transfers.
Installation
You can install Netmiko via pip install netmiko
. Or, if you are using Poetry, you can use poetry add netmiko
.
Getting Connected
Note: We will only be covering connecting via SSH in this blog post.
Like all SSH connections, Netmiko requires a hostname (IP or DNS name) and an authentication method (generally username and password) to get connected. In addition to this, you will also need to specify the device type you will be connecting to.
>>> from netmiko import ConnectHandler
>>>
>>> conn = ConnectHandler(
... host="192.0.2.3",
... username="cisco",
... password="cisco",
... device_type="cisco_ios"
... )
There are two ways of determining the device type: looking it up in a list or having Netmiko try to detect the device type automatically. You can see the list of current device types by digging into the code on GitHub, specifically the CLASS_MAPPER_BASE
dictionary in the ssh_dispatcher.py file. If, however, you aren’t exactly sure which device type you need to choose, you can use the SSHDetect
class to have Netmiko help:
>>> from netmiko import ConnectHandler, SSHDetect
>>>
>>> detect = SSHDetect(
... host="192.0.2.3",
... username="cisco",
... password="cisco",
... device_type="autodetect" # Note specifically passing 'autodetect' here is required
... )
>>> detect.autodetect() # This method returns the most likely device type
'cisco_ios'
>>> detect.potential_matches # You can also see all the potential device types and their corresponding accuracy rating
{'cisco_ios': 99}
>>> conn = ConnectHandler(
... host="192.0.2.3",
... username="cisco",
... password="cisco",
... device_type=detect.autodetect()
... )
Common Methods
Once you have instantiated your ConnectHandler
object, you can send single show commands via the .send_command()
method. You will use the same command syntax you would type in if you were directly connected to the device via SSH:
>>> output = conn.send_command("show ip int br")
>>> print(output)
Interface IP-Address OK? Method Status Protocol
FastEthernet0 unassigned YES NVRAM down down
GigabitEthernet1/0/1 unassigned YES unset up up
GigabitEthernet1/0/2 unassigned YES unset up up
GigabitEthernet1/0/3 unassigned YES unset up up
...
Note: You can send multiple show commands back-to-back with the
.send_multiline(["command1", "command2"])
.
If you want to run a command to edit the configuration, you would use the .send_config_set()
method instead. This method takes care of entering and exiting configuration mode for you, and it requires the commands be in a list or set:
>>> output = conn.send_config_set(("interface Gi1/0/3", "no description"))
>>> print(output)
configure terminal
Enter configuration commands, one per line. End with CNTL/Z.
cisco(config)#interface Gi1/0/3
cisco(config-if)#no description
cisco(config-if)#end
cisco#
And since we are good network engineers, we know we should always save our configuration after making changes with the .save_config()
method:
>>> output = conn.save_config()
>>> print(output)
write mem
Building configuration...
[OK]
cisco#
Command Output Parsing
We’ve covered parsing strategies here on this blog before, including the three currently supported parsers Netmiko supports which are TextFSM, TTP, and Genie. Let’s take a quick look on how to use them with Netmiko.
TextFSM
If you are just starting out, the easiest way to get structured output data would be to use the included TextFSM parser. By default, Netmiko includes the TextFSM library for the parsing as well as NTC Templates to use as the default templates. To get structured output, simply add use_textfsm=True
to the parameters of the .send_command()
method:
>>> output = conn.send_command("show interfaces", use_textfsm=True)
>>> pprint(output)
[{'abort': '',
'address': '381c.1ae6.cd81',
'bandwidth': '100000 Kbit',
'bia': '381c.1ae6.cd81',
'crc': '0',
'delay': '100 usec',
...
You can see the template used for this command here.
TTP
Netmiko also supports the TTP parsing library, but you will need to install it via pip install ttp
or poetry add ttp
first. It also does not currently include any templates, so you will need to find or create your own and then provide the path to those templates when you send your command.
Creating TTP templates yourself is definitely more of a manual process, but it gives you the freedom to pare down to only the information that you need. For example, if you just need the interface name, status, and description you can have a template like so:
{{ interface }} is {{ link_status }}, line protocol is {{ protocol_status }} {{ ignore }}
Description: {{ description }}
And then you would reference the template path using ttp_template
:
>>> output = conn.send_command("show interfaces", use_ttp=True, ttp_template="templates/show_interfaces.ttp")
>>> pprint(output)
[[[{'description': 'CAM1',
'interface': 'GigabitEthernet1/0/1',
'link_status': 'up',
'protocol_status': 'up'},
{'description': 'CAM2',
'interface': 'GigabitEthernet1/0/2',
'link_status': 'up',
'protocol_status': 'up'},
...
Genie
The last parser that Netmiko currently supports is Genie. Netmiko, however, does not install Genie nor its required library, PyATS, by default, so you will need to install them separately via pip install 'pyats[library]'
or poetry add 'pyats[library]'
. Once they are installed, it is again very similar to enable the Genie parsing:
>>> output = conn.send_command("show interfaces", use_genie=True)
>>> pprint(output)
{'GigabitEthernet1/0/1': {'arp_timeout': '04:00:00',
'arp_type': 'arpa',
'bandwidth': 100000,
'connected': True,
'counters': {'in_broadcast_pkts': 41240,
...
Note: Genie does not support custom templates.
Conclusion
As you can see, it doesn’t take much to get started with Netmiko. If you’d like to learn more advanced interactions with Netmiko, such as transferring files via SCP, connecting via SSH keys, or even handling commands that prompt for additional input, the best place to start would be the Netmiko Examples page in the GitHub repository. Another great resource is the #netmiko channel in the Network to Code Slack.
-Joe
New to Python libraries? NTC’s Training Academy is holding a 3-day course Automating Networks with Python I on September 26-28, 2022 with 50% labs to get you up to speed.
Visit our 2022 public course schedule to see our full list.
Contact Us to Learn More
Share details about yourself & someone from our team will reach out to you ASAP!