在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不通就跳过,继续往下循环列表
因为无法联系到作者,只能在此表示感谢!