专栏首页云API3.0最佳实践云服务器CVM批量关机脚本-Python
原创

云服务器CVM批量关机脚本-Python

通过此工具,你可以很方便的调用腾讯云API,对云服务器CVM进行关机的操作


功能

①.结合云服务器CVM批量开机脚本 | 实现定时开关云服务器的功能 √

②.当你不需要使用云服务器,同时也不想一个个操作关闭时 √

③.自动化运维 √

④.待你发现 🙃


此工具的运行环境

①.Linux或者Windows系统

②.Python 2.7.9

>>点我下载 https://www.python.org/downloads/release/python-279/

③.安装 TencentCloud Python SDK

bash 或者 cmd 中运行 pip install tencentcloud-sdk-python

Linux 下 pip 安装 Tencentcloud SDK
Windows 下 pip 安装 Tencentcloud SDK

如何使用

①.安装Python 2.7.9环境 (若是Centos7,默认已带此环境)

②.安装pip 以及 使用pip下载安装 tencentcloud-sdk-python

③.将密钥保存在txt文件中(文件名可自定义),如下图所示

密钥文件.txt

创建/获取密钥的链接:https://console.cloud.tencent.com/cam/capi

④.将需要进行关机的云服务器CVM 公网IP地址保存在txt文件中(一行一个IP,文件名可自定义),如下图所示

IP地址.txt

⑤. 不同平台的运行方式

  • Windows

将 shutdown.py、密钥文件、云服务器CVM的IP地址 放在同一目录下

运行目录

在此目录下打开cmd或者powershell或者cmder

输入 python shutdown.py shut key.txt instance.txt 并且回车运行

运行批量关机脚本

等待10-15s,出现关机成功的提示即可

成功关机
控制台显示成功关机

  • Linux

与Windows类似,将 shutdown.py、密钥文件、云服务器CVM的IP地址 放在同一目录下

脚本文件所在目录

在终端中 输入 python shutdown.py shut key.txt instance.txt 并且回车运行

运行批量关机脚本

等待10-15s,出现关机成功的提示即可

成功关机
控制台显示成功批量关机

上代码!

#! /usr/bin/env python
# -*- coding: utf-8 -*-

# 本工具主要功能:批量关闭云服务器CVM

# region的地域列表:https://cloud.tencent.com/document/api/214/30670#.E5.9C.B0.E5.9F.9F.E5.88.97.E8.A1.A8

import json, sys ,os, time, datetime
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.cvm.v20170312 import cvm_client, models

reload(sys)
sys.setdefaultencoding("utf-8")

now= str(datetime.datetime.now().strftime("%Y 年 %m 月 %d 日  -  %H:%M:%S"))
all_region = ['ap-bangkok','ap-beijing','ap-chengdu','ap-chongqing','ap-guangzhou','ap-hongkong','ap-mumbai',
          'ap-nanjing','ap-seoul','ap-shanghai','ap-shanghai-fsi','ap-shenzhen-fsi','ap-singapore',
          'ap-tokyo','eu-frankfurt','eu-moscow','na-ashburn','na-siliconvalley','na-toronto']

def print_help():
    print"""
输入 ./shutdown.py help 来查看如何使用此工具

关闭云服务器CVM的命令: ./shutdown.py shut <访问密钥,以Secretld 空格 SecreKey 的格式 保存文本即可> <需关机的云服务器IP地址 的格式 保存文本即可>

#温馨提示:此工具会在当前目录下生成关机操作的日志文件
"""
def cvm_shutdown(Secretld,SecreKey,region,InstanceId):

    try:
        cred = credential.Credential(SecretId,SecretKey)
        httpProfile = HttpProfile()
        httpProfile.endpoint = "cvm.tencentcloudapi.com"

        clientProfile = ClientProfile()
        clientProfile.httpProfile = httpProfile
        client = cvm_client.CvmClient(cred, region, clientProfile) 
       
        req = models.StopInstancesRequest()
        params = {
        "InstanceIds": [ str(InstanceId) ]
        # "ForceStop": True, 是否强制关机 此参数选填
        # "StopType": "SOFT_FIRST", 关闭实例的模式 此参数选填
        # "StoppedMode": "STOP_CHARGING" 是否开启关机不收费 此参数选填

        }

        req.from_json_string(json.dumps(params))

        resp = client.StopInstances(req) 
        return resp.to_json_string()

    except TencentCloudSDKException as err: 
        return err

def _ID_region_from_eip(SecretId,SecretKey,region,offset):

	try:
		cred = credential.Credential(SecretId, SecretKey)
		httpProfile = HttpProfile()
		httpProfile.endpoint = "cvm.tencentcloudapi.com"

		clientProfile = ClientProfile()
		clientProfile.httpProfile = httpProfile
		client = cvm_client.CvmClient(cred, region, clientProfile)

		req = models.DescribeInstancesRequest()
		params = {
			"Limit": 20,
			"Offset": offset
		}
		req.from_json_string(json.dumps(params))

		resp = client.DescribeInstances(req)
		return resp.to_json_string()

	except TencentCloudSDKException as err:
		return err

def log_log(log_content, path):
	
	print "\033[0;31m 本工具最近一次运行的时间: "+now +'\033[0m \n\n'
	
	fin=open(path,'a') # 追加原始内容的写入
	content = log_content + "\033[0;31m 本工具最近一次运行的时间: "+now +'\033[0m \n\n'
	fin.write(content)
	fin.close()

if __name__ == '__main__':
	try:
		if_sys_argv_exit = sys.argv[1]
	except Exception:
		print_help()
		exit()

	if sys.argv[1] == 'help':
		print_help()
		exit()

	else:
		font = open('%s'%sys.argv[2])
		font = font.readline()
		token = font.split()
		SecretId = token[0]
		SecretKey = token[1]

		if sys.argv[1] == 'shut':
			try:
				path = sys.argv[4]
			except Exception:
				path = str(os.path.dirname(os.path.abspath(__file__))) + "/shutdown_cvm.log"

			content = ''
			ip_dict={ }

			for city in all_region:
				result = _ID_region_from_eip(SecretId,SecretKey,city,0)

				try:
					result_dict = json.loads(result)
				except Exception:
					print result
					print "because of above reason, this tool is crashed, please try later"
					content += str(result) +'\n'
					content += "because of above reason, this tool is crashed, please try later"
					log_log(content,path)
					exit()

				TotalCount = result_dict['TotalCount'] #本次查询到了多少CVM

				left_times = TotalCount/20 + 1
				offset = 0

				while left_times>0:
					result = _ID_region_from_eip(SecretId,SecretKey,city,offset)
					try:
						result_dict = json.loads(result)
					except Exception:
						print result
						print "because of above reason, this tool is crashed, please try later"
						content += str(result) + '\n'
						content += "because of above reason, this tool is crashed, please try later"
						log_log(content,path)
						exit()


					for i in result_dict['InstanceSet']:
						InstanceId = i['InstanceId']

						try:
							TF_eip = i['PublicIpAddresses'][0]
						except Exception:
							continue

						for j_ip in i['PublicIpAddresses']:
							eip = j_ip
							ip_dict[eip] = [ InstanceId  , city ]

					left_times -= 1
					offset += 20

			#print ip_dict

			fout=open('%s'%sys.argv[3])
			while 1:
				time.sleep(0.12)
				line = fout.readline()
				if not line :
					break

				line  = line.strip()
				try:
					top_word = line[0]
				except Exception:
					continue

				if top_word=='#':
					continue

				all_conf = line.split()
				ip = all_conf[0]

				if '.' not in all_conf[0]:
					print line + ' 当前帐号下找不到该服务器 '
					print ' '
					content += line + ' 当前帐号下找不到该服务器 查询时间: ' + now + '\n\n'
					continue

				if ip not in ip_dict:
					print line + ' 当前帐号下找不到该服务器 '
					print ' '
					content +=  line + ' 当前帐号下找不到该服务器 查询时间: '+ now + '\n\n'
					continue

				result = cvm_shutdown(SecretId,SecretKey,region=ip_dict[ip][1],InstanceId=ip_dict[ip][0])

				try:
					result_dict = json.loads(result)
					RequestId = result_dict['RequestId']
					print ' 云服务器IP ' + line + ' ' + ip_dict[ip][1] + ' 地域下 ' + ' 实例ID为 '+ ip_dict[ip][0] + ' 的云服务器关机成功 '
					print ' '
					content += ' 云服务器IP ' + line + ' ' + ip_dict[ip][1] + ' 地域下 ' + ' 实例ID为 '+ ip_dict[ip][0] + ' 的云服务器在 ' + now + ' 点 关机成功' + '\n\n'
					
				except Exception:
					print line + ' '+ip_dict[ip][0]+' '+ip_dict[ip][1]+ ' is fail '
					print result
					print ' '
					content +=  line + ' '+ip_dict[ip][0]+' '+ip_dict[ip][1]+ ' is fail time:' + now + '\n' + str(result) + '\n\n'
					
			log_log(content,path)
		else:
			print '\n'
			print ' 当前目录下没有找到这个 %s ' % sys.argv[1] + ' 这个文件 '
			print '\n'
			print_help()

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 云服务器CVM批量开机脚本-Python

    >>点我下载 https://www.python.org/downloads/release/python-279/

    君的名字
  • 腾讯开源|TAT Agent-助力轻松完成云服务器运维管理任务

    ? ? 1、项目简介 腾讯云自动化助手 TAT 是云服务器的原生运维部署工具,可以远程执行 Shell、PowerShell、Python 等脚本。TAT ...

    腾讯开源
  • 腾讯云 CVM 入门

    腾讯云目前支持三种不同的方式来登录和管理您的 CVM, 请您根据自身场景灵活选择登录方式:控制台,CLI 和 API/SDKs。

    勤劳的小蜜蜂
  • 腾讯云CVM配置多网卡方法

    创建cvm可以参考官网文档,本文主要演示如果在腾讯云cvm上配置一个主网卡与两个辅助网卡。作者已经购买好cvm和弹性公网ip,这里提前给出规划的ip与网卡对应关...

    渣渣辉
  • hp服务器ilo批量配置脚本

    hp的ilo是一个非常方便的带外管理工具,在平时使用的时候,经常有大量的hp服务器需要配置ilo,下面是我下的一个脚本,可以批量的完成hp服务器ilo配置。

    力哥聊运维与云计算
  • 案例 | 腾讯广告 AMS 的容器化之路

    张煜,15年加入腾讯并从事腾讯广告维护工作。20年开始引导腾讯广告技术团队接入公司的TKEx-teg,从业务的日常痛点并结合腾讯云原生特性来完善腾讯广告自有的...

    腾讯云原生
  • TBase分布式数据的安装部署

    本次实验是基于腾讯CVM(腾讯云虚拟主机)部署的TBase企业版集群,需要部署开源版集群的请移步开源部署方案

    用户7689089
  • 腾讯云批量计算介绍

    最初,公有云的工作负载以服务型负载为主,各大厂商也进行了诸多针对性优化。随着云计算的快速发展,越来越多的、不同行业的用户开始使用公有云,批处理型负载显著增加。针...

    腾讯云计算产品团队
  • 腾讯云批量计算:用搭积木的方式构建高性能计算系统

    高性能计算(High Performance Computing)简称 HPC,在气象预测、地震预警、生命科学、军事、航天等高科技领域有着广泛的应用,其代表超级...

    腾讯云计算产品团队
  • 给你的SSH加一道防火墙,如何用Kryptonite进行SSH操作

    Secure Shell(安全外壳协议,简称SSH)是一种加密的网络传输协议,可在不安全的网络中为网络服务提供安全的传输环境。SSH通过在网络中创建安全隧道来实...

    所有的酒都不如你
  • CloudLite认证笔记 云服务器 CVM 产品认证

    地山谦
  • 如何使用 Seafile 搭建个人网盘

    Seafile 是一款安全、高性能的开源网盘(云存储)软件。Seafile 提供了主流网盘(云盘)产品所具有的功能,包括文件同步、文件共享等。在此基础上,Sea...

    硬盘侠
  • 云中漫步,做个公众号方便生活、取悦自己

    随着云服务的日趋完善,有了好的idea,可以方便的基于云服务进行快速尝试,而无需考虑机器、网络等基础设施问题。文本将介绍如何基于腾讯云的云服务,快速、低成本地搭...

    刘卓夫
  • 主机迁移实践分享

    在云计算时代,不管是从IDC上云还是多云直接的迁移,都已经是常见的事宜。而在上云/迁移的方案中,也是有多种的方式能够将主机迁移到腾讯云中。

    腾讯云计算产品团队
  • DTS,让迁移MongoDB上云从未如此顺滑

    MongoDB是目前游戏行业越来越热门的数据库,使用场景囊括玩家数据、日志、社区等业务。经过多次交流,一个客户同意将IDC中的游戏迁移上云,一个核心数据库Mon...

    运盐君
  • TKE操作笔记02

    本次笔记主要讲述了如何在腾讯云控制台创建并使用你的第一个kubernetes集群,创建过程中每个步骤的区别以及如何选择,保证自己的集群资源达到最优。

    聂伟星
  • 【玩转腾讯云】妈妈再也不用担心我记不住密码啦!

    在我们的生活和工作当中,会用到非常多的网络应用,因为并不是每个应用都能用类似QQ/微信一键登录的方式来绑定账号,所以也就有了非常多的账号密码,记密码成为了让我们...

    张戈
  • 如何为Ubuntu 16.04设置Ghost一键式应用程序

    使用腾讯云的一键式Ghost应用程序,您可以预先安装带有Ghost的腾讯CVM。有一些命令行可以完成安装,然后您就可以使用一个简单而强大的安全博客工具,让您可以...

    藕丝空间
  • 无所谓

    VPS有很多种玩法,在墙上打洞是最常见的玩法之一。打洞方法多种多样,其中以PPTP最为常见,也是配置起来最为简便的方式之一。 本脚本只需执行一次即可将PPTP服...

    system

扫码关注云+社区

领取腾讯云代金券