在linux系统上写了个脚本,然后再写一个crontab定时任务,每天凌晨运行备份网络设备配置。

脚本内容在此备份一下。

我们用的是python中非常有名的netmiko库。大体的思路就是将设备的IP地址和用户名密码写在json文件里,然后用脚本去读取设备IP地址的json文件并进行循环,然后登录到设备上执行show run命令并将输出保存为文件。

然后格式化输出当天的日期,利用OS库进行判断是否有以当天日期命名的文件夹,如果没有就创建以当天日期命名的文件夹并将show run 的文件保存到文件夹下,如果有此文件夹就跳过创建文件夹,并将文件保存到对应的文件夹下。

当然,crontab任务是执行完py脚本后,还有一条脚本是将文件夹打包后传到阿里云的OSS中。

crontab记录如下(注:date命令中的%需要进行转义):

30 1 * * * source /root/miniconda3/bin/activate python3test && python3 /root/python-program/backup_program/backup.py
00 2 * * * tar -cvf /root/backup/`date +\%Y-\%m-\%d`.tar /data/backup/`date +\%Y-\%m-\%d`/* >> /root/backup/`date +\%Y-\%m-\%d`.log && /usr/bin/ossutil64 cp -r /root/backup/`date +\%Y-\%m-\%d`.tar oss://haier-ommp-cloud-config/backupcfg/ >> /root/backup/`date +\%Y-\%m-\%d`.log


备份脚本如下:

(注:后期其实可以更进一步优化,将设备列表和用户名密码之类的整理为excel,然后读取excel中的内容;或者直接写到数据库里,然后搭个web框架,后续的设备列表直接在web界面进行修改,修改后的数据库能被python脚本读取,就更方便了。再再再最后,web跟CMDB系统打通,CMDB更新了数据后,直接就同步到此数据库的相应数据,然后脚本备份读数据库的内容的时候也会直接进行更新)

#! /usr/bin/env python3

from netmiko import ConnectHandler             #导入netmiko库
from pythonping import ping
import os
import time
import json
def cisco_ios (ip,username,password,secret):    #定义cisco_ios函数
    cisco = {
        "device_type":"cisco_ios",  #设备类型为“cisco_ios”
        "ip":ip,                    #传入ip参数
        "username":username,        #传入登陆用户名
        "password":password,        #传入登陆密码
        "secret":secret             #传入sceret密码
    }
    connect = ConnectHandler(**cisco)      #对不同品牌设备的预定义的内容。这个地方建议看一下源码,我这一句话解释不太清楚。
    if ip == "10.163.0.109" or ip == "10.163.0.110":  #这里是判断是否防火墙的地址,如果是防火墙,需要用terminal pager 0,不是terminal lenth 0
        connect.enable()
        connect.send_command("terminal pager 0")
    elif ip == "10.163.1.20":             #这个地址需要先enable
        connect.enable()
        connect.send_command("terminal lenth 0")

    command = ["show run"]         #执行show run 命令。此列表可以加入多条命令
    full_config = ""
    for cmd in command:
        config = connect.send_command(cmd)
        full_config += config
    return full_config
    connect.disconnect()

now = time.strftime("%Y-%m-%d", time.localtime())        #定义时间格式,备份文件名用到

if __name__ == "__main__":

    path = f"/data/backup/{now}"                #创建当天的备份文件夹
    if not os.path.exists(path):
        os.mkdir(path)

    program_path = "/root/python-program/backup_program/"
    dc = ["bjdeep","bju+ai"]           #json格式的数据中心的设备IP列表
    for name in dc:
        filehost = program_path+name+"host.json"
        userpasswd = program_path+name+"userpas.json"
        with open(filehost) as fHost:       #打开host.json文件
            jsonhost = json.load(fHost)
            hostlist = jsonhost["host"]     #把主机列表赋值给hostlist

        with open(userpasswd) as fUser:     #从文件中读取用户名和密码
            jsonuser = json.load(fUser)
            username = jsonuser["username"]
            password = jsonuser["password"]

        for ip in hostlist:          #循环主机列表,保存配置
            result = ping(ip)        #IP地址能ping通,就执行,如果ping不通,就跳过此IP
            if "Reply" in str(result):
                conf = cisco_ios(ip, username, password, password)
                nowtime = time.strftime("%Y-%m-%d-%H%M%S", time.localtime())
                with open(f"/data/backup/{now}/cfg_bak_{ip}_{nowtime}.txt", mode="a") as f1:
                    f1.write(conf)         #保存到文件中
                time.sleep(5)         #每个IP之间等待5秒,给系统点反应时间
            else:
                continue             #IP地址ping不通就跳过,继续往下循环列表


对netmiko的使用启发来自于公众号:https://mp.weixin.qq.com/s?__biz=MzUxODgzMDQ4NQ==&mid=2247513444&idx=2&sn=8901146b16caaa09040f531f2a6c176f&chksm=f980159ecef79c8851eb975055d0d3d29d39b4ca79eb3ee663aff9c123e1f70a3ec06b0ad50a&scene=27

因为无法联系到作者,只能在此表示感谢!