#!/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