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地址
[图片上传失败...(image-bed0b-1621266802456)]
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()
执行结果:
image5、代码详解
#!/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函数,这种方式更灵活。
网友评论