【实用】python网络运维工具包

admin 2021年12月15日03:53:42评论131 views字数 7685阅读25分37秒阅读模式

加群交流在后台回复“加群”,添加小编微信,小编拉你进去


后台回复“724”获取入门资料


这是群里大佬Lindh08分享的实用脚本,支持多厂商的设备配置文件备份,也支持自定义配置,修改密码模块有点完善,感兴趣的小伙伴可以运行测试,也可以在此基础进行完善。


代码如下:

import osimport timefrom datetime import datetimeimport getpassimport reimport sysfrom netmiko import ConnectHandlerfrom netmiko.ssh_exception import NetMikoTimeoutExceptionfrom netmiko.ssh_exception import AuthenticationExceptionfrom paramiko.ssh_exception import SSHExceptionimport geventfrom gevent import spawnfrom gevent import monkey;monkey.patch_all()from gevent.pool import Poolfrom openpyxl import Workbookfrom openpyxl import load_workbook
###################################################################################################### v1.2.0 2021.4.29 新增进度条显示功能# v1.3.0 2021.4.30 新增华为设备模块# v1.4.0 2021.5.6 新增锐捷AC模块# v1.5.0 2021.5.7 1.新增"点击回车键"退出程序功能# 2.打包封装程序并增加图标# v2.0.0 2021.6.2 重构代码框架,后续可模块化添加设备和任务类型# v2.0.1 2021.6.3 细微调整结构框架# v3.0.0 2021.6.5 1.将原先多线程方式运行改为用gevent协程方式运行# 2.修改flag信息# 3.任务99名称修改为"自定义操作"# 4.取消进度条显示,改为实时任务进度显示# v3.1.0 2021.6.6 1.重构函数,增加报错输出。# 2.修复get_config中锐捷的output变量bug# v3.2.0 2021.6.8 1.读取文件形式由txt改成excel# v3.2.1 2021.6.16 增加特权密码# v3.2.2 2021.6.17 1.修复进入特权bug# 2.增加ASA设备# 3.修复ASA有failover创建文件bug# v3.2.3 2021.6.18 修改H3C登录bug#####################################################################################################
print('****************************************************')print('*Welcome!This program designed by Lindh08. *')print('*Please contact me by E-mail.Add:[email protected]. *')print('****************************************************')
dev_type = input("请选择设备类型:n1.Ciscon2.Ruijien3.Ruijie_ACn4.H3Cn5.Huawein6.Cisco-ASAn请输入序号: ")print('******************************************')task = input("请选择想要运行的脚本类型:n1.备份配置n2.修改密码n99.自定义操作n请输入序号: ")print('******************************************')
username = input('Username: ')password = getpass.getpass('Password: ')secret = getpass.getpass('Secret: ')
###################################################################################################### 1.1判断模块###################################################################################################### 1.1.1判断设备类型#####################################################################################################if int(dev_type)==1: # Cisco设备 dev_type_brand = "cisco" dev_type_str = "cisco_ios"elif int(dev_type)==2: #锐捷路由器或者交换机设备 dev_type_brand = "ruijie" dev_type_str = "ruijie_os"elif int(dev_type)==3: #锐捷AC dev_type_brand = "ruijie_AC" dev_type_str = "ruijie_os"elif int(dev_type)==4: #H3C设备 dev_type_brand = "H3C" dev_type_str = "hp_comware"elif int(dev_type)==5: #华为设备 dev_type_brand = "Huawei" dev_type_str = "huawei"elif int(dev_type)==6: #Cisco-ASA dev_type_brand = "ASA" dev_type_str = "cisco_asa_ssh"#elif int(dev_type)==x: #后续添加设备# dev_type_brand = "xxxx"# dev_type_str = "xxxx"###################################################################################################### 1.1.2判断任务类型#####################################################################################################if int(task)==1: #备份配置 task_type = "bak"elif int(task)!=1: if int(task)==2: #修改密码 task_type = "pwd" #elif int(task)==x: #后续可添加模块 elif int(task)==99: #其他操作 task_type = "other"###################################################################################################### 1.2函数模块###################################################################################################### 1.2.1会话连接#####################################################################################################def get_config(ip):
dev = {'device_type':dev_type_str, 'host':ip, 'username':username, 'password':password, 'secret':secret, }
ssh_session = ConnectHandler(**dev) get_hostname = ssh_session.find_prompt().replace("#","").replace("<","").replace(">","").replace("/","-") print(f"---- 正在连接: {get_hostname}({ip.strip()}).") # 判断任务类型输入命令 if int(task)==1: #备份配置 if int(dev_type)==1 or int(dev_type)==2 or int(dev_type)==3 or int(dev_type)==6: # Cisco设备 ssh_session.enable() command = ("sh run") output = ssh_session.send_command(command) elif int(dev_type)==4 or int(dev_type)==5 : # 华为设备 command = ("dis cur") output = ssh_session.send_command(command) elif int(task)!=1: cmdlist = open(f'cmd\{int(task)}.{task_type}\{task_type}_cmd_{dev_type_brand}.txt','r') cmdlist.seek(0) output = ssh_session.send_config_set(cmdlist.readlines()) output += ssh_session.save_config()
return output,get_hostname
###################################################################################################### 1.2.2输出配置信息#####################################################################################################def output_log(output,get_hostname):
now = datetime.now() date= "%s-%s-%s"%(now.year,now.month,now.day) config_path = f'log\{int(task)}.{task_type}\{task_type}'+date verify_path = os.path.exists(config_path) if not verify_path: os.makedirs(config_path)
config_filename = f'{config_path}\{get_hostname}_{date}.txt' print ('---- 正在写入输出文件: ', config_filename) with open( config_filename, "w",encoding='utf-8' ) as config_out: config_out.write(output)
###################################################################################################### 1.2.3检查问题设备#####################################################################################################def output_issue_device(issue_device):
now = datetime.now() date= "%s-%s-%s"%(now.year,now.month,now.day) time_now = "%s-%s"%(now.hour,now.minute) config_path = 'log\issue_device\'+'issue_'+date verify_path = os.path.exists(config_path)
if not verify_path: os.makedirs(config_path)
config_filename = f'{config_path}\issue_{date}_{time_now}.txt'
print ('---- 正在写入问题设备: ', config_filename) with open (config_filename, "a", encoding='utf-8') as issue_facts: issue_facts.write('n'.join(issue_device)+'n')
###################################################################################################### 1.2.4运行读取ip#####################################################################################################def read_device(): ip_list = []
wb = load_workbook(f'lists\ip_list.xlsx') ws = wb[dev_type_brand]
for cow_num in range(2,ws.max_row+1): ip = ws["a"+str(cow_num)].value ip_list.append(ip)
return ip_list
###################################################################################################### 1.2.5运行gevent#####################################################################################################def run_gevent(ip): issue_device = []
try: device_config = get_config(ip) output = device_config[0] get_hostname = device_config[1] output_log(output,get_hostname)
except (AuthenticationException): issue_message = (ip + ': 认证错误 ') issue_device.append(issue_message) output_issue_device(issue_device) except NetMikoTimeoutException: issue_message = (ip + ': 网络不可达 ') issue_device.append(issue_message) output_issue_device(issue_device) except (SSHException): issue_message = (ip +': SSH端口异常 ') issue_device.append(issue_message) output_issue_device(issue_device) except Exception as unknown_error: issue_message = (ip +': 发生未知错误: ') output_issue_device(issue_device) issue_device.append(issue_message+str(unknown_error))

###################################################################################################### 1.2.6主函数#####################################################################################################def main(): start_time = time.time() print(f"******************************************") print(f"程序于{time.strftime('%X')}开始执行n") ip_list = read_device() pool = Pool(100) pool.map(run_gevent,ip_list) pool.join() print(f"n程序于{time.strftime('%X')}执行结束") print(f"******************************************") quit_program = input("请按回车键退出: ")
###################################################################################################### 1.3运行程序#####################################################################################################if __name__ == '__main__': main()#####################################################################################################


演示如下:

这里小编把py脚本打包成exe可执行文件来操作,在此以思科设备为例。



脚本文件获取:后台回复“ py网络工具

【实用】python网络运维工具包

【实用】python网络运维工具包

【实用】python网络运维工具包

【实用】python网络运维工具包

本文始发于微信公众号(释然IT杂谈):【实用】python网络运维工具包

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2021年12月15日03:53:42
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   【实用】python网络运维工具包http://cn-sec.com/archives/443930.html

发表评论

匿名网友 填写信息