银狐DevNet-网络运维Python初篇(三)openpyxl读取excel信息,批量抓取设备配置

银狐DevNet-网络运维Python初篇(三)openpyxl读取excel信息,批量抓取设备配置

近期确实太忙碌,一直没有更新,很抱歉。

1、训练场景:读取excel大量设备信息,根据得到的信息进行批量操作

上一个章节我们举了一个简单的案例,利用netmiko抓取单台思科设备的配置,现实情况我们不会对1台设备进行操作,那样的话就不需要自动化了。网上有很多教程,教大家用for循环读取txt文档内容,这种方式也确实可以。

不过有些企业有自己的CMDB系统,支持API调用或者excel导出,所以本章内容就以excel内容为例,总归类似的内容相对较少。

2、实验环境:

操作系统:windows 10 PC机

python版本:python 3.8

网络设备:华为CE 6865

编辑器:vscode(pycharm、sublime均可,推荐vscode)

excel格式:初次使用简单一些,excel中只加入IP地址

3、思路分析

使用python第三方库openpyxl读取设备IP地址,并形成一个IP地址的list,这里需要注意第一行是表头,所以要从第二行开始读取。拿到所有设备IP地址列表后进行for循环对每台设备进行SSH连接(netmiko),然后发送CLI命令,并打印出来。

4、整体代码

#!/usr/bin/env python
#coding: utf-8

from netmiko import ConnectHandler
from openpyxl import Workbook
from openpyxl import load_workbook

def read_device_excel( ):

    ip_list = []
    
    wb1 = load_workbook('/home/netops/venv/cs_lab.xlsx')
    ws1 = wb1.get_sheet_by_name("Sheet1")
    
    for cow_num in range(2,ws1.max_row+1):

        ipaddr = ws1["a"+str(cow_num)].value
        ip_list.append(ipaddr)
            
    return ip_list

def get_config(ip_list):
    
    for ipaddr in ip_list:

        session = ConnectHandler(device_type="huawei",
                                ip=ipaddr,
                                username="dev_user",
                                password="dev_password",
                                banner_timeout=300)

        print("connecting to "+ ipaddr)
        print ("---- Getting HUAWEI configuration from {}-----------".format(ipaddr))

        config_data = session.send_command('dis ip int brief ')
        
        print (config_data)
        session.disconnect()


def main():
    ip_list = read_device_excel()
    get_config(ip_list)

#-------------------------------------------------------    
if __name__ == '__main__':
    main()


5、代码详解

#!/usr/bin/env python
#coding: utf-8

from netmiko import ConnectHandler
from openpyxl import Workbook
from openpyxl import load_workbook

导入netmiko和openpyxl模块就不多说了,大家都懂。


def read_device_excel( ):

    ip_list = []
    
    wb1 = load_workbook('/home/netops/venv/cs_lab.xlsx')
    ws1 = wb1.get_sheet_by_name("Sheet1")
    

1、创建read_device_excel函数,因为我们需要一个IP地址的列表,所以先创建一个空list。

2、调用openpyxl穿件workbook对象,用于创建workbook并复制给wb1,workbook1内的sheet1赋值给ws1(Sheet1也是默认sheet)。

    for cow_num in range(2,ws1.max_row+1):

        ipaddr = ws1["a"+str(cow_num)].value
        ip_list.append(ipaddr)
            
    return ip_list

3、A列第一行可以用A1表示,A1的value属性就是单元格里的内容,比如A1=IP,A2=10.23.80.93,现在我们想遍历出所有IP地址,就要用for循环遍历A列所有内容,这里要注意,第一行我们是不需要的,所以我们真正要遍历的是2-5行,可以使用ws1.max_row得到最大值,这里max_row =5,range的(2,5)其实=2,3,4,这样最后一行就抓不到了,所以要max_row+1,确保第一行所有IP都能抓到。

4、最后把ip列表retrun出来(传递出来)

def get_config(ip_list):
    
    for ipaddr in ip_list:

        session = ConnectHandler(device_type="huawei",
                                ip=ipaddr,
                                username="dev_user",
                                password="dev_password",
                                banner_timeout=300)

        print("connecting to "+ ipaddr)
        print ("---- Getting HUAWEI configuration from {}-----------".format(ipaddr))

        config_data = session.send_command('dis ip int brief ')
        
        print (config_data)
        session.disconnect()

5、创建一个get_config的函数,并把上面的ip_list传递进来进行for循环。

6、针对没一个IP地址进行SSH登录,并用print提示我们正在登录哪个设备。

7、直接使用send_command方法发送CLI命令。

8、打印交换机返回的结果,并关闭session。

def main():
    ip_list = read_device_excel()
    get_config(ip_list)

#-------------------------------------------------------    
if __name__ == '__main__':
    main()

为了代码更加清晰,创建了1个主函数main(),并分别调用读取excel函数和getconfig函数。

*SSH也可以单独写成一个函数,get_config内部调用SSH函数,这种方式更灵活。


代码直接复制粘贴并执行就能看到效果,下期还会在此基础上加深python在运维场景的使用。

编辑于 2021-09-02 10:01