AutoNetOps

Cover Image for Nornir Fundamentals and Configuration

Nornir Fundamentals and Configuration

·

4 min read

Introduction to Network Automation

This chapter delves into the fundamentals of network automation with Nornir, a powerful Python-based framework designed to simplify and accelerate network management operations.

Nornir empowers network engineers to automate a wide range of tasks, including device configuration, inventory management, troubleshooting, and security audits. By leveraging the power of Python and its rich ecosystem of libraries, Nornir provides a flexible and extensible platform for automating complex network operations.

Understanding Nornir

Nornir is a multi-threaded network automation framework that simplifies inventory and task execution. Its multi-threaded design allows it to manage the configuration of multiple network devices at the same time (default is 20), unlike native Netmiko, which processes devices one by one. It uses a separate thread for each host in the inventory to execute tasks concurrently and track their progress.

Nornir tasks perform actions on the data. Tasks can include shared community plugins, your own custom plugins, or native Python code. The Nornir framework connects the inventory (data) and tasks, allowing them to run on a subset of devices while managing data, parallelization, and tracking the output and/or errors.

There are network plugins for connecting to devices (nornir-napalm, etc.), inventory plugins for building the inventory (nornir-netbox, nornir-.), and nornir-utils, which contains some former core tasks like print_result and load_yaml.

Key Components of Nornir

  • Inventory: A central repository that defines the network devices and their connection details.

  • Plugins: Community-contributed plugins that are located as separate Python packages. They expand nornir basic functionality to build the inventory and connection to devices.

  • Tasks: Functions that encapsulate specific actions to be performed on network devices.

  • Results: Data structures that store the output of executed tasks, providing insights into the results of automation operations.

Setting Up Nornir Environment

Before embarking on your network automation journey with Nornir, it's essential to set up a suitable environment. This involves installing the necessary dependencies and configuring your Nornir environment.

Installing Nornir

Nornir is readily available through the Python Package Index (PyPI). You can install it using the pip package manager:

pip install nornir

Creating an Inventory

An inventory defines the network devices you want to manage. Nornir supports various inventory formats, including YAML, JSON, and Python dictionaries. Here's an example of a simple YAML inventory:

hosts:
  router1:
    hostname: router1
    platform: ios
    username: admin
    password: password
  switch1:
    hostname: switch1
    platform: cisco
    username: admin
    password: password

Configuring Plugins

Nornir's plugins provide functionality for specific tasks. You can install plugins using pip or by specifying them in your requirements.txt file. For example, to install the napalm plugin for interacting with network devices:

pip install nornir-napalm

Basic Nornir Operations

Once your Nornir environment is set up, you can start performing basic operations. This section covers essential concepts and examples to get you started with Nornir.

Connecting to Devices

Nornir provides a convenient way to connect to network devices using plugins. The napalm plugin, for instance, allows you to connect to devices using various protocols, such as SSH, Telnet, and NETCONF.

from nornir import InitNornir
from nornir_napalm.plugins.tasks import napalm_get

nr = InitNornir(config_file='config.yaml')

result = nr.run(task=napalm_get, getters=['facts'])

Running Tasks

Tasks are the core of Nornir's automation capabilities. They encapsulate specific actions to be performed on network devices. You can define your own custom tasks or use pre-built tasks from Nornir's plugin ecosystem.

from nornir import InitNornir
from nornir_napalm.plugins.tasks import napalm_configure

nr = InitNornir(config_file='config.yaml')

config = {'interface': {'GigabitEthernet0/0': {'description': 'To the internet'}}}

result = nr.run(task=napalm_configure, configuration=config)

Working with Results

Nornir's results provide valuable information about the execution of tasks. They contain data about the task's success or failure, the output of the task, and other relevant details.

Accessing Results

You can access the results of a task using the results attribute of the Nornir object. The results are organized by device and task.

from nornir import InitNornir
from nornir_napalm.plugins.tasks import napalm_get

nr = InitNornir(config_file='config.yaml')

result = nr.run(task=napalm_get, getters=['facts'])

print(result['router1']['napalm_get']['facts'])

Analyzing Results

Nornir provides various methods for analyzing and processing results. You can use the failed attribute to check for failed tasks, iterate over the results, and filter results based on specific criteria.

from nornir import InitNornir
from nornir_napalm.plugins.tasks import napalm_get

nr = InitNornir(config_file='config.yaml')

result = nr.run(task=napalm_get, getters=['facts'])

for host, host_result in result.items():
  if host_result.failed:
    print(f'Task failed on {host}: {host_result.exception}')

Customizing Nornir

Nornir's modular design allows you to customize its behavior and extend its functionality to meet specific requirements. This section explores techniques for tailoring Nornir to your automation needs.

Creating Custom Tasks

You can define your own custom tasks to encapsulate specific actions or workflows. Custom tasks allow you to reuse code and streamline complex automation processes.

from nornir import InitNornir
from nornir.core.task import Task

def my_custom_task(task: Task) -> None:
  task.host.data['custom_data'] = 'This is custom data'

nr = InitNornir(config_file='config.yaml')

result = nr.run(task=my_custom_task)

Extending Plugins

Nornir's plugin ecosystem provides a wide range of functionality. You can extend existing plugins or create your own plugins to address specific needs. For example, you might create a plugin to interact with a custom network management system.

Nornir's flexibility and extensibility make it a powerful tool for automating complex network operations. By understanding its core concepts and customization capabilities, you can leverage Nornir to streamline your network management tasks and enhance your overall network efficiency.