网络自动化03:简单解释send_config_set方法并举例

目录

拓扑图

设备信息

python 复制代码
sw1 = {
    'device_type':'cisco_ios',
    'ip':'192.168.100.11',
    'username':'python',
    'password':'123',
    'session_log':'Log/sw1.log'
}
sw2 = {
    'device_type':'cisco_ios',
    'ip':'192.168.100.12',
    'username':'python',
    'password':'123',
    'session_log':'Log/sw2.log'
}
sw3 = {
    'device_type':'cisco_ios',
    'ip':'192.168.100.13',
    'username':'python',
    'password':'123',
    'session_log':'Log/sw3.log'
}
sw4 = {
    'device_type':'huawei',
    'ip':'192.168.100.14',
    'username':'python',
    'password':'123',
    'session_log':'Log/sw4.log'
}
sw5 = {
    'device_type':'huawei',
    'ip':'192.168.100.15',
    'username':'python',
    'password':'123',
    'session_log':'Log/sw5.log'
}

netmiko涉及方法

  1. send_config_set()
    自动进入设备的config模式,配置发送完成,设备接收到之后,它还会自动退出config模式
  2. save_config()
    netmiko自动输入对应平台的保存命令,并自动完成一部分交互。
    比如华为的savey

send_config_set()方法的简单示例

代码

python 复制代码
from netmiko import ConnectHandler
from deviceinfo import sw4,sw1

config_cisco = ['interface g0/0', 'des This_is_Cisco_G_0/0_interface']
config_huawei = ['interface g1/0/0', 'des This_is_huawei_G_1/0/0_interface', 'commit']
def config_device_interface_description(device):
    with ConnectHandler(**device) as ssh_device:
        ssh_device.enable()
        if device['device_type'] == 'cisco_ios':
            config_output = ssh_device.send_config_set(config_cisco)
        else:
            config_output = ssh_device.send_config_set(config_huawei)
        print('config output:')
        print(config_output)
        # netmiko的send_config_set会自动进入config配置模式并配置,但不会保存
        # 保存使用save_config()
        config_save_output = ssh_device.save_config()
        print('======================\n'
              'config_save_output:')
        print(config_save_output)

if __name__ == '__main__':
    for device in [sw4,sw1]:
        config_device_interface_description(device)

输出结果

python 复制代码
config output:
system-view
Enter system view, return user view with return command.
[~sw4_huawei]interface g1/0/0
[~sw4_huawei-GE1/0/0]des This_is_huawei_G_1/0/0_interface
[~sw4_huawei-GE1/0/0]commit
[~sw4_huawei-GE1/0/0]return
<sw4_huawei>
======================
config_save_output:
save
Warning: The current configuration will be written to the device. Continue? [Y/N]:y
Now saving the current configuration to the slot 17 .
Info: Save the configuration successfully.
<sw4_huawei>


config output:
configure terminal
Enter configuration commands, one per line.  End with CNTL/Z.
sw1(config)#interface g0/0
sw1(config-if)#des This_is_Cisco_G_0/0_interface
sw1(config-if)#end
sw1#
======================
config_save_output:
write mem
Building configuration...
Compressed configuration from 3153 bytes to 1805 bytes[OK]
sw1#

代码解释

这段代码的作用是通过使用 Netmiko 库,自动配置 Cisco 和 Huawei 网络设备的接口描述。以下是代码的逐步解释:

导入模块

python 复制代码
from netmiko import ConnectHandler
from deviceinfo import sw4, sw1
  • netmiko:这是一个用于通过 SSH 连接网络设备并发送命令的 Python 库。
  • deviceinfo :这个模块可能包含了 sw4sw1 设备的连接信息(例如设备的 IP 地址、用户名、密码等)。

配置信息

python 复制代码
config_cisco = ['interface g0/0', 'des This_is_Cisco_G_0/0_interface']
config_huawei = ['interface g1/0/0', 'des This_is_huawei_G_1/0/0_interface', 'commit']
  • config_cisco :针对 Cisco 设备的配置命令,设置接口 g0/0 的描述为 This_is_Cisco_G_0/0_interface
  • config_huawei :针对 Huawei 设备的配置命令,设置接口 g1/0/0 的描述为 This_is_huawei_G_1/0/0_interface,并且包含 commit 命令来提交配置。

config_device_interface_description 函数

python 复制代码
def config_device_interface_description(device):
    with ConnectHandler(**device) as ssh_device:
        ssh_device.enable()
        if device['device_type'] == 'cisco_ios':
            config_output = ssh_device.send_config_set(config_cisco)
        else:
            config_output = ssh_device.send_config_set(config_huawei)
        print('config output:')
        print(config_output)
        config_save_output = ssh_device.save_config()
        print('======================\n'
              'config_save_output:')
        print(config_save_output)
  • ConnectHandler(**device) :使用 device 字典中的参数打开与设备的 SSH 连接(设备类型、IP 地址、用户名、密码等)。
  • ssh_device.enable():进入特权模式,允许进行配置更改。
  • 设备类型检查
    • 如果设备类型是 'cisco_ios',则发送 Cisco 特有的配置命令(config_cisco)。
    • 否则,发送 Huawei 特有的配置命令(config_huawei)。
  • send_config_set():将配置命令列表发送到设备,自动进入配置模式并应用配置。
  • save_config():保存配置更改(此步骤在退出配置模式后非常重要,以确保更改被持久化)。
  • 函数会打印配置命令执行的输出和保存操作的输出。

主程序块

python 复制代码
if __name__ == '__main__':
    for device in [sw4, sw1]:
        config_device_interface_description(device)
  • 这个循环遍历 sw4sw1 两个设备(从 deviceinfo 模块导入),并对每个设备调用 config_device_interface_description 函数进行配置。

总结

  • 该脚本自动连接 Cisco 和 Huawei 设备,根据设备类型配置接口描述。
  • 对于 Cisco 设备,设置 g0/0 接口的描述;对于 Huawei 设备,设置 g1/0/0 接口的描述并提交更改。
  • 配置应用后,脚本会保存配置并打印配置输出和保存操作的结果。

这段代码简化了在多个设备上进行接口描述配置的操作,并且能够自动根据设备类型(Cisco 或 Huawei)选择不同的配置命令。

send_config_set方法参数:

1. enter_config_mode

是否进入配置模式config,默认True,会自动进入,输入config_commands参数中所有内容后,根据exit_config_mode的值是否自动退出特权模式

2. config_commands

需要执行的命令,一般用列表或元组。每一个成员都是发送配置的一行。

3. enter_config_mode

默认True,输入完命令后自动退出配置模式。

4. error_pattern

根据回显判断配置是否有误的正则。默认为空。如果设置了一个正则,匹配上后会自动暂停后续的命令发送。

python 复制代码
    # error_pattern进行赋值,如果某行命令回显符合正则则会抛出异常,代码终止,配置不会继续下发
    config_output = conn.send_config_set(config_commands=config_cmds, error_pattern=r'Error:')

以上如果遇到Error后,会抛出异常。例如Error: Wrong parameter found at '^' position.,会抛出 raise ConfigInvalidException(msg) netmiko.ssh_exception.ConfigInvalidException: Invalid input detected at command: interface GE2/0/0

一般来说,华为的Error经常有'^',因此可以如下操作:

python 复制代码
# 故意对一个不存在的端口进行配置
    config_cmds = ['interface GE2/0/0', 'description cofiged by netmiko', 'commit']
    # error_pattern进行赋值,如果某行命令回显符合正则则会抛出异常,代码终止,配置不会继续下发
    # 注意^在正则是开头的意思,需要转义
    config_output = conn.send_config_set(config_commands=config_cmds, error_pattern=r"'\^'")

最终会抛出异常:

python 复制代码
 raise ConfigInvalidException(msg)
netmiko.ssh_exception.ConfigInvalidException: Invalid input detected at command: interface GE2/0/0
相关推荐
夜色呦2 分钟前
中小企业人事管理自动化:SpringBoot实践
运维·spring boot·自动化
椰椰椰耶3 分钟前
【软件测试】自动化常用函数
运维·自动化
HengCeResearch883 分钟前
中国【食品检测实验室自动化】程度相对欧美等发达国家相对落后,并且技术层面存在明显的代差,未来有比较大的发展空间
人工智能·百度·自动化
很楠不爱16 分钟前
Linux网络——传输层协议
linux·网络·udp
澜世20 分钟前
2024小迪安全基础入门第二课
网络·笔记·安全
xxjkkjjkj34 分钟前
udp_socket
linux·网络
勤奋的小王同学~37 分钟前
(计算机网络)期末
服务器·网络·计算机网络
老码沉思录40 分钟前
Android开发实战班 - 网络编程 - WebSocket 实时通信
android·网络·websocket
程序猿小D40 分钟前
第三百三十一节 Java网络教程 - Java网络UDP多播
java·网络·udp
催催121 小时前
手机领夹麦克风哪个牌子好,哪种领夹麦性价比高,热门麦克风推荐
网络·人工智能·经验分享·其他·智能手机