Home > Networking > Setting Up a Cisco Switch with Python Automation

Setting Up a Cisco Switch with Python Automation

Let’s dive into setting up a Cisco switch using Python automation! This is a great way to streamline network configuration tasks, and I’ll walk you through the process step-by-step. We’ll assume you’re working with a Cisco IOS-based switch, and I’ll use Python with libraries like paramiko or netmiko to handle the automation. These are popular choices for SSH-based network device management.

What You’ll Need

  1. A Cisco Switch: Accessible via SSH (IP address, username, password).
  2. Python Installed: Version 3.x recommended.
  3. Libraries: Install netmiko (a higher-level abstraction over SSH) with pip install netmiko.
  4. Basic Switch Info: IP address, credentials, and the configuration you want to apply.

Step 1: Basic Connection

Let’s start with a simple script to connect to the switch and run a command (e.g., show version). Here’s an example using netmiko:

python

from netmiko import ConnectHandler

# Define the device details
switch = {
    'device_type': 'cisco_ios',
    'host': '192.168.1.10',  # Replace with your switch IP
    'username': 'admin',     # Replace with your username
    'password': 'cisco123',  # Replace with your password
}

# Establish SSH connection
try:
    connection = ConnectHandler(**switch)
    print("Connected successfully!")

    # Run a command
    output = connection.send_command("show version")
    print(output)

    # Disconnect
    connection.disconnect()
except Exception as e:
    print(f"Failed to connect: {e}")

Run this script to test connectivity. If it works, you’ll see the switch’s version info. Adjust the IP, username, and password to match your setup.

Step 2: Configuring the Switch

Now, let’s automate some basic configurations—like setting a hostname, creating a VLAN, and configuring an interface. We’ll use send_config_set() to send multiple commands:

python

from netmiko import ConnectHandler

switch = {
    'device_type': 'cisco_ios',
    'host': '192.168.1.10',
    'username': 'admin',
    'password': 'cisco123',
}

# Configuration commands
config_commands = [
    'hostname MySwitch',
    'vlan 10',
    'name Sales',
    'exit',
    'interface gigabitEthernet0/1',
    'switchport mode access',
    'switchport access vlan 10',
    'description Connected_to_Sales',
    'no shutdown'
]

try:
    connection = ConnectHandler(**switch)
    print("Connected successfully!")

    # Send configuration commands
    output = connection.send_config_set(config_commands)
    print("Configuration applied:")
    print(output)

    # Save the configuration
    connection.save_config()
    print("Configuration saved!")

    connection.disconnect()
except Exception as e:
    print(f"Error: {e}")

This script sets the hostname to “MySwitch”, creates VLAN 10 named “Sales”, and configures interface Gi0/1 as an access port in VLAN 10. The save_config() ensures changes persist after a reboot.

Step 3: Scaling It Up

For multiple switches or more complex configs, you can:

  • Use a List of Devices: Store device details in a list or JSON file and loop through them.
  • Template Configs: Use Jinja2 to generate commands dynamically.
  • Error Handling: Add checks (e.g., verify VLAN creation with show vlan brief).

Here’s an example with multiple switches:

python

from netmiko import ConnectHandler

devices = [
    {'host': '192.168.1.10', 'username': 'admin', 'password': 'cisco123'},
    {'host': '192.168.1.11', 'username': 'admin', 'password': 'cisco123'}
]

config_commands = [
    'hostname Switch_{}',
    'vlan 20',
    'name Engineering',
    'exit'
]

for i, device in enumerate(devices, 1):
    device['device_type'] = 'cisco_ios'
    try:
        connection = ConnectHandler(**device)
        print(f"Connected to {device['host']}")
        
        # Customize hostname per switch
        commands = [cmd.format(i) if '{}' in cmd else cmd for cmd in config_commands]
        connection.send_config_set(commands)
        connection.save_config()
        
        print(f"Configured Switch_{i}")
        connection.disconnect()
    except Exception as e:
        print(f"Failed on {device['host']}: {e}")

Tips

  • Enable SSH: On the switch, ensure SSH is enabled (crypto key generate rsa, ip ssh version 2, etc.).
  • Timeouts: For slow devices, adjust netmiko timeouts (e.g., global_delay_factor=2 in the device dict).
  • Debugging: Use connection.send_command(“show run”) to verify changes.
  • Security: Store credentials securely (e.g., environment variables or a config file).

What’s your setup like? Want to tweak this for a specific switch model or configuration? Let me know!

Leave a Comment