|
| 1 | +#!/bin/env python |
| 2 | +# -*- coding:utf-8 -*- |
| 3 | +# _auth:kaliarch |
| 4 | + |
| 5 | +import configparser |
| 6 | +import time |
| 7 | +import json |
| 8 | +from aliyunsdkcore import client |
| 9 | +from aliyunsdkecs.request.v20140526 import CreateImageRequest |
| 10 | +from aliyunsdkecs.request.v20140526 import CopyImageRequest |
| 11 | +from aliyunsdkecs.request.v20140526 import DescribeImagesRequest |
| 12 | +import logger |
| 13 | + |
| 14 | + |
| 15 | +class EcsOper(): |
| 16 | + def __init__(self,logger): |
| 17 | + """ |
| 18 | + 初始化获取系config信息,配置日志 |
| 19 | + :param logger: |
| 20 | + """ |
| 21 | + config = configparser.ConfigParser() |
| 22 | + config.read('config.cfg',encoding='utf-8') |
| 23 | + accessKeyId = config['common']['accessKeyId'] |
| 24 | + accessSecret = config['common']['accessSecret'] |
| 25 | + self.s_RegionId = config['source']['s_RegionId'] |
| 26 | + self.s_InstanceId = config['source']['s_InstanceId'] |
| 27 | + |
| 28 | + self.s_ImageName = config['source']['s_ImageName'] |
| 29 | + self.s_Description = config['source']['s_Description'] |
| 30 | + |
| 31 | + self.d_DestinationRegionId = config['destination']['d_DestinationRegionId'] |
| 32 | + self.d_DestinationImageName = config['destination']['d_DestinationImageName'] |
| 33 | + self.d_DestinationDescription = config['destination']['d_DestinationDescription'] |
| 34 | + self.ecshelper = client.AcsClient(accessKeyId,accessSecret,self.s_RegionId) |
| 35 | + |
| 36 | + logger = logger.LogHelper() |
| 37 | + logname = logger.create_dir() |
| 38 | + self.logoper = logger.create_logger(logname) |
| 39 | + |
| 40 | + # 镜像制作 |
| 41 | + def _create_image(self): |
| 42 | + """ |
| 43 | + 创建镜像 |
| 44 | + :return:返回镜像id |
| 45 | + """ |
| 46 | + s_timer = time.strftime("%Y-%m-%d-%H:%M", time.localtime(time.time())) |
| 47 | + request = CreateImageRequest.CreateImageRequest() |
| 48 | + request.set_accept_format('json') |
| 49 | + request.add_query_param('RegionId', self.s_RegionId) |
| 50 | + request.add_query_param('InstanceId', self.s_InstanceId) |
| 51 | + request.add_query_param('ImageName', self.s_ImageName + s_timer) |
| 52 | + request.add_query_param('Description', self.s_Description + s_timer) |
| 53 | + response = self.ecshelper.do_action_with_exception(request) |
| 54 | + self.logoper.info('创建镜像任务已提交,镜像id:%s' % json.loads(response)["ImageId"]) |
| 55 | + print('创建镜像任务已提交,镜像id:%s' % json.loads(response)["ImageId"]) |
| 56 | + return json.loads(response)["ImageId"] |
| 57 | + |
| 58 | + # 查询镜像状态 |
| 59 | + def _describe_image(self,imageid): |
| 60 | + """ |
| 61 | + 查询image状态 |
| 62 | + :param imageid: |
| 63 | + :return: |
| 64 | + """ |
| 65 | + request = DescribeImagesRequest.DescribeImagesRequest() |
| 66 | + request.set_accept_format('json') |
| 67 | + request.add_query_param('RegionId', self.s_RegionId) |
| 68 | + request.add_query_param('ImageId', imageid) |
| 69 | + response = self.ecshelper.do_action_with_exception(request) |
| 70 | + # 进度 json.loads(response)['Images']['Image'][0]['Progress'] |
| 71 | + self.logoper.info('镜像创建进度:%s' %json.loads(response)['Images']['Image'][0]['Progress']) |
| 72 | + # 镜像状态 |
| 73 | + return json.loads(response)['Images']['Image'][0]['Status'] |
| 74 | + |
| 75 | + |
| 76 | + #镜像复制 |
| 77 | + def _copy_image(self,imageid): |
| 78 | + """ |
| 79 | + 镜像复制 |
| 80 | + :param imageid:源镜像id |
| 81 | + :return: 复制成功后的镜像id |
| 82 | + """ |
| 83 | + flag = True |
| 84 | + while flag: |
| 85 | + try: |
| 86 | + if self._describe_image(imageid) == 'Available': |
| 87 | + flag = False |
| 88 | + else: |
| 89 | + time.sleep(300) |
| 90 | + except Exception as e: |
| 91 | + pass |
| 92 | + print('镜像已经创建完成') |
| 93 | + d_timer = time.strftime("%Y-%m-%d-%H:%M", time.localtime(time.time())) |
| 94 | + request = CopyImageRequest.CopyImageRequest() |
| 95 | + request.set_accept_format('json') |
| 96 | + request.add_query_param('RegionId', self.s_RegionId) |
| 97 | + request.add_query_param('DestinationRegionId', self.d_DestinationRegionId) |
| 98 | + request.add_query_param('DestinationImageName', self.d_DestinationImageName + d_timer) |
| 99 | + request.add_query_param('DestinationDescription', self.d_DestinationDescription + d_timer) |
| 100 | + request.add_query_param('ImageId', imageid) |
| 101 | + response = self.ecshelper.do_action_with_exception(request) |
| 102 | + self.logoper.info('复制镜像任务已提交,镜像id:%s' % json.loads(response)['ImageId']) |
| 103 | + print('复制镜像任务已提交,镜像id:%s' % json.loads(response)['ImageId']) |
| 104 | + return json.loads(response)['ImageId'] |
| 105 | + |
| 106 | + |
| 107 | + def run(self): |
| 108 | + s_imageid = self._create_image() |
| 109 | + self._copy_image(s_imageid) |
| 110 | + |
| 111 | + |
| 112 | +if __name__ == '__main__': |
| 113 | + ecsoper = EcsOper(logger) |
| 114 | + ecsoper.run() |
| 115 | + |
| 116 | + |
| 117 | + |
| 118 | + |
| 119 | + |
| 120 | + |
0 commit comments