Python调用阿里api获取Ecs服务器相关信息
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2021/7/9 11:23
from email.mime.text import MIMEText
from email.header import Header
import smtplib,string
import json
import time
import datetime
import prettytable as pt
from ntpath import join
from aliyunsdkcore import client
from aliyunsdkecs.request.v20140526 import DescribeInstancesRequest
from aliyunsdkcore.acs_exception.exceptions import ClientException
from aliyunsdkcore.acs_exception.exceptions import ServerException
from aliyunsdkcms.request.v20190101.DescribeMetricTopRequest import DescribeMetricTopRequest
clt = client.AcsClient('test','test', 'test')
##脚本所需参数
# 设置页数
page_number = '1'
# 设置每页返回多少,默认为10条
strip_number = '100'
# ECS到期时间范围单位是‘天’
expire_days = '20'
# 云服务的数据命名空间(磁盘使用率那进行调用)
ecs_namespace = 'acs_ecs_dashboard'
# 云服务的监控项名称
Disk_metricname = 'vm.DiskUtilization' # 磁盘
Mem_metricname = 'vm.MemoryUtilization' # 内存
CPU_metricname = 'cpu_total' # CPU
# 磁盘使用率阀值(%)
Disk_use_rate = '50'
# 内存使用率阀值(%)
Mem_user_rate = '70'
# CPU使用率阀值(%)
Cpu_user_rate = '30'
#发送邮件相关信息
sender = '发送'
receiver = '接收'
subject = '阿里云产品Ecs巡检清单'
username = 'test'
password = 'test'
class Ecs_product:
def get_sys_info(self):
request = DescribeInstancesRequest.DescribeInstancesRequest()
# request.set_PageNumber('1') #设置页数
request.set_PageSize(strip_number) # 设置每页返回多少,默认为10条
request.set_accept_format('json')
response = json.loads(clt.do_action(request)).get('Instances').get('Instance')
return response
def ecs_endtime(self):
tb = pt.PrettyTable()
tb.field_names = ["序号","实例ID","IP地址","到期时间","备注"]
count = 0
for i in self.get_sys_info():
#阿里云UTC时间转换成北京时间
ecs_endtime_0 = i['ExpiredTime']
ecs_endtime_1 = "%Y-%m-%dT%H:%MZ"
ecs_endtime_2 = datetime.datetime.strptime(ecs_endtime_0,ecs_endtime_1)
ecs_endtime_3 = ecs_endtime_2 + datetime.timedelta(hours=8) - datetime.timedelta(seconds=1)
ecs_endtime_4 = ecs_endtime_3.strftime('%Y-%m-%d')
#计算到期时间与现在时间之差
current_time = time.strftime("%Y-%m-%d", time.localtime())
current = time.mktime(time.strptime(current_time,'%Y-%m-%d'))
ecs_endtime_5 = time.mktime(time.strptime(ecs_endtime_4,'%Y-%m-%d'))
count_days = int((ecs_endtime_5 - current)/(24*60*60))
#距离到期时间小于20天
if count_days <= int(expire_days):
count = count +1
ecs_remarks = i['InstanceId'],i['InstanceName']
ecs_IP_0 = i['VpcAttributes']
ecs_IP_1 = ecs_IP_0["PrivateIpAddress"]["IpAddress"][0]
tb.add_row([count,list(ecs_remarks)[0],ecs_IP_1,ecs_endtime_3.strftime('%Y年%m月%d日 %H:%M'),list(ecs_remarks)[1]])
return 'ECS到期时间: \n%s '%(tb)
#ECS磁盘使用率
def disk_info(self):
request = DescribeMetricTopRequest()
request.set_accept_format('json')
request.set_Namespace(ecs_namespace)
request.set_MetricName(Disk_metricname)
request.set_Orderby("Average")
request.set_Length(strip_number)
response_0 = clt.do_action_with_exception(request)
response_1 = str(response_0, encoding='utf-8')
return response_1
#列出超出磁盘阈值的ECS信息
def get_disk_Value(self):
tb = pt.PrettyTable()
tb.field_names = ["序号","实例ID","IP地址","目录","使用率(%)","备注"]
count = 0
Slicing_0 = eval(str(self.disk_info()))
Slicing_1 = Slicing_0["Datapoints"]
Slicing_2 = eval(Slicing_1)
for Slicing_3 in Slicing_2:
if Slicing_3.get("Average") >= float(Disk_use_rate):
for ecs_id_0 in self.get_sys_info():
if Slicing_3.get("instanceId") == ecs_id_0['InstanceId']:
count += 1
ecs_remarks = ecs_id_0['InstanceId'],ecs_id_0['InstanceName']
ecs_IP_0 = ecs_id_0['VpcAttributes']
ecs_IP_1 = ecs_IP_0["PrivateIpAddress"]["IpAddress"][0]
tb.add_row([count,Slicing_3.get("instanceId"),ecs_IP_1,Slicing_3.get("mountpoint"),Slicing_3.get("Maximum"),list(ecs_remarks)[1]])
return 'ECS磁盘使用率 \n%s '%(tb)
#列出超出磁盘阈值的ECS信息
# def get_disk_Value():
# tb = pt.PrettyTable()
# tb.field_names = ["序号","实例ID","目录","使用率(%)"]
# Slicing_0 = eval(str(disk_info()))
# Slicing_1 = Slicing_0["Datapoints"]
# Slicing_2 = eval(Slicing_1)
# for Slicing_3 in Slicing_2:
# if Slicing_3.get("Maximum") >= float(Disk_use_rate):
# tb.add_row([autoIncrement(),Slicing_3.get("instanceId"),Slicing_3.get("mountpoint"),Slicing_3.get("Maximum")])
# return tb
#ECS内存使用率
def Member_info(self):
request = DescribeMetricTopRequest()
request.set_accept_format('json')
request.set_Namespace(ecs_namespace)
request.set_MetricName(Mem_metricname)
request.set_Orderby("Average")
request.set_Length(strip_number)
response_0 = clt.do_action_with_exception(request)
response_1 = str(response_0, encoding='utf-8')
return response_1
#列出超出内存阈值的ECS信息
def get_Member_Value(self):
count = 0
tb = pt.PrettyTable()
tb.field_names = ["序号","实例ID","IP地址","使用率(%)","备注"]
Slicing_0 = eval(str(self.Member_info()))
Slicing_1 = Slicing_0["Datapoints"]
Slicing_2 = eval(Slicing_1)
for Slicing_3 in Slicing_2:
if Slicing_3.get("Average") >= float(Mem_user_rate):
for ecs_id_0 in self.get_sys_info():
if Slicing_3.get("instanceId") == ecs_id_0['InstanceId']:
ecs_remarks = ecs_id_0['InstanceId'],ecs_id_0['InstanceName']
ecs_IP_0 = ecs_id_0['VpcAttributes']
ecs_IP_1 = ecs_IP_0["PrivateIpAddress"]["IpAddress"][0]
count +=1
tb.add_row([count,Slicing_3.get("instanceId"),ecs_IP_1,Slicing_3.get("Maximum"),list(ecs_remarks)[1]])
return 'ECS内存使用率 \n%s '%(tb)
#ECS-CPU使用率
def CPU_info(self):
request = DescribeMetricTopRequest()
request.set_accept_format('json')
request.set_Namespace(ecs_namespace)
request.set_MetricName(CPU_metricname)
request.set_Orderby("Average")
request.set_Length(strip_number)
response_0 = clt.do_action_with_exception(request)
response_1 = str(response_0, encoding='utf-8')
return response_1
#列出超出CPU阈值的ECS信息
def get_CPU_Value(self):
count = 0
tb = pt.PrettyTable()
tb.field_names = ["序号","实例ID","IP地址","使用率(%)","备注"]
Slicing_0 = eval(str(self.CPU_info()))
Slicing_1 = Slicing_0["Datapoints"]
Slicing_2 = eval(Slicing_1)
for Slicing_3 in Slicing_2:
if Slicing_3.get("Average") >= float(Cpu_user_rate):
for ecs_id_0 in self.get_sys_info():
if Slicing_3.get("instanceId") == ecs_id_0['InstanceId']:
ecs_remarks = ecs_id_0['InstanceId'],ecs_id_0['InstanceName']
ecs_IP_0 = ecs_id_0['VpcAttributes']
ecs_IP_1 = ecs_IP_0["PrivateIpAddress"]["IpAddress"][0]
count += 1
tb.add_row([count,Slicing_3.get("instanceId"),ecs_IP_1,Slicing_3.get("Maximum"),list(ecs_remarks)[1]])
return 'ECS-CPU使用率 \n%s '%(tb)
def send_mail(self):
msg = MIMEText('阿里云-%s \n\n'%(All) , 'plain', 'utf-8') # 中文需参数‘utf-8’,单字节字符不需要
msg['Subject'] = Header(subject, 'utf-8')
smtp = smtplib.SMTP()
smtp.connect('smtp.189.cn')
smtp.login(username, password)
smtp.sendmail(sender, receiver, msg.as_string())
smtp.quit()
Ecs_data = Ecs_product()
All = "%s \n\n\n %s \n\n\n%s \n\n\n%s"%(
Ecs_data.ecs_endtime(),
Ecs_data.get_disk_Value(),
Ecs_data.get_Member_Value(),
Ecs_data.get_CPU_Value()
)
if __name__ == '__main__':
Ecs_data.send_mail()

浙公网安备 33010602011771号