Automating Network Configurations

Loading

Network configuration is a crucial task for system administrators, network engineers, and cybersecurity professionals. Automating this process with Python helps in reducing manual errors, improving efficiency, and managing large-scale networks.

Python provides several libraries to interact with network devices such as routers, switches, and firewalls using SSH, Telnet, and APIs.


Why Automate Network Configurations?

Saves time – No need to configure devices manually
Minimizes errors – Reduces human mistakes
Ensures consistency – Uniform configurations across devices
Enhances security – Automate updates, patches, and policies
Scalability – Manage thousands of devices with minimal effort


1. Using Paramiko for SSH Automation

Paramiko is a Python library for SSH communication, allowing secure remote access to network devices.

Installing Paramiko

pip install paramiko

Automating Router/Switch Configuration

import paramiko

# Device details
device_ip = "192.168.1.1"
username = "admin"
password = "password"

# Create SSH client
client = paramiko.SSHClient()
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())

# Connect to the device
client.connect(device_ip, username=username, password=password)

# Send commands
stdin, stdout, stderr = client.exec_command("show running-config")
config_output = stdout.read().decode()

print("Device Configuration:\n", config_output)

# Close connection
client.close()

✔ Connects to a network device using SSH
✔ Executes a command (show running-config)
✔ Retrieves the current configuration


2. Automating Network Configuration with Netmiko

Netmiko is a simplified library built on Paramiko, designed for network automation.

Installing Netmiko

pip install netmiko

Sending Commands to Cisco Routers

from netmiko import ConnectHandler

# Define the device
cisco_router = {
"device_type": "cisco_ios",
"host": "192.168.1.1",
"username": "admin",
"password": "password",
}

# Connect to the device
connection = ConnectHandler(**cisco_router)

# Send configuration commands
commands = [
"interface GigabitEthernet0/1",
"ip address 192.168.1.100 255.255.255.0",
"no shutdown",
]

output = connection.send_config_set(commands)
print(output)

# Save configuration
connection.send_command("write memory")

# Close connection
connection.disconnect()

✔ Logs into a Cisco router
✔ Configures an IP address
✔ Saves the configuration


3. Automating Network Configurations with NAPALM

NAPALM is a Python library for managing network devices from multiple vendors (Cisco, Juniper, Arista, etc.).

Installing NAPALM

pip install napalm

Retrieving Router Configuration

from napalm import get_network_driver

driver = get_network_driver("ios") # Change to 'junos' for Juniper devices
device = driver("192.168.1.1", "admin", "password")

device.open()
config = device.get_config()
print("Running Configuration:\n", config["running"])

device.close()

✔ Works across different network vendors
✔ Retrieves running configurations


4. Automating Network Configurations via REST API

Modern network devices expose REST APIs for automation.

Example: Using REST API to Configure Cisco Router

import requests
from requests.auth import HTTPBasicAuth

# Cisco router details
router_ip = "192.168.1.1"
username = "admin"
password = "password"

# API URL for configuration
url = f"https://{router_ip}/restconf/data/Cisco-IOS-XE-native:native/interface/GigabitEthernet=1"

headers = {
"Content-Type": "application/yang-data+json",
"Accept": "application/yang-data+json",
}

# Configuration payload
config_data = {
"Cisco-IOS-XE-native:GigabitEthernet": {
"name": 1,
"description": "Configured via REST API",
"ip": {"address": {"primary": {"address": "192.168.1.100", "mask": "255.255.255.0"}}},
}
}

# Send PUT request
response = requests.put(url, json=config_data, headers=headers, auth=HTTPBasicAuth(username, password), verify=False)

if response.status_code == 204:
print("Configuration updated successfully!")
else:
print("Failed to update configuration:", response.text)

✔ Uses REST API to configure a Cisco router
✔ Secures access using HTTP Basic Authentication


5. Backing Up Network Configurations

Automating backups prevents data loss due to hardware failures or misconfigurations.

Using Netmiko to Backup Configurations

from netmiko import ConnectHandler

device = {
"device_type": "cisco_ios",
"host": "192.168.1.1",
"username": "admin",
"password": "password",
}

connection = ConnectHandler(**device)
config_output = connection.send_command("show running-config")

# Save backup
with open("router_backup.txt", "w") as file:
file.write(config_output)

print("Backup saved successfully!")

connection.disconnect()

Retrieves the configuration
Saves it as a backup file


6. Automating Firmware Upgrades

Regular firmware updates fix security vulnerabilities and improve performance.

Automating Firmware Upgrade via SSH

from netmiko import ConnectHandler

device = {
"device_type": "cisco_ios",
"host": "192.168.1.1",
"username": "admin",
"password": "password",
}

connection = ConnectHandler(**device)

# Upload new firmware
output = connection.send_command("copy tftp://192.168.1.2/new_firmware.bin flash:")
print(output)

# Set new firmware as the boot image
connection.send_command("boot system flash:new_firmware.bin")

# Reload the device
connection.send_command("reload")

connection.disconnect()

Uploads firmware from a TFTP server
Sets it as the new boot image
Reloads the device


7. Monitoring Network Devices

Automating network monitoring ensures uptime and performance tracking.

Checking Device Status

import ping3

device_ip = "192.168.1.1"

response = ping3.ping(device_ip)
if response:
print(f"Device {device_ip} is online. Ping time: {response} ms")
else:
print(f"Device {device_ip} is unreachable.")

✔ Pings the device to check availability

Leave a Reply

Your email address will not be published. Required fields are marked *