配置文件
{
"backup_base_dir":"/etcdBackupData",
"compress": true,
"etcd_zone":[
{
"zone_name": "SZD",
"cluster_ips": "10.25.65.31,10.25.65.32,10.25.65.33",
"ca_name":"/etc/etcd/ssl/SZD/ca.pem",
"cert_name":"/etc/etcd/ssl/SZD/etcd.pem",
"key_name":"/etc/etcd/ssl/SZD/etcd-key.pem",
"max_backup_num":30
},
{
"zone_name": "SHB",
"cluster_ips": "172.25.0.1",
"ca_name":"/etc/etcd/ssl/SHB/ca.pem",
"cert_name":"/etc/etcd/ssl/SHB/etcd.pem",
"key_name":"/etc/etcd/ssl/SHB/etcd-key.pem",
"max_backup_num":30
}
]
}
备份脚本
import json
import os
import time
import glob
def backupEtcd(backupBaseDir, etcdZone, needCompress):
zoneName = etcdZone['zone_name']
clusterIps = etcdZone['cluster_ips']
ca = etcdZone['ca_name']
cert = etcdZone['cert_name']
key = etcdZone['key_name']
maxBackupNum = etcdZone['max_backup_num']
endpoints = ""
clusterIpList = clusterIps.split(',')
ipNum = len(clusterIpList)
if ipNum == 1:
endpoints = "https://" + clusterIps + ":2379"
else:
clusterIpList = clusterIps.split(',')
for index, ip in enumerate(clusterIpList):
if index == ipNum - 1:
endpoints += "https://" + ip + ":2379"
else:
endpoints += "https://" + ip + ":2379" + ","
callEtcdctl(backupBaseDir, zoneName, endpoints, ca, cert, key, needCompress, maxBackupNum)
def callEtcdctl(backupBaseDir, zoneName, endpoints, ca, cert, key, needCompress, maxBackupNum):
print("Call Etcdctl Command To Backup Etcd Data...")
timeNow = time.strftime("%Y-%m-%d-%H-%M-%S", time.localtime())
backupDir= backupBaseDir + '/' + zoneName + '/'
backupFileName = backupDir + timeNow + '-' + zoneName.lower() + '-snapshot.db'
command = "export ETCDCTL_API=3;/usr/local/bin/etcdctl " + ' --cacert=' + ca + ' --cert=' + cert + ' --key=' + key + \
' --endpoints=' + '"' + endpoints + '"'\
' snapshot save ' + backupFileName
print("backup command:", command)
if not os.path.exists(backupDir):
os.makedirs(backupDir)
os.system(command)
if needCompress:
compressBackupFile(backupFileName, maxBackupNum)
sortFiles = getSortedByMTime(backupBaseDir+zoneName)
curFileNum = len(sortFiles)
while curFileNum > maxBackupNum:
print("delete file:", sortFiles[curFileNum-1])
os.remove(sortFiles[curFileNum-1])
curFileNum = curFileNum - 1
def compressBackupFile(fileName, maxBackupNum):
compressCMD="tar -cvzf " + fileName + ".tar.gz " + fileName
print("compress cmd:", compressCMD)
os.system(commandCMD)
os.remove(fileName)
def getSortedByMTime(path, reverse=True):
return sorted(glob.glob(os.path.join(path, '*')), key=lambda x: time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(os.path.getmtime(x))), reverse=reverse)
def main():
with open("config.json",'r') as f:
config = json.loads(f.read())
backupBaseDir = config['backup_base_dir']
needCompress = config['compress']
etcdZoneArr = config['etcd_zone']
for etcdZone in etcdZoneArr:
backupEtcd(backupBaseDir, etcdZone, needCompress)
if __name__ == "__main__":
main()