全部产品
Search
文档中心

弹性伸缩:使用Python SDK执行滚动升级任务

更新时间:Aug 20, 2024

通过阿里云Python SDK,您不用复杂编程即可访问阿里云服务。本教程以运行Linux系统的电脑为例,介绍如何使用阿里云Python SDK调用系统运维管理 OOS(CloudOps Orchestration Service)的API执行滚动升级任务。

背景信息

滚动升级是指通过任务形式批量更新ECS实例配置。通过滚动升级,您可以为伸缩组内处于服务中状态的ECS实例批量更新镜像、执行脚本或者安装OOS软件包。

前提条件

  • 已创建RAM用户并获取AccessKey,如果没有,请创建RAM用户的AccessKey。在调用阿里云API时您需要使用AccessKey完成身份验证。

    重要
    • 为避免主账号泄露AccessKey带来的安全风险,强烈建议您创建RAM用户,授予RAM用户相关访问权限,再使用RAM用户的AccessKey调用SDK。具体操作,请参见弹性伸缩系统权限策略参考

    • RAM用户的AccessKey Secret只能在创建AccessKey时显示,创建完成后不支持查看。请在创建好AccessKey后,及时并妥善保存AccessKey Secret。

  • 已配置环境变量,如果没有,请参见在Linux、macOS和Windows系统配置环境变量。本文通过配置环境变量(ALIBABA_CLOUD_ACCESS_KEY_IDALIBABA_CLOUD_ACCESS_KEY_SECRET)的方式配置Alibaba Cloud Credentials工具的身份验证,实现以非AK硬编码的方式访问阿里云OpenAPI。

  • 已创建伸缩组并添加ECS实例。具体操作,请参见基于ECS实例创建伸缩组

  • 已在本地电脑中安装Python,且版本不低于3.6。

步骤一:安装阿里云Python SDK

  1. 确认是否已安装Python。

    python --version

    返回Python版本表明已安装Python,示例如下图所示。2024-07-08_13-37-07.png

  2. 安装系统运维管理 OOS(CloudOps Orchestration Service)的依赖。

    pip install alibabacloud_oos20190601==3.2.1

步骤二:执行滚动升级任务

  1. 创建Python脚本并输入执行滚动升级任务的代码。

    示例代码中涉及的OOS模板参数说明,请参见模板参数说明。示例代码如下:

    # -*- coding: utf-8 -*-
    import os
    import sys
    
    from typing import List
    
    from alibabacloud_oos20190601.client import Client as oos20190601Client
    from alibabacloud_tea_openapi import models as open_api_models
    from alibabacloud_oos20190601 import models as oos_20190601_models
    from alibabacloud_tea_util import models as util_models
    from alibabacloud_tea_util.client import Client as UtilClient
    
    
    class Sample:
        def __init__(self):
            pass
    
        @staticmethod
        def create_client() -> oos20190601Client:
            """
            使用AK&SK初始化账号Client
            @return: Client
            @throws Exception
            """
            # 工程代码泄露可能会导致 AccessKey 泄露,并威胁账号下所有资源的安全性。以下代码示例仅供参考。
            config = open_api_models.Config(
                # 必填,请确保代码运行环境设置了环境变量 ALIBABA_CLOUD_ACCESS_KEY_ID。,
                access_key_id=os.environ['ALIBABA_CLOUD_ACCESS_KEY_ID'],
                # 必填,请确保代码运行环境设置了环境变量 ALIBABA_CLOUD_ACCESS_KEY_SECRET。,
                access_key_secret=os.environ['ALIBABA_CLOUD_ACCESS_KEY_SECRET']
            )
            config.endpoint = f'oos.cn-hangzhou.aliyuncs.com'
            return oos20190601Client(config)
    
        @staticmethod
        def main(
                args: List[str],
        ) -> None:
            client = Sample.create_client()
            tags = {
                'scaling_group': 'asg-bp1******'
            }
            start_execution_request = oos_20190601_models.StartExecutionRequest(
                region_id='cn-hangzhou',
                template_name='ACS-ESS-RollingUpdateByRunCommandInScalingGroup',
                parameters='''{"invokeType": "invoke",
                            "scalingGroupId": "asg-bp1******",
                            "commandType": "RunShellScript",
                            "invokeScript": "df -h;ifconfig",
                            "rollbackScript": "df -h;ifconfig",
                            "OOSAssumeRole": "",
                            "exitProcess": [
                                "ScaleIn",
                                "ScaleOut",
                                "HealthCheck",
                                "AlarmNotification",
                                "ScheduledAction"
                            ],
                            "enterProcess": [
                                "ScaleIn",
                                "ScaleOut",
                                "HealthCheck",
                                "AlarmNotification",
                                "ScheduledAction"
                            ],
                            "batchNumber": 2,
                            "batchPauseOption": "Automatic"}''',
                tags=tags
            )
            runtime = util_models.RuntimeOptions()
            try:
                # 复制代码运行请自行打印 API 的返回值
                resp = client.start_execution_with_options(start_execution_request, runtime)
                print(resp.body)
            except Exception as error:
                # 此处仅做打印展示,请谨慎对待异常处理,在工程项目中切勿直接忽略异常。
                # 错误 message
                print(error.message)
                # 诊断地址
                print(error.data.get("Recommend"))
                UtilClient.assert_as_string(error.message)
    
    if __name__ == '__main__':
        Sample.main(sys.argv[1:])
    
  2. 运行Python脚本并查看返回信息。

    说明

    执行回滚任务时需要填入源滚动升级任务的执行ID。您可以在命令的返回信息中找到滚动升级任务的执行ID等信息,如下图所示即代表运行成功。

    image

步骤三:(可选)执行回滚任务

如果滚动升级过程中出现异常,或者滚动升级后又需要使用历史配置,您可以执行回滚任务为伸缩组内ECS实例恢复配置。

  1. 创建Python脚本并输入执行回滚任务的代码。

    示例代码中涉及的OOS模板参数说明,请参见模板参数说明。示例代码如下:

    # -*- coding: utf-8 -*-
    import os
    import sys
    
    from typing import List
    
    from alibabacloud_oos20190601.client import Client as oos20190601Client
    from alibabacloud_tea_openapi import models as open_api_models
    from alibabacloud_oos20190601 import models as oos_20190601_models
    from alibabacloud_tea_util import models as util_models
    from alibabacloud_tea_util.client import Client as UtilClient
    
    
    class Sample:
        def __init__(self):
            pass
    
        @staticmethod
        def create_client() -> oos20190601Client:
            """
            使用AK&SK初始化账号Client
            @return: Client
            @throws Exception
            """
            # 工程代码泄露可能会导致 AccessKey 泄露,并威胁账号下所有资源的安全性。以下代码示例仅供参考。
            config = open_api_models.Config(
                # 必填,请确保代码运行环境设置了环境变量 ALIBABA_CLOUD_ACCESS_KEY_ID。,
                access_key_id=os.environ['ALIBABA_CLOUD_ACCESS_KEY_ID'],
                # 必填,请确保代码运行环境设置了环境变量 ALIBABA_CLOUD_ACCESS_KEY_SECRET。,
                access_key_secret=os.environ['ALIBABA_CLOUD_ACCESS_KEY_SECRET']
            )
            config.endpoint = f'oos.cn-hangzhou.aliyuncs.com'
            return oos20190601Client(config)
    
        @staticmethod
        def main(
                args: List[str],
        ) -> None:
            client = Sample.create_client()
            tags = {
                'scaling_group': 'asg-bp1******'
            }
            start_execution_request = oos_20190601_models.StartExecutionRequest(
                region_id='cn-hangzhou',
                template_name='ACS-ESS-RollingUpdateByRunCommandInScalingGroup',
                parameters='''{"invokeType": "rollback",
                            "scalingGroupId": "asg-bp1******",
                            "commandType": "RunShellScript",
                            "rollbackScript": "df -h;ifconfig",
                            "OOSAssumeRole": "",
                            "sourceExecutionId": "exec-c1******",
                            "batchNumber": 2,
                            "batchPauseOption": "Automatic"}''',
                tags=tags
            )
            runtime = util_models.RuntimeOptions()
            try:
                # 复制代码运行请自行打印 API 的返回值
                resp = client.start_execution_with_options(start_execution_request, runtime)
                print(resp.body)
            except Exception as error:
                # 此处仅做打印展示,请谨慎对待异常处理,在工程项目中切勿直接忽略异常。
                # 错误 message
                print(error.message)
                # 诊断地址
                print(error.data.get("Recommend"))
                UtilClient.assert_as_string(error.message)
    
    
    if __name__ == '__main__':
        Sample.main(sys.argv[1:])
    
  2. 运行Python脚本并查看返回信息。

    示例如下图所示。image

模板参数说明

本教程中使用了公共模板ACS-ESS-RollingUpdateByRunCommandInScalingGroup,参数说明如下表所示。

参数

说明

invokeType

任务类型。取值范围:

  • invoke:滚动升级任务。

  • rollback:回滚任务。

scalingGroupId

待执行任务的伸缩组。

commandType

待执行的脚本类型,取值RunShellScript代表Shell脚本。

invokeScript

执行滚动升级任务时,在ECS实例中执行的脚本。

rollbackScript

执行回滚任务时,在ECS实例中执行的脚本。

OOSAssumeRole

执行任务时使用的RAM角色,默认为OOSServiceRole。

enterProcess

开始执行任务时暂停的伸缩组流程。

exitProcess

结束任务时需要恢复的伸缩组流程。

batchNumber

执行任务时,将伸缩组内ECS实例分成几个批次,每批次至少包括一台ECS实例。

batchPauseOption

执行任务时的暂停设置。取值范围:

  • Automatic:不暂停,一次性执行完成。

  • FirstBatchPause:第一批次执行完成后,暂停执行任务。

  • EveryBatchPause:每批次执行完成后,都暂停执行任务。

sourceExecutionId

执行回滚任务时,源滚动升级任务的执行ID。