除了免费赠送可挂载的50G Block Storage之外,Snapshots可能也是吸引我使用Vultr的原因。虽然我一直没有从快照中还原过2333(但是好歹有个心理安慰是不是)
注意,默认情况下最多创建11个Snapshots!!!!
可能是因为本人搜索姿势不对吧,使用“vultr snapshot script”在Google中只搜索到 Automated Snapshots 这一个使用PHP写的脚本。但是为了系统安全,我在php.ini
中禁用了“shell_exec”等方法。同时,该PHP脚本只能在Vultr主机上运行且只对当前机器进行备份。
所以自己模仿着这个脚本写了一下Python3的版本,全部脚本如下,你也可以到Gist上查阅:Rhilip/vultr-snapshot
import re
import time
import datetime
import requests
# -------------用户设置 开始-------------- #
# 填写Vultr的API KEY
API_KEY = ""
# 请填写服务器主IP地址或者SUBID,(二选一即可)
MAIN_IP = "1.2.3.4"
SUBID = None
BACKUP_TAG_PREFIX = "auto_backup" # 备份头
MAX_NUM_OF_BACKUPS = 3 # 最大备份数
# -------------用户设置 结束-------------- #
# Get base info
api_endpoint = "https://api.vultr.com/v1/"
day = time.strftime("%Y-%m-%d", time.localtime())
# simple wrapper to access vultr api
def vultr(method = "GET",action = "" , data = None):
return requests.request(method,"{}{}".format(api_endpoint,action),headers = {"API-Key" : API_KEY}, data=data)
server_list = vultr("GET","server/list").json()
# Find subid if not set.
if SUBID == None:
for server_subid,server_info in server_list.items():
if server_info.get("main_ip", None) == MAIN_IP:
SUBID = server_subid
break
if SUBID == None:
raise Exception("Fail to find subid for IP: {}".format(MAIN_IP))
snapshot_list_raw = vultr("GET","snapshot/list").json()
# Resort the raw snapshot list dict to list obj
snapshot_list = [v for k,v in snapshot_list_raw.items()]
# Get auto-backup snapshot list
backup_snapshot_list = list(filter(lambda x:re.search("{}-{}".format(BACKUP_TAG_PREFIX,SUBID),x["description"]),snapshot_list))
# Remove old auto-backup-snapshot
if len(backup_snapshot_list) >= MAX_NUM_OF_BACKUPS:
to_remove_snapshot_list = sorted(backup_snapshot_list,
key = lambda k:datetime.datetime.strptime(k["date_created"],"%Y-%m-%d %H:%M:%S")
)[:-MAX_NUM_OF_BACKUPS]
for s in to_remove_snapshot_list:
vultr("POST","snapshot/destroy",{"SNAPSHOTID": s["SNAPSHOTID"]})
# create New auto-backup-snapshot
vultr("POST","snapshot/create",{"SUBID": SUBID,"description": "{}-{}-{}".format(BACKUP_TAG_PREFIX,SUBID,day)})
完整食用方法如下
- 到
Account->API
上申请API TOKEN并在下方Access Control
中添加允许访问的主机,一般来说,如果你申请了VPS的IPv6地址,可以添加该IPv6地址。 在主机上安装python3以及使用pip安装requests库。
apt install python3 python3-pip pip3 install requests
- 创建脚本并修改用户设置项。其中
MAIN_IP
与SUBID
只需要写一个就行,(SUBID优先使用,当SUBID未提供的使用使用MAIN_IP从Vultr API中获取) 测试运行并检查有没有出错,如果运行成功,应该可以看到一个Snapshot正在创建
python3 /home/user/scripts/vultr_auto_snapshot.py
使用Crontab定时运行(每天0点)
0 0 * * * /usr/bin/python3 /home/user/scripts/vultr_auto_snapshot.py
来参观一下,欢迎回访~