背景:需要对交换机的接口配置vlan信息以及描述,每个接口的信息不一致,但是有迹可循
注明:本文是参考@弈心的文章,不过王老师是思科的配置
前置准备:
1、python3
2、CSV文件,包含配置所需要的信息
3、jinja2模板
4、netmiko模块
实际操作
一、创建CSV文件,写入接口、描述、接口类型、允许通过的vlanID。
二、创建jinja2模板,还是很容易看懂的,就是配置命令的模板.保存interface_templates.js
interface {{interface}}
description {{description}}
{%if vlan=='trunk' -%}
port link-type trunk
port trunk allow-pass vlan 2 to 4094
{% else -%}
port link-type access
port default vlan {{vlan}}
{%endif-%}
undo shutdown
三、测试打印出是否是想要的模板
四、编写python脚本
import csv
from jinja2 import Template
from netmiko import ConnectHandler
# 打开CSV文件以及jinja2模板,值得注意的是jinja2模板的光标需要放到下一行,放在最后一行容易导致'keep_trailing_newline=True'无效
csv_file = open('接口配置文件.csv')
template_file = open('interface_templates.j2')
# 将CSV文件内容转化为dict(字典)类型
reader = csv.DictReader(csv_file)
# 通过jinja2中的模板类型打开jinja2模板,keep_trailing_newline=True是让每一个模板结束后自动换行,不然容易第二个模板的第一行与第二个模板的最后一行连接在一起
interface_template = Template(template_file.read(), keep_trailing_newline=True)
interface_configs = ''
# 将CSV中的信息通过jinja2的模板翻译成数据,将CSV中的数据放入jinja2的模板中。
for read in reader:
interface_config = interface_template.render(
interface=read['interface'],
description=read['description'],
vlan=read['vlan']
)
# 遍历CSV中的数据,然后将所有数据统一写入到interface_configs中
interface_configs += interface_config
print (interface_configs)
# netmiko连接交换机的信息,也可以通过文件读取
dev_info = {
'ip': '192.168.1.1',
'username': 'lixilei',
'password': 'python3',
'device_type': 'huawei'
}
# 通过\n来判断,将interface_configs拆解成一个个列表
config_set = interface_configs.split('\n')
conn = ConnectHandler(**dev_info)
print('已连接到交换机')
output = conn.send_config_set(config_set, cmd_verify=False)
config_save = conn.send_command('save', expect_string=r"\[Y/N\]")
config_save += conn.send_command('y', expect_string=r">")
'''
cmd_verify=False注解:同Netmiko 2不一样,Netmiko 3中默认要等到输入的命令在屏幕上打印出来后才会执行后面的命令
(因为Netmiko 3默认将send_config_set()里的"cmd_verify"参数设为True),
像我们这种一次性对交换机输入多达60多条命令的情况(12个端口要配置),
经常会出现网络延迟的问题导致在执行脚本时Netmiko会返回
“netmiko.sshexception.NemikoTimeoutException:Time-out reading channel, data not available”这个异常
(我们写的代码本身没有问题,这是Netmiko 3自身的一个"bug")
'''
print(output)
五、运行脚本、对比交换机前后的配置
1、查看交换机接口配置
2、运行py脚本
3、回到交换机查看接口配置