云服务器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

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

脚本文件所在目录

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

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

运行批量开机脚本

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

成功开机
控制台显示成功启动实例

  • Linux

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

开机脚本文件所在目录

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

运行批量开机脚本

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

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

上代码!

代码语言:python
代码运行次数:0
复制
Cloud Studio 代码运行
#! /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"""
输入 ./start.py help 来查看如何使用此工具

重装系统的命令: ./start.py start <访问密钥,以Secretld 空格 SecreKey 的格式 保存文本即可> <需开机的云服务器CVM IP地址 的格式 保存文本即可>

#温馨提示:此工具会生成云服务器开机操作的日志文件
"""

def cvm_start(Secretld,SecreKey,region,InstanceId):

try:
    cred = credential.Credential(SecretId,SecretKey) 
    httpProfile = HttpProfile()
    httpProfile.endpoint = &#34;cvm.tencentcloudapi.com&#34;

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

    req = models.StartInstancesRequest()
    params = {
    &#34;InstanceIds&#34;: [ str(InstanceId) ]
    }

    req.from_json_string(json.dumps(params))

    resp = client.StartInstances(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 = &#34;cvm.tencentcloudapi.com&#34;

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

	req = models.DescribeInstancesRequest()
	params = {
		&#34;Limit&#34;: 20,
		&#34;Offset&#34;: 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 &#34;\033[0;31m 本工具最近一次运行的时间: &#34;+now +&#39;\033[0m \n\n&#39;

fin=open(path,&#39;a&#39;) # 追加原始内容的写入
content = log_content + &#34;\033[0;31m 本工具最近一次运行的时间: &#34;+now +&#39;\033[0m \n\n&#39;
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] == &#39;help&#39;:
	print_help()
	exit()

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

	if sys.argv[1] == &#39;start&#39;:
		try:
			path = sys.argv[4]
		except Exception:
			path = str(os.path.dirname(os.path.abspath(__file__))) + &#34;/start_cvm.log&#34;

		content = &#39;&#39;
		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 &#34;because of above reason, this tool is crashed, please try later&#34;
				content += str(result) +&#39;\n&#39;
				content += &#34;because of above reason, this tool is crashed, please try later&#34;
				log_log(content,path)
				exit()

			TotalCount = result_dict[&#39;TotalCount&#39;] #本次查询到了多少CVM

			left_times = TotalCount/20 + 1
			offset = 0

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


				for i in result_dict[&#39;InstanceSet&#39;]:
					InstanceId = i[&#39;InstanceId&#39;]

					try:
						TF_eip = i[&#39;PublicIpAddresses&#39;][0]
					except Exception:
						continue

					for j_ip in i[&#39;PublicIpAddresses&#39;]:
						eip = j_ip
						ip_dict[eip] = [ InstanceId  , city ]

				left_times -= 1
				offset += 20

		#print ip_dict

		fout=open(&#39;%s&#39;%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==&#39;#&#39;:
				continue

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

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

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

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

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