目录
- 拓扑图
- 设备信息
- netmiko涉及方法
- send_config_set()方法的简单示例
- 代码
- 输出结果
- 代码解释
- 导入模块
- 配置信息
- `config_device_interface_description` 函数
- 主程序块
- 总结
- send_config_set方法参数:
- 1. enter_config_mode
- 2. config_commands
- 3. enter_config_mode
- 4. error_pattern
拓扑图
设备信息
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涉及方法
- send_config_set()
自动进入设备的config模式,配置发送完成,设备接收到之后,它还会自动退出config模式 - save_config()
netmiko自动输入对应平台的保存命令,并自动完成一部分交互。
比如华为的save
,y
send_config_set()方法的简单示例
代码
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)
输出结果
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 网络设备的接口描述。以下是代码的逐步解释:
导入模块
from netmiko import ConnectHandler
from deviceinfo import sw4, sw1
netmiko
:这是一个用于通过 SSH 连接网络设备并发送命令的 Python 库。deviceinfo
:这个模块可能包含了sw4
和sw1
设备的连接信息(例如设备的 IP 地址、用户名、密码等)。
配置信息
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
函数
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()
:保存配置更改(此步骤在退出配置模式后非常重要,以确保更改被持久化)。- 函数会打印配置命令执行的输出和保存操作的输出。
主程序块
if __name__ == '__main__':
for device in [sw4, sw1]:
config_device_interface_description(device)
- 这个循环遍历
sw4
和sw1
两个设备(从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
根据回显判断配置是否有误的正则。默认为空。如果设置了一个正则,匹配上后会自动暂停后续的命令发送。
# 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经常有'^'
,因此可以如下操作:
# 故意对一个不存在的端口进行配置
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"'\^'")
最终会抛出异常:
raise ConfigInvalidException(msg)
netmiko.ssh_exception.ConfigInvalidException: Invalid input detected at command: interface GE2/0/0