使用python获取思科交换机信息并分析处理

9,483次阅读
没有评论

和朋友聊起巡检交换机得每台交换机登陆上去执行命令后检查交换机状态, 还有很多分屏, 感觉太浪费时间. 想做个脚本来一键检查交换机信息. 想着自己也看了点 python 入门知识, 加上上网各种搜索, 还真搞出了一个脚本来实现.

查询了下支持思科交换机的库, 发现两个, 一个是 ciscolib 库, 进入库地址发现库作者都已经放弃治疗了, 另一个是 netmiko, 这个库作者还一直有维护, 而且已经收录进入 python 官方库了. 首先安装 netmiko 库, pip install netmiko, 官方说明文档:https://pynet.twb-tech.com/blog/automation/netmiko.html

代码内容:

#!/usr/bin/env python
#-*- coding:utf-8 -*-
#Date:2018/4/24
#Created by Winters
#Blog:https://www.8win.net
from netmiko import ConnectHandler
import re
import time
# 定义单次循环内容
def cisco(ip):
    " 思科交换机配置导出 "
    cisco_switch = {
        'device_type': 'cisco_ios', #设备类型
        'ip': ip, #设备 IP, 这里我们使用的是变量, 方便循环
        'username': 'user', #登陆用户名
        'password': 'password', #登陆密码
        'port': 22, #登陆端口, 默认 22
        'secret': 'killer2012', #enable 密码
        'verbose': False,# 是否详细报告, 默认否
    }
    net_connect = ConnectHandler(**cisco_switch) #连接到交换机
    net_connect.enable() #进入特权模式
    #交换机需要执行的命令
    commands = [
        'show interfaces',
    ]
    #处理获取的命令结果,去除 GigabitEehernet0/ 1 之前的 VLAN 接口数据,并保存为 txt 文件
    timestr = time.strftime('%Y-%m-%d', time.localtime(time.time()))
    for cmd in commands:
        filename = u'%s_%s_%s.txt' % (ip, cmd.replace(' ', '_'), timestr)
        save = open(filename, 'w')
        result = net_connect.send_command(cmd)
        result1 = result.split('GigabitEthernet0/1 is')[1:]
        save.write('GigabitEthernet0/1 is')
        save.write("".join(result1))
    net_connect.disconnect()
    #处理保存的 txt 文件,提取 interface num,input errors,output errors 等数据并保存为 txt 文件
    filename2 = u'%s_%s_%s_%s.txt' % (ip, cmd.replace(' ', '_'), timestr,'list')
    filename = u'%s_%s_%s.txt' % (ip, cmd.replace(' ', '_'), timestr)
    save2 = open(filename2,'w')
    save1 = open(filename, 'r').read()
    intnum = re.compile(r'GigabitEthernet0/\d{1,2}')
    inputerrors = re.compile(r'\d+.input errors')
    outputerrors = re.compile(r'\d+.output errors')
    crclog = re.compile(r'\d+.CRC')
    interface = re.findall(intnum,save1)
    input = re.findall(inputerrors,save1)
    output = re.findall(outputerrors,save1)
    crc = re.findall(crclog,save1)
    for int in zip(interface,input,output,crc):
        s = str(int)
        s1 = s.replace(')',')\n')
        save2.write(s1)
# 循环处理 ips 变量中的多交换机,每个 IP 一行
if __name__ == '__main__':
    ips = [
        '192.168.0.1', #交换机 1IP 地址
        '192.168.0.2', #交换机 2IP 地址
    ]
    for ip in ips:
        cisco(ip)

 

代码执行的结果是保存在交换机上特权模式执行 show interfaces 命令所得到的信息, 并进行进一步处理:

1. 去除 VLAN 接口信息, 仅保留物理接口信息. 并按 IP_命令_日期格式保存为文本文件.

2. 从保存的文件中提取 interface 端口号,input errors,output errors,CRC 等信息并另存一个文本文件.

Winter
版权声明:本站原创文章,由 Winter 2018-04-27发表,共计2516字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
评论(没有评论)
验证码
载入中...