#!/usr/bin/python

* coding:utf-8 *

import json
from aliyunsdkcore import client
from aliyunsdkecs.request.v20140526 import ApplyAutoSnapshotPolicyRequest
from aliyunsdkecs.request.v20140526 import DescribeDisksRequest,DescribeInstancesRequest

clt = client.AcsClient('accesskey', 'secretkey', 'cn-hangzhou')

#获取一个页面的磁盘列表,默认按照最新创建时间排序
def get_diskinfo(pnum,Category):
request = DescribeDisksRequest.DescribeDisksRequest()
request.set_accept_format('json')
request.add_query_param('RegionId', 'cn-hangzhou')
request.add_query_param('Category', Category)
request.add_query_param('PageNumber', pnum)
request.add_query_param('PageSize', 100) #一个页面最大可以取出100条数据
response = json.loads(clt.do_action_with_exception(request))
return response['Disks']['Disk']

#获取ECS对应的磁盘快照策略,由于不同环境需要有不同的快照策略
def get_snapshotid(instanceid):
request = DescribeInstancesRequest.DescribeInstancesRequest()
request.set_accept_format('json')
request.add_query_param('InstanceIds', [str(instanceid)])
res = json.loads(clt.do_action_with_exception(request))
response = res['Instances']['Instance']
if response[0]['InstanceNetworkType'] == 'vpc' and response[0]['VpcAttributes']['VpcId'] == 'vpc-xxxxxxxxxxxxxxxxxxx':
snapshotid = 'sp-xxxxxxxxxxxxxxx'
elif response[0]['InstanceNetworkType'] == 'vpc' and response[0]['VpcAttributes']['VpcId'] == 'vpc-xxxxxxxxxxxxxxxxxxx':
snapshotid = 'sp-xxxxxxxxxxxxxxxxx'
else:
snapshotid = 'sp-xxxxxxxxxxxxxxxxx'
return snapshotid

#应用自动快照策略
def ApllyAutoSnapshot(diskid, policyid):

type: () -> object

disks = [str(diskid)]
request = ApplyAutoSnapshotPolicyRequest.ApplyAutoSnapshotPolicyRequest()
request.set_accept_format('json')
request.add_query_param('regionId', 'cn-hangzhou')
request.add_query_param('autoSnapshotPolicyId', policyid)
request.add_query_param('diskIds', disks)
response = json.loads(clt.do_action_with_exception(request))
return json.dumps(response)

if name == "main":
#根据不同云盘类型,循环拉取最新磁盘列表,并应用快照策略
Cgory = ['cloud_efficiency', 'cloud_ssd']
for Category in Cgory:
pnum = 1
while True:
response = get_diskinfo(pnum, Category)
n = 0 #定义一个数值,判断列表中未应用策略的条数
for diskinfo in response:
if not diskinfo['AutoSnapshotPolicyId']:
print diskinfo['InstanceId'] + " : " + diskinfo['DiskId']
snapshotid = get_snapshotid(diskinfo['InstanceId'])
ApllyAutoSnapshot(diskinfo['DiskId'], snapshotid)
n += 1
if n < 100: #条数小于页码数则说明最新创建的磁盘都已经应用好了,如果等于页码数则说明所有的磁盘都是新创建的,下一页还会有新创建的磁盘。
break
pnum += 1