如何使用 Python 和 Netmiko 自动创建网络设备 VLAN,受益颇深!

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: 【5月更文挑战第9天】

你好,这里是网络技术联盟站,我是瑞哥。

在现代网络中,自动化是网络管理的重要一环。通过使用Python编程语言和Netmiko库,我们可以简化并提高VLAN(Virtual Local Area Network)的创建过程。VLAN允许我们将网络设备划分为逻辑上的独立网络,提高网络的性能、安全性和管理效率。

在开始自动执行VLAN创建之前,我们需要进行一些准备工作,确保系统处于适当的状态。

安装 Python

在Windows上安装Python

  1. 访问Python官方网站

前往 Python官方网站https://www.python.org/downloads下载最新版本的Python。

  1. 下载安装程序

在网站上选择适用于Windows的Python版本,通常为一个exe文件。双击下载的安装程序以启动安装。

  1. 设置安装选项

在安装过程中,确保勾选 "Add Python to PATH" 选项,这将使Python可在命令行中直接访问。

  1. 完成安装

点击 "Install Now" 开始安装,等待安装程序完成。

  1. 验证安装

打开命令提示符(Command Prompt)或PowerShell,并输入以下命令来验证Python是否正确安装:

python --version

或者,使用以下命令查看Python的交互式Shell:

python

如果成功安装,你将看到Python版本信息。

在Mac上安装Python

Mac通常预装有Python,但为了确保使用最新版本或进行自定义安装,可以按照以下步骤操作:

  1. 使用Homebrew安装(推荐):

如果你使用了Homebrewhttps://brew.sh包管理器,可以使用以下命令安装Python:

brew install python
  1. 手动安装

前往Python官方网站https://www.python.org/downloads下载最新版本的Python。

  1. 安装

双击下载的pkg文件,按照提示完成安装。

  1. 验证安装

打开终端,并输入以下命令验证Python是否正确安装:

python3 --version

或者,使用以下命令查看Python的交互式Shell:

python3

如果成功安装,你将看到Python版本信息。

在Linux上安装Python

大多数Linux发行版都预装有Python,你可以通过包管理器安装或更新。

使用包管理器

  1. Debian/Ubuntu
sudo apt-get update
sudo apt-get install python3
  1. Fedora
sudo dnf install python3
  1. openSUSE
sudo zypper install python3

通过源代码安装

  1. 下载源代码

前往Python官方网站https://www.python.org/downloads/source下载Python的源代码压缩包。

  1. 解压缩源代码

在终端中进入解压缩后的目录,并执行以下命令:

./configure
make
sudo make install
  1. 验证安装

在终端中输入以下命令验证Python是否正确安装:

python3 --version

或者,使用以下命令查看Python的交互式Shell:

python3

如果成功安装,你将看到Python版本信息。

设置虚拟环境

虚拟环境可以隔离项目的依赖,防止与其他项目冲突。使用以下命令创建和激活虚拟环境:

# 安装 virtualenv
pip install virtualenv

# 创建虚拟环境
python -m venv myenv

# 激活虚拟环境
# 在 Windows 上:
myenv\Scripts\activate
# 在 Linux 或 macOS 上:
source myenv/bin/activate

安装 Netmiko

Netmiko是一个用于处理网络设备的Python库,支持多种设备类型。使用以下命令安装Netmiko:

pip install netmiko

Netmiko基于SSH协议,因此确保你的网络设备支持SSH,并且已经正确配置和启用。

编写 Python 脚本

我们将创建一个简单的Python脚本,该脚本连接到Cisco设备并执行VLAN创建过程。

连接到设备

首先,我们需要建立与网络设备的连接。创建一个Python脚本,命名为 create_vlan.py

from netmiko import ConnectHandler

device = {
   
   
    'device_type': 'cisco_ios',
    'ip': '设备IP地址',
    'username': '你的用户名',
    'password': '你的密码',
}

connection = ConnectHandler(**device)

这段代码使用Netmiko的 ConnectHandler 类建立到Cisco设备的SSH连接。请替换 '设备IP地址''你的用户名''你的密码' 为实际设备的信息。

创建 VLAN

接下来,我们将编写代码来创建一个新的VLAN。在Cisco设备上,我们可以使用 vlan 命令来完成。

vlan_id = 100
vlan_name = 'vlan_name'

vlan_command = f"vlan {vlan_id}\nname {vlan_name}"
connection.send_config_set([vlan_command])

这段代码定义了VLAN的ID和名称,然后使用 send_config_set 方法将配置命令发送到设备。这里我们使用了格式化字符串 f"vlan {vlan_id}\nname {vlan_name}" 来生成VLAN配置命令。

验证配置

为了确保VLAN创建成功,我们可以执行 show vlan brief 命令,并输出结果。

output = connection.send_command('show vlan brief')
print(output)

这段代码使用 send_command 方法向设备发送命令,并将结果存储在 output 变量中。然后通过 print(output) 打印结果。

关闭连接

最后,我们在脚本的末尾关闭与设备的连接,释放资源。

connection.disconnect()

完整的脚本如下:

from netmiko import ConnectHandler

device = {
   
   
    'device_type': 'cisco_ios',
    'ip': '设备IP地址',
    'username': '你的用户名',
    'password': '你的密码',
}

connection = ConnectHandler(**device)

# 创建 VLAN
vlan_id = 100
vlan_name = 'vlan_name'
vlan_command = f"vlan {vlan_id}\nname {vlan_name}"
connection.send_config_set([vlan_command])

# 验证配置
output = connection.send_command('show vlan brief')
print(output)

# 关闭连接
connection.disconnect()

保存并运行脚本:

python create_vlan.py

添加错误处理

在真实的网络环境中,很可能会遇到各种问题,如设备不可达、认证失败等。为了增加脚本的鲁棒性,我们可以添加一些错误处理。

from netmiko import ConnectHandler, SSHException

device = {
   
   
    'device_type': 'cisco_ios',
    'ip': '设备IP地址',
    'username': '你的用户名',
    'password': '你的密码',
}

try:
    connection = ConnectHandler(**device)

    # 创建 VLAN
    vlan_id = 100
    vlan_name = 'vlan_name'
    vlan_command = f"vlan {vlan_id}\nname {vlan_name}"
    connection.send_config_set([vlan_command])

    # 验证配置
    output = connection.send_command('show vlan brief')
    print(output)

except SSHException as e:
    print(f"SSH连接错误: {e}")

finally:
    # 关闭连接
    if 'connection' in locals():
        connection.disconnect()

在这个脚本中,我们使用了 tryexceptfinally 来进行错误处理。如果在 try 块中发生SSHException,脚本将捕获异常并打印错误消息,然后执行 finally 块中的关闭连接操作。

从配置文件读取设备信息

为了增加脚本的灵活性,我们可以将设备信息存储在一个单独的配置文件中,以便在不同场景下轻松修改。

创建一个名为 device_config.ini 的配置文件:

[device]
device_type = cisco_ios
ip = 设备IP地址
username = 你的用户名
password = 你的密码

修改脚本以从配置文件读取设备信息:

from netmiko import ConnectHandler, SSHException
from configparser import ConfigParser

config = ConfigParser()
config.read('device_config.ini')

device = {
   
   
    'device_type': config['device']['device_type'],
    'ip': config['device']['ip'],
    'username': config['device']['username'],
    'password': config['device']['password'],
}

try:
    connection = ConnectHandler(**device)

    # 创建 VLAN
    vlan_id = 100
    vlan_name = 'vlan_name'
    vlan_command = f"vlan {vlan_id}\nname {vlan_name}"
    connection.send_config_set([vlan_command])

    # 验证配置
    output = connection.send_command('show vlan brief')
    print(output)

except SSHException as e:
    print(f"SSH连接错误: {e}")

finally:
    # 关闭连接
    if 'connection' in locals():
        connection.disconnect()

这样,你可以通过修改 device_config.ini 文件来轻松更改设备信息,而无需直接修改脚本。

批量创建 VLAN

在实际网络中,可能需要一次性在多个设备上创建相同的VLAN。为了实现这一点,我们可以将设备信息存储在一个列表中,并使用循环在每个设备上执行相同的操作。

from netmiko import ConnectHandler, SSHException
from configparser import ConfigParser

config = ConfigParser()
config.read('device_config.ini')

devices = [
    {
   
   
        'device_type': config['device']['device_type'],
        'ip': '设备1的IP地址',
        'username': config['device']['username'],
        'password': config['device']['password'],
    },
    {
   
   
        'device_type': config['device']['device_type'],
        'ip': '设备2的IP地址',
        'username': config['device']['username'],
        'password': config['device']['password'],
    },
    # 添加更多设备
]

for device in devices:
    try:
        connection = ConnectHandler(**device)

        # 创建 VLAN
        vlan_id = 100
        vlan_name = 'vlan_name'
        vlan_command = f"vlan {vlan_id}\nname {vlan_name}"
        connection.send_config_set([vlan_command])

        # 验证配置
        output = connection.send_command('show vlan brief')
        print(output)

    except SSHException as e:
        print(f"SSH连接错误({device['ip']}): {e}")

    finally:
        # 关闭连接
        if 'connection' in locals():
            connection.disconnect()

通过在 devices 列表中添加更多设备,可以在一次运行中批量创建相同的VLAN。

使用函数进行模块化

为了提高脚本的可读性和维护性,我们可以将不同的功能模块化,将其放入函数中。

from netmiko import ConnectHandler, SSHException
from configparser import ConfigParser

def connect_to_device(device):
    try:
        connection = ConnectHandler(**device)
        return connection
    except SSHException as e:
        print(f"SSH连接错误({device['ip']}): {e}")
        return None

def create_vlan(connection, vlan_id, vlan_name):
    vlan_command = f"vlan {vlan_id}\nname {vlan_name}"
    connection.send_config_set([vlan_command])

def verify_vlan(connection):
    output = connection.send_command('show vlan brief')
    print(output)

def disconnect_from_device(connection):
    connection.disconnect()

def main():
    config = ConfigParser()
    config.read('device_config.ini')

    devices = [
        {
   
   
            'device_type': config['device']['device_type'],
            'ip': '设备1的IP地址',
            'username': config['device']['username'],
            'password': config['device']['password'],
        },
        {
   
   
            'device_type': config['device']['device_type'],
            'ip': '设备2的IP地址',
            'username': config['device']['username'],
            'password': config['device']['password'],
        },
        # 添加更多设备
    ]

    for device in devices:
        connection = connect_to_device(device)
        if connection:
            create_vlan(connection, vlan_id=100, vlan_name='vlan_name')
            verify_vlan(connection)
            disconnect_from_device(connection)

if __name__ == "__main__":
    main()

通过将连接设备、创建VLAN、验证配置和断开连接等操作封装成函数,我们可以更清晰地组织脚本,并使其更易于维护。

使用 Jinja2 模板生成配置

在实际网络环境中,可能会有大量相似的配置任务,例如在多个设备上创建相同的VLAN。为了更灵活地生成配置,我们可以使用 Jinja2 模板引擎。

首先,安装 Jinja2:

pip install jinja2

然后,创建一个 Jinja2 模板文件,命名为 vlan_template.j2

vlan {
  
  { vlan_id }}
 name {
  
  { vlan_name }}

修改脚本,使用 Jinja2 模板引擎加载模板并生成配置:

from netmiko import ConnectHandler, SSHException
from configparser import ConfigParser
from jinja2 import Environment, FileSystemLoader

def render_template(template_path, **kwargs):
    env = Environment(loader=FileSystemLoader('.'))
    template = env.get_template(template_path)
    return template.render(kwargs)

def connect_to_device(device):
    try:
        connection = ConnectHandler(**device)
        return connection
    except SSHException as e:
        print(f"SSH连接错误({device['ip']}): {e}")
        return None

def create_vlan(connection, vlan_id, vlan_name):
    vlan_template = render_template('vlan_template.j2', vlan_id=vlan_id, vlan_name=vlan_name)
    connection.send_config_set([vlan_template])

def verify_vlan(connection):
    output = connection.send_command('show vlan brief')
    print(output)

def disconnect_from_device(connection):
    connection.disconnect()

def main():
    config = ConfigParser()
    config.read('device_config.ini')

    devices = [
        {
   
   
            'device_type': config['device']['device_type'],
            'ip': '设备1的IP地址',
            'username': config['device']['username'],
            'password': config['device']['password'],
        },
        {
   
   
            'device_type': config['device']['device_type'],
            'ip': '设备2的IP地址',
            'username': config['device']['username'],
            'password': config['device']['password'],
        },
        # 添加更多设备
    ]

    for device in devices:
        connection = connect_to_device(device)
        if connection:
            create_vlan(connection, vlan_id=100, vlan_name='vlan_name')
            verify_vlan(connection)
            disconnect_from_device(connection)

if __name__ == "__main__":
    main()

这样,我们可以使用 Jinja2 模板生成更复杂的配置,并轻松地在不同的设备上执行相同的配置任务。

使用异常处理改进脚本稳定性

在网络自动化中,异常处理是至关重要的。当我们尝试连接设备、发送配置或执行其他操作时,可能会遇到各种错误。通过适当的异常处理,我们可以使脚本更加稳定和可靠。

from netmiko import ConnectHandler, SSHException
from configparser import ConfigParser

def connect_to_device(device):
    try:
        connection = ConnectHandler(**device)
        return connection
    except SSHException as e:
        print(f"SSH连接错误({device['ip']}): {e}")
        return None
    except Exception as e:
        print(f"连接设备({device['ip']})时出现错误: {e}")
        return None

def create_vlan(connection, vlan_id, vlan_name):
    try:
        vlan_command = f"vlan {vlan_id}\nname {vlan_name}"
        connection.send_config_set([vlan_command])
    except Exception as e:
        print(f"创建VLAN({vlan_id})时出现错误: {e}")

def verify_vlan(connection):
    try:
        output = connection.send_command('show vlan brief')
        print(output)
    except Exception as e:
        print(f"验证VLAN时出现错误: {e}")

def disconnect_from_device(connection):
    try:
        connection.disconnect()
    except Exception as e:
        print(f"断开连接时出现错误: {e}")

def main():
    config = ConfigParser()
    config.read('device_config.ini')

    devices = [
        {
   
   
            'device_type': config['device']['device_type'],
            'ip': '设备1的IP地址',
            'username': config['device']['username'],
            'password': config['device']['password'],
        },
        {
   
   
            'device_type': config['device']['device_type'],
            'ip': '设备2的IP地址',
            'username': config['device']['username'],
            'password': config['device']['password'],
        },
        # 添加更多设备
    ]

    for device in devices:
        connection = connect_to_device(device)
        if connection:
            create_vlan(connection, vlan_id=100, vlan_name='vlan_name')
            verify_vlan(connection)
            disconnect_from_device(connection)

if __name__ == "__main__":
    main()

通过在关键部分添加适当的异常处理,我们可以提高脚本的鲁棒性,并更好地处理可能出现的问题。

使用日志记录

在复杂的自动化脚本中,输出到控制台的信息可能不足以进行详细的故障排查。使用日志记录可以帮助我们跟踪脚本的执行过程,记录关键事件和错误。

import logging

logging.basicConfig(filename='automation.log', level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')

def connect_to_device(device):
    try:
        connection = ConnectHandler(**device)
        logging.info(f"连接到设备({device['ip']})成功")
        return connection
    except SSHException as e:
        logging.error(f"SSH连接错误({device['ip']}): {e}")
        return None
    except Exception as e:
        logging.error(f"连接设备({device['ip']})时出现错误: {e}")
        return None

# 在其他关键部分添加日志记录

通过配置日志记录,我们可以在执行过程中捕获关键事件,并在需要时检查日志文件以了解脚本的行为。

使用版本控制

版本控制是软件开发中的重要实践之一,它允许我们跟踪代码的变化并协作开发。将脚本存储在版本控制系统(如Git)中可以使我们更好地管理代码,并跟踪变更历史。

通过将脚本存储在Git仓库中,并定期提交和推送变更,我们可以确保脚本的安全和可追溯性。

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
目录
相关文章
|
1月前
|
机器学习/深度学习 人工智能 算法
基于Python深度学习的眼疾识别系统实现~人工智能+卷积网络算法
眼疾识别系统,本系统使用Python作为主要开发语言,基于TensorFlow搭建卷积神经网络算法,并收集了4种常见的眼疾图像数据集(白内障、糖尿病性视网膜病变、青光眼和正常眼睛) 再使用通过搭建的算法模型对数据集进行训练得到一个识别精度较高的模型,然后保存为为本地h5格式文件。最后使用Django框架搭建了一个Web网页平台可视化操作界面,实现用户上传一张眼疾图片识别其名称。
165 5
基于Python深度学习的眼疾识别系统实现~人工智能+卷积网络算法
|
2月前
|
机器学习/深度学习 人工智能 算法
猫狗宠物识别系统Python+TensorFlow+人工智能+深度学习+卷积网络算法
宠物识别系统使用Python和TensorFlow搭建卷积神经网络,基于37种常见猫狗数据集训练高精度模型,并保存为h5格式。通过Django框架搭建Web平台,用户上传宠物图片即可识别其名称,提供便捷的宠物识别服务。
383 55
|
16天前
|
机器学习/深度学习 人工智能 算法
基于Python深度学习的【蘑菇识别】系统~卷积神经网络+TensorFlow+图像识别+人工智能
蘑菇识别系统,本系统使用Python作为主要开发语言,基于TensorFlow搭建卷积神经网络算法,并收集了9种常见的蘑菇种类数据集【"香菇(Agaricus)", "毒鹅膏菌(Amanita)", "牛肝菌(Boletus)", "网状菌(Cortinarius)", "毒镰孢(Entoloma)", "湿孢菌(Hygrocybe)", "乳菇(Lactarius)", "红菇(Russula)", "松茸(Suillus)"】 再使用通过搭建的算法模型对数据集进行训练得到一个识别精度较高的模型,然后保存为为本地h5格式文件。最后使用Django框架搭建了一个Web网页平台可视化操作界面,
71 11
基于Python深度学习的【蘑菇识别】系统~卷积神经网络+TensorFlow+图像识别+人工智能
|
15天前
|
监控 Linux PHP
【02】客户端服务端C语言-go语言-web端PHP语言整合内容发布-优雅草网络设备监控系统-2月12日优雅草简化Centos stream8安装zabbix7教程-本搭建教程非docker搭建教程-优雅草solution
【02】客户端服务端C语言-go语言-web端PHP语言整合内容发布-优雅草网络设备监控系统-2月12日优雅草简化Centos stream8安装zabbix7教程-本搭建教程非docker搭建教程-优雅草solution
65 20
|
1月前
|
物联网 Python
请问:如何使用python对物联网平台上设备的属性进行更改?
为验证项目可行性,本实验利用阿里云物联网平台创建设备并定义电流、电压两个整型属性。通过Python与平台交互,实现对设备属性的控制,确保后续项目的顺利进行。此过程涵盖设备连接、数据传输及属性调控等功能。
|
1月前
|
安全 Linux 网络安全
利用Python脚本自动备份网络设备配置
通过本文的介绍,我们了解了如何利用Python脚本自动备份网络设备配置。该脚本使用 `paramiko`库通过SSH连接到设备,获取并保存配置文件。通过定时任务调度,可以实现定期自动备份,确保网络设备配置的安全和可用。希望这些内容能够帮助你在实际工作中实现网络设备的自动化备份。
61 14
|
2月前
|
机器学习/深度学习 人工智能 算法
【宠物识别系统】Python+卷积神经网络算法+深度学习+人工智能+TensorFlow+图像识别
宠物识别系统,本系统使用Python作为主要开发语言,基于TensorFlow搭建卷积神经网络算法,并收集了37种常见的猫狗宠物种类数据集【'阿比西尼亚猫(Abyssinian)', '孟加拉猫(Bengal)', '暹罗猫(Birman)', '孟买猫(Bombay)', '英国短毛猫(British Shorthair)', '埃及猫(Egyptian Mau)', '缅因猫(Maine Coon)', '波斯猫(Persian)', '布偶猫(Ragdoll)', '俄罗斯蓝猫(Russian Blue)', '暹罗猫(Siamese)', '斯芬克斯猫(Sphynx)', '美国斗牛犬
228 29
【宠物识别系统】Python+卷积神经网络算法+深度学习+人工智能+TensorFlow+图像识别
|
20天前
|
监控 关系型数据库 MySQL
【01】客户端服务端C语言-go语言-web端PHP语言整合内容发布-优雅草网络设备监控系统-硬件设备实时监控系统运营版发布-本产品基于企业级开源项目Zabbix深度二开-分步骤实现预计10篇合集-自营版
【01】客户端服务端C语言-go语言-web端PHP语言整合内容发布-优雅草网络设备监控系统-硬件设备实时监控系统运营版发布-本产品基于企业级开源项目Zabbix深度二开-分步骤实现预计10篇合集-自营版
28 0
|
1月前
|
存储 监控 安全
网络设备日志记录
网络设备日志记录是追踪设备事件(如错误、警告、信息活动)的过程,帮助IT管理员进行故障排除和违规后分析。日志详细记录用户活动,涵盖登录、帐户创建及数据访问等。为优化日志记录,需启用日志功能、管理记录内容、区分常规与异常活动,并使用专用工具进行事件关联和分析。集中式日志记录解决方案可收集并统一管理来自多种设备和应用的日志,提供简化搜索、安全存储、主动监控和更好的事件可见性,增强网络安全。常用工具如EventLog Analyzer能灵活收集、存储和分析日志,确保高效管理。
|
2月前
|
算法 网络协议 Python
探秘Win11共享文件夹之Python网络通信算法实现
本文探讨了Win11共享文件夹背后的网络通信算法,重点介绍基于TCP的文件传输机制,并提供Python代码示例。Win11共享文件夹利用SMB协议实现局域网内的文件共享,通过TCP协议确保文件传输的完整性和可靠性。服务器端监听客户端连接请求,接收文件请求并分块发送文件内容;客户端则连接服务器、接收数据并保存为本地文件。文中通过Python代码详细展示了这一过程,帮助读者理解并优化文件共享系统。

热门文章

最新文章