Python:腾讯云-轻量应用服务器-实现自动快照

2024-04-19 17:20

本文主要是介绍Python:腾讯云-轻量应用服务器-实现自动快照,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Python:腾讯云-轻量应用服务器-实现自动快照 – WhiteNight's Site

先说一下配置情况:轻量应用服务器+一块系统盘。我没钱加盘,所以不知道多块盘的情况下这个脚本还能不能用。

官方文档给的代码已经很齐全了,只需要做点补充就能直接用。

至于为什么要写这么个脚本?主要是轻量应用服务器的快照配额就两个,每次备份快照都是-删快照-新建快照这么个流程。而且如果你和我一样每周甚至每天都要备份个快照,那每次备份快照都要登陆,然后点这点那的,还是蛮麻烦的。所以不如写个自动化脚本,一条命令搞定快照。

密钥

小心使用

API访问密钥链接:https://console.cloud.tencent.com/cam/capi

考虑到密钥实际上相当于“登陆”,泄漏密钥和把账号拱手送人没多大区别,所以这东西还是小心保管比较好。

获取快照列表

传id和key

这块官方文档都给全了,只需要做些小修改就行。

考虑到我们只需要获取快照列表,所以我删去了一些用不上的代码。又考虑到直接在代码中保存id和key不太安全,所以我选择通过外部传参数的方式去给出id和key。

同时或者client的时候需要指定Region,Region参数的说明如下。

用logging纯属个人兴趣了,直接用print也行。

Python

def parse():parser = argparse.ArgumentParser('TencentCloud_Lighthouse_AutoSnapshot',description='腾讯云lighthouse自动快照脚本')parser.add_argument('--id',help='密钥ID')parser.add_argument('--key',help='密钥KEY')parser.add_argument('--server_id',help='服务器的实例ID')parser.add_argument('--mode',default='info',help='日志级别,默认info,可选debug')parser.add_argument('--snapshot_mode',default='None',help='快照模式,默认None,可选delete,create')return parser.parse_args()def get_snapshot_list(id,key):try:cred = credential.Credential(id, key)client = lighthouse_client.LighthouseClient(cred, "ap-guangzhou")req = models.DescribeSnapshotsRequest()params = {}req.from_json_string(json.dumps(params))resp = client.DescribeSnapshots(req)logging.debug(resp.to_json_string())logging.info('获取快照列表成功')return resp,clientexcept TencentCloudSDKException as err:logging.error('获取快照列表失败')logging.error(err)return None,None

删除快照

根据快照id删除

轻量应用服务器-删除快照:https://cloud.tencent.com/document/product/1207/54389

官方文档也写了,删快照需要传入被删除快照的id,这也是为什么要先去获取快照列表。

一般来说,删快照删的是最老的那个,所以还要给快照的创建时间排个序,再筛选出最老的那个快照。其他的和获取快照列表的代码都差不多。

Python

def choose_snapshot(snapshot_list):# 选择最老的快照SnapshotSet=snapshot_list.SnapshotSetSnapshotSet.sort(key=lambda x:x.CreatedTime)logging.info('选择最老的快照:{}'.format(SnapshotSet[0].SnapshotId)+' 创建时间:{}'.format(SnapshotSet[0].CreatedTime))return SnapshotSet[0].SnapshotIddef delete_snapshot(client:lighthouse_client.LighthouseClient,snapshot_id:str):try:logging.info('删除快照:{}'.format(snapshot_id))req=models.DeleteSnapshotsRequest()params={'SnapshotIds':[snapshot_id],}req.from_json_string(json.dumps(params))resp=client.DeleteSnapshots(req)logging.debug(resp.to_json_string())except TencentCloudSDKException as err:logging.error('删除快照失败')logging.error(err)

新建快照

需要服务器实例ID

和删快照不一样,新建快照需要指定在xxx实例(也就是xxx服务器)上新建快照,所以我们还需要服务器的实例id。服务器的实例id在服务器的概要那里就能直接复制。

很可惜,快照的id无法自定义,只能自定义快照的名称。所以代码如下

Python

def create_snapshot(client:lighthouse_client.LighthouseClient,snapshot_list,server_id:str):try:logging.info('新建快照')SnapshotName="Snapshot-"+str(time.strftime("%Y%m%d%H%M%S", time.localtime()))while SnapshotName in [i.SnapshotName for i in snapshot_list.SnapshotSet]:SnapshotName="Snapshot-"+str(time.strftime("%Y%m%d%H%M%S", time.localtime()))logging.info('新建快照:'+' 名称:{}'.format(SnapshotName))req=models.CreateInstanceSnapshotRequest()params={"InstanceId":server_id,"SnapshotName":SnapshotName}req.from_json_string(json.dumps(params))resp=client.CreateInstanceSnapshot(req)logging.debug(resp.to_json_string())logging.info('新建快照成功')except TencentCloudSDKException as err:logging.error('新建快照失败')logging.error(err)

完整代码

使用说明

默认是“删一增一”,如果没快照就只作“新建快照”的操作。当然为了方便使用,也能指定只作“新建”或只作“删除”快照的操作。

Python

import json
import argparse
import logging
import random
import time
from tencentcloud.common import credential
from tencentcloud.common.profile.client_profile import ClientProfile
from tencentcloud.common.profile.http_profile import HttpProfile
from tencentcloud.common.exception.tencent_cloud_sdk_exception import TencentCloudSDKException
from tencentcloud.lighthouse.v20200324 import lighthouse_client, modelsdef parse():parser = argparse.ArgumentParser('TencentCloud_Lighthouse_AutoSnapshot',description='腾讯云lighthouse自动快照脚本')parser.add_argument('--id',help='密钥ID')parser.add_argument('--key',help='密钥KEY')parser.add_argument('--server_id',help='服务器的实例ID')parser.add_argument('--mode',default='info',help='日志级别,默认info,可选debug')parser.add_argument('--snapshot_mode',default='None',help='快照模式,默认None,可选delete,create')return parser.parse_args()def get_snapshot_list(id,key):try:cred = credential.Credential(id, key)client = lighthouse_client.LighthouseClient(cred, "ap-guangzhou")req = models.DescribeSnapshotsRequest()params = {}req.from_json_string(json.dumps(params))resp = client.DescribeSnapshots(req)logging.debug(resp.to_json_string())logging.info('获取快照列表成功')return resp,clientexcept TencentCloudSDKException as err:logging.error('获取快照列表失败')logging.error(err)return None,Nonedef choose_snapshot(snapshot_list):# 选择最老的快照SnapshotSet=snapshot_list.SnapshotSetSnapshotSet.sort(key=lambda x:x.CreatedTime)logging.info('选择最老的快照:{}'.format(SnapshotSet[0].SnapshotId)+' 创建时间:{}'.format(SnapshotSet[0].CreatedTime))return SnapshotSet[0].SnapshotIddef delete_snapshot(client:lighthouse_client.LighthouseClient,snapshot_id:str):try:logging.info('删除快照:{}'.format(snapshot_id))req=models.DeleteSnapshotsRequest()params={'SnapshotIds':[snapshot_id],}req.from_json_string(json.dumps(params))resp=client.DeleteSnapshots(req)logging.debug(resp.to_json_string())except TencentCloudSDKException as err:logging.error('删除快照失败')logging.error(err)def create_snapshot(client:lighthouse_client.LighthouseClient,snapshot_list,server_id:str):try:logging.info('新建快照')SnapshotName="Snapshot-"+str(time.strftime("%Y%m%d%H%M%S", time.localtime()))while SnapshotName in [i.SnapshotName for i in snapshot_list.SnapshotSet]:SnapshotName="Snapshot-"+str(time.strftime("%Y%m%d%H%M%S", time.localtime()))logging.info('新建快照:'+' 名称:{}'.format(SnapshotName))req=models.CreateInstanceSnapshotRequest()params={"InstanceId":server_id,"SnapshotName":SnapshotName}req.from_json_string(json.dumps(params))resp=client.CreateInstanceSnapshot(req)logging.debug(resp.to_json_string())logging.info('新建快照成功')except TencentCloudSDKException as err:logging.error('新建快照失败')logging.error(err)def main():args = parse()if args.mode == 'debug':logging_level = logging.DEBUGelse:logging_level = logging.INFOlogging.basicConfig(level=logging_level,format='%(levelname)s:%(asctime)s  %(message)s',datefmt='%Y/%m/%d %H:%M:%S')if args.snapshot_mode=='delete':logging.info('删除模式:仅作删除快照操作')snapshot_list,client=get_snapshot_list(args.id,args.key)if snapshot_list is None:return elif snapshot_list.TotalCount==0:logging.info('无快照,无法删除')returnelse:SnapshotId=choose_snapshot(snapshot_list)delete_snapshot(client,SnapshotId)returnelif args.snapshot_mode=='create':logging.info('新建模式:仅作新建快照操作')snapshot_list,client=get_snapshot_list(args.id,args.key)if snapshot_list is None:return else:create_snapshot(client,snapshot_list,args.server_id)returnsnapshot_list,client=get_snapshot_list(args.id,args.key)if snapshot_list is None:return elif snapshot_list.TotalCount==0:logging.info('无快照,新建快照')create_snapshot(client,snapshot_list,args.server_id)else:logging.info('列表中快照数量:{}'.format(snapshot_list.TotalCount))SnapshotId=choose_snapshot(snapshot_list)delete_snapshot(client,SnapshotId)snapshot_list,client=get_snapshot_list(args.id,args.key)create_snapshot(client,snapshot_list,args.server_id)if __name__ == '__main__':main()

这篇关于Python:腾讯云-轻量应用服务器-实现自动快照的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/918157

相关文章

Python包管理工具pip的升级指南

《Python包管理工具pip的升级指南》本文全面探讨Python包管理工具pip的升级策略,从基础升级方法到高级技巧,涵盖不同操作系统环境下的最佳实践,我们将深入分析pip的工作原理,介绍多种升级方... 目录1. 背景介绍1.1 目的和范围1.2 预期读者1.3 文档结构概述1.4 术语表1.4.1 核

Qt使用QSqlDatabase连接MySQL实现增删改查功能

《Qt使用QSqlDatabase连接MySQL实现增删改查功能》这篇文章主要为大家详细介绍了Qt如何使用QSqlDatabase连接MySQL实现增删改查功能,文中的示例代码讲解详细,感兴趣的小伙伴... 目录一、创建数据表二、连接mysql数据库三、封装成一个完整的轻量级 ORM 风格类3.1 表结构

基于Python实现一个图片拆分工具

《基于Python实现一个图片拆分工具》这篇文章主要为大家详细介绍了如何基于Python实现一个图片拆分工具,可以根据需要的行数和列数进行拆分,感兴趣的小伙伴可以跟随小编一起学习一下... 简单介绍先自己选择输入的图片,默认是输出到项目文件夹中,可以自己选择其他的文件夹,选择需要拆分的行数和列数,可以通过

Python中反转字符串的常见方法小结

《Python中反转字符串的常见方法小结》在Python中,字符串对象没有内置的反转方法,然而,在实际开发中,我们经常会遇到需要反转字符串的场景,比如处理回文字符串、文本加密等,因此,掌握如何在Pyt... 目录python中反转字符串的方法技术背景实现步骤1. 使用切片2. 使用 reversed() 函

Python中将嵌套列表扁平化的多种实现方法

《Python中将嵌套列表扁平化的多种实现方法》在Python编程中,我们常常会遇到需要将嵌套列表(即列表中包含列表)转换为一个一维的扁平列表的需求,本文将给大家介绍了多种实现这一目标的方法,需要的朋... 目录python中将嵌套列表扁平化的方法技术背景实现步骤1. 使用嵌套列表推导式2. 使用itert

使用Docker构建Python Flask程序的详细教程

《使用Docker构建PythonFlask程序的详细教程》在当今的软件开发领域,容器化技术正变得越来越流行,而Docker无疑是其中的佼佼者,本文我们就来聊聊如何使用Docker构建一个简单的Py... 目录引言一、准备工作二、创建 Flask 应用程序三、创建 dockerfile四、构建 Docker

Python使用vllm处理多模态数据的预处理技巧

《Python使用vllm处理多模态数据的预处理技巧》本文深入探讨了在Python环境下使用vLLM处理多模态数据的预处理技巧,我们将从基础概念出发,详细讲解文本、图像、音频等多模态数据的预处理方法,... 目录1. 背景介绍1.1 目的和范围1.2 预期读者1.3 文档结构概述1.4 术语表1.4.1 核

Python使用pip工具实现包自动更新的多种方法

《Python使用pip工具实现包自动更新的多种方法》本文深入探讨了使用Python的pip工具实现包自动更新的各种方法和技术,我们将从基础概念开始,逐步介绍手动更新方法、自动化脚本编写、结合CI/C... 目录1. 背景介绍1.1 目的和范围1.2 预期读者1.3 文档结构概述1.4 术语表1.4.1 核

在Linux中改变echo输出颜色的实现方法

《在Linux中改变echo输出颜色的实现方法》在Linux系统的命令行环境下,为了使输出信息更加清晰、突出,便于用户快速识别和区分不同类型的信息,常常需要改变echo命令的输出颜色,所以本文给大家介... 目python录在linux中改变echo输出颜色的方法技术背景实现步骤使用ANSI转义码使用tpu

Conda与Python venv虚拟环境的区别与使用方法详解

《Conda与Pythonvenv虚拟环境的区别与使用方法详解》随着Python社区的成长,虚拟环境的概念和技术也在不断发展,:本文主要介绍Conda与Pythonvenv虚拟环境的区别与使用... 目录前言一、Conda 与 python venv 的核心区别1. Conda 的特点2. Python v