笔者是一个北漂小网工,将围绕一个甲方网络的身份,去做一些分享,随时太监!!!!!!!!
经历了数次python从放弃到入门后,有幸看到 @弈心 大佬的《网络工程师的Python之路》一书,后结合 @朱嘉盛大佬的文章,正式踏入‘入门‘门槛。
学习python的好处就不多说了,但作为一个“甲方”小网工,除了提升自己、提升运维效率之外,还有一个至关重要的东西,那就是绩效!!!!
而学习python自然就成了一个不仅能提升自己,还能拿得出手的“绩效”~~~~(公众号:释然IT杂谈)
但对于从没学过编程的‘老网工’,入门谈何容易!
即便有知乎各位大佬的文章,但结合现在国内甲方网络的现状,1000/2000人的企业,甚至3000/4000人的企业只有一个网工!而且不仅如此!!!!
除了网络之外,你甚至还得实不实的客串IT桌面、服务器运维、甚至行政的工作(新办公区弱点施工)等等,这里可能大家觉得夸张,我举个例子:
老板网络不好了,我们的桌面‘真兄弟’搞不定,你得人肉吧(去了以后发现挂的代理没关、DNS被浏览器篡改,此处致敬我的‘真兄弟‘);
所以说有时候真不是自己笨导致的不断‘从入门到放弃’,这里我分享一下我的学习过程。(公众号:释然IT杂谈)
4、自动备份多品牌网络设备配置 - 图2

进入正题:

我总结的经验就是,如果你实在没有条件静下心学习(或者懒),那可以参考我的学习过程:
从学会改脚本开始!!!改着改着就会了~~~~
笔者的分享,尽可能做到不仅是单纯的python脚本,而是能变成老板眼中的‘绩效工具’。(公众号:释然IT杂谈)
内容也尽可能简单粗暴,大家只需要仔细看需要修改的部分即可,但要求大家有一定的服务器基础。
4、自动备份多品牌网络设备配置 - 图3

概述:

1、定期完成网络设备备份
2、不同品牌网络设备(基于ssh)
3、备份结果,企业微信通知 (补充部分)
4、考虑到配置备份对时效性要求不高,暂不加入并发,后续自动查找mac的功能我会加上并发模块,有兴趣的可以自行添加。(公众号:释然IT杂谈)

基础环境:

(ps:小编是windwos上测试,原文是linux可以结合自身环境来做)

脚本运行环境:win10
python环境:python3,模块:netmiko (安装教程网上一大堆,这里不赘述)
网络设备:cisco,华为、H3C、juniper(示例,其他品牌可自行添加)

代码解析:

废话不多说,上代码。

1、完整代码

  1. import netmiko
  2. from netmiko import ConnectHandler
  3. import time
  4. import os
  5. today = time.strftime("%Y-%m-%d", time.localtime())
  6. switch_with_authentication_issue = [] # 存放认证失败的设备信息
  7. switch_not_reachable = [] # 存放网络不通的设备信息
  8. def ssh_session(devlist): ##定义备份函数
  9. try:
  10. list = line.split(",")
  11. hostname = list[0]
  12. hostname = str(list[0])
  13. devtype = list[1]
  14. ip = list[2]
  15. admin = list[3]
  16. devpasswd = list[4].replace('\n','') #去除换行符
  17. conn = ConnectHandler(device_type=devtype,
  18. host=ip,
  19. username=admin,
  20. password=devpasswd,
  21. )
  22. time.sleep(1)
  23. print(f'已成功登陆交换机{hostname}')
  24. if devtype == 'hp_comware': ##H3C
  25. output = conn.send_command_timing('screen-length disable\n dis cu ')
  26. print(output) ###测试使用,测试完成后建议注释
  27. elif devtype == 'huawei': ##华为
  28. output = conn.send_command_timing('screen-length 0 temporary\n dis cu')
  29. print(output) ###测试使用,测试完成后建议注释
  30. elif devtype == 'juniper_junos': #juniper
  31. output = conn.send_command_timing('show configuration | display set | no-more')
  32. print(output) ###测试使用,测试完成后建议注释
  33. elif devtype == 'cisco_ios': #cisco
  34. output = conn.send_command_timing(' terminal length 0 \n show running-config ')
  35. print(output) ###测试使用,测试完成后建议注释
  36. conn.disconnect()
  37. logname = "C:/Users/Administrator/Desktop/py_Study/net_Pthon/py工具/config_log/" + today + "/" + hostname + "_" + today + ".log" #定义备份文件名
  38. time.sleep(2)
  39. try: ###创建日期文件夹
  40. os.mkdir("C:/Users/Administrator/Desktop/py_Study/net_Pthon/py工具/config_log/" + today + "/")
  41. except OSError:
  42. pass
  43. wr = open(logname, 'a' or 'w')
  44. wr.write(output)
  45. wr.close()
  46. except netmiko.NetmikoAuthenticationException: ##防止中间某台设备无法登录或不可达等因素导致进程中断
  47. print(hostname + "用户验证失败!")
  48. switch_with_authentication_issue.append(ip)
  49. except netmiko.ssh_exception.NetmikoTimeoutException:
  50. print(hostname + "目标不可达!")
  51. switch_not_reachable.append(ip)
  52. # except paramiko.ssh_exception.AuthenticationException: ###不同品牌设备可能报错不同,自行添加即可
  53. # print(hostname + "用户验证失败!")
  54. # switch_with_authentication_issue.append(ip)
  55. devlist = open('C:/Users/Administrator/Desktop/py_Study/net_Pthon/py工具/devlist.txt', 'r') # 建议填写全路径,使用crontab可能会出问题
  56. for line in devlist.readlines(): ##循环
  57. ssh_session(line)
  58. # (公众号:释然IT杂谈)
  59. print('\n ====结果输出====')
  60. print('·下列交换机用户验证失败:')
  61. for i in switch_with_authentication_issue:
  62. print(f" {i}")
  63. print('·下列交换机不可达:')
  64. for i in switch_not_reachable:
  65. print(f" {i}")

2、操作步骤

2.1、创建存放脚本目录
4、自动备份多品牌网络设备配置 - 图4
2.2、创建存放备份日志的文件夹

4、自动备份多品牌网络设备配置 - 图5
2.3、创建存放网络设备信息的txt文件

4、自动备份多品牌网络设备配置 - 图6
列表格式:设备名,设备类型,IP,用户名,密码

建议设备名标注IP信息,因笔者脚本备份文件名中不含有IP字段;或添加IP字段均可。
2.4、创建脚本(建议先看下一步,编辑完成脚本,直接复制即可)
4、自动备份多品牌网络设备配置 - 图7
2.5、设置设备类型

目前包含华为、华三、juniper,其他类型可根据格式自行添加
output = conn.send_command_timing(‘screen-length disable\n dis cu ‘)
引号‘’内为:不分页输出及查看全局命令,如命令不同,自行修改即可。\n为换行符4、自动备份多品牌网络设备配置 - 图8
2.6、设置配置存放位置
每日配置存放于单独日期文件夹
文件夹格式名称:hostname+日期.log 例:h3c_2022-03-18.log
如无特殊需求,修改路径即可。(替换C:\Users\Administrator\Desktop\py_Study\net_Pthon\py工具\config_log 为真实路径 )
4、自动备份多品牌网络设备配置 - 图9
2.7、循环执行

同上,修改路径及文件名即可。
4、自动备份多品牌网络设备配置 - 图10

3、脚本执行

因测试环境有cisco和华为设备,所以思科华为会显示登录成功
如无登录失败且无中断,及脚本运行成功。
4、自动备份多品牌网络设备配置 - 图11
查看备份结果:
4、自动备份多品牌网络设备配置 - 图12
到这里,恭喜你,脚本已经完成了99%
脚本定时任务:

在win10桌面左下角搜索框中输入“任务计划程序”,按下键盘上的回车键。4、自动备份多品牌网络设备配置 - 图13

在操作选择创建基本任务
4、自动备份多品牌网络设备配置 - 图14
4、自动备份多品牌网络设备配置 - 图154、自动备份多品牌网络设备配置 - 图164、自动备份多品牌网络设备配置 - 图17

这里编写个bat脚本,用于运行python自动备份脚本

4、自动备份多品牌网络设备配置 - 图184、自动备份多品牌网络设备配置 - 图19

测试查看:
4、自动备份多品牌网络设备配置 - 图20
附加功能:

附加功能:备份结果通知(企业微信)

为什么用企业微信呢?因为可以推到个人微信上面,说实话下班以后我是不愿意多看企业微信的。
笔者这里是用的企业微信自定义程序的API功能(公众号:释然IT杂谈)
(有小伙伴私信我说可以用webhook机器人功能,我对比过后,暂时感觉只是呈现方式不一样,大家可根据喜好自行添加,后续有脚本用到报警,我会尝试使用webhook机器人功能)
1、联系企业微信管理员,创建应用
4、自动备份多品牌网络设备配置 - 图21
4、自动备份多品牌网络设备配置 - 图22
4、自动备份多品牌网络设备配置 - 图23

2、查看应用参数
4、自动备份多品牌网络设备配置 - 图24
4、自动备份多品牌网络设备配置 - 图25
3、个人微信接收企业微信信息
4、自动备份多品牌网络设备配置 - 图26
4、py脚本添加如下配置

import urllib
import urllib.request
import json

agentid = '10______'  # 应用id 查看企业微信后台
corpid = 'ww2323__________________'  # 企业微信corpid
corpsecret = 'NUIv_____________________________'  # 应用的secret


def wxbj(wxuser, txt):  
    # get tocken
    gettoken_url = 'https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=' + corpid + '&corpsecret=' + corpsecret
    token_file = urllib.request.urlopen(gettoken_url)
    token_data = token_file.read().decode('utf-8')
    token_json = json.loads(token_data)
    my_token = token_json['access_token']

    # send wechart
    touser = wxuser  # many user: 'zhangsan|wangwu'
    content = txt  # content
    post_content = {
        "touser": touser,
        "agentid": agentid,
        "msgtype": "text",
        "text": {
            "content": content,

        }
#(公众号:释然IT杂谈)
    }
    json_content = json.dumps(post_content).encode("utf-8")
    #json_content = urllib.parse.urlencode(post_content).encode("utf-8")
    url = 'https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=' + my_token
    response = urllib.request.urlopen(url,json_content)
    print(response.read().decode('utf-8'))

###以下部分,加入到脚本最后
faillist = str(switch_with_authentication_issue +  switch_not_reachable)#.encode(encoding='UTF8')
ii = "网络设备备份失败" + faillist
if '.' in faillist:
    ii = "网络设备备份失败" + faillist
    wxbj("name",ii)  #### name 为企业微信账号用户名
else:
    wxbj("name", "备份成功")

5、效果

4、自动备份多品牌网络设备配置 - 图27