通过阿里云Python SDK,您不用复杂编程即可访问阿里云服务。本教程为您介绍如何使用阿里云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_ID和ALIBABA_CLOUD_ACCESS_KEY_SECRET)的方式配置Alibaba Cloud Credentials工具的身份验证,实现以非AK硬编码的方式访问阿里云OpenAPI。已创建伸缩组并添加ECS实例。具体操作,请参见基于ECS实例创建伸缩组。
已在本地电脑中安装Python,且版本不低于3.6。
步骤一:安装阿里云Python SDK
确认是否已安装Python。
python --versionpython --version返回Python版本表明已安装Python,示例如下:python --version Python 3.12.4安装系统运维管理 OOS(CloudOps Orchestration Service)的依赖。
pip install alibabacloud_oos20190601==3.2.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:])运行Python脚本并查看返回信息。
说明执行回滚任务时需要填入源滚动升级任务的执行ID。
执行滚动升级任务成功后,返回信息中
ExecutionId(如exec-cxxx2)即为后续回滚任务所需的源执行 ID。返回示例:{"Execution": {"Counters": {"Failed": 0, "Total": 0, "Success": 0}, "CurrentTasks": [], "ExecutedBy": "xxx", "ExecutionId": "exec-cxxx2", "LoopMode": "Automatic", "Mode": "Automatic", "Outputs": "{}", "Parameters": "{\"invokeType\": \"invoke\", \"scalingGroupId\": \"asg-bp1xxx\", \"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\"}", "ResourceGroupId": "rg-axxx", "SafetyCheck": "Skip", "StartDate": "2024-08-13T03:39:27Z", "Status": "Started", "Tags": {"scaling_group": "asg-bp1xxx"}, "TemplateId": "t-3a5f0904084e4a3c8801", "TemplateName": "ACS-ESS-RollingUpdateByRunCommandInScalingGroup", "TemplateVersion": "v17"}, "RequestId": "D4B1C557-0E42-5AD4-A329-AA673ECD2DF1"}
步骤三:(可选)执行回滚任务
如果滚动升级过程中出现异常,或者滚动升级后又需要使用历史配置,您可以执行回滚任务为伸缩组内ECS实例恢复配置。
创建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:])运行Python脚本并查看返回信息。
示例如下:
{'Execution': {'Counters': {'Failed': 0, 'Total': 0, 'Success': 0}, 'CurrentTasks': [], 'ExecutedBy': 'xxx', 'ExecutionId': 'exec-c1xxx', 'LoopMode': 'Automatic', 'Mode': 'Automatic', 'Outputs': '{}', 'Parameters': '{"invokeType": "rollback", "scalingGroupId": "asg-bp1******", "commandType": "RunShellScript", "rollbackScript": "df -h;ifconfig", "OOSAssumeRole": "", "sourceExecutionId": "exec-c1******", "batchNumber": 2, "batchPauseOption": "Automatic"}', 'ResourceGroupId': 'rg-axxx', 'SafetyCheck': 'Skip', 'StartDate': '2024-08-13T03:50:27Z', 'Status': 'Started', 'Tags': {'scaling_group': 'asg-bp1******'}, 'TemplateId': 't-3a5f0904084e4a3c8801', 'TemplateName': 'ACS-ESS-RollingUpdateByRunCommandInScalingGroup', 'TemplateVersion': 'v17'}, 'RequestId': 'E2A2D8F5-1B3A-5C94-B321-BB673ECD3AC2'}
模板参数说明
本教程中使用了公共模板ACS-ESS-RollingUpdateByRunCommandInScalingGroup,参数说明如下表所示。
参数 | 说明 |
invokeType | 任务类型。取值范围:
|
scalingGroupId | 待执行任务的伸缩组。 |
commandType | 待执行的脚本类型,取值RunShellScript代表Shell脚本。 |
invokeScript | 执行滚动升级任务时,在ECS实例中执行的脚本。 |
rollbackScript | 执行回滚任务时,在ECS实例中执行的脚本。 |
OOSAssumeRole | 执行任务时使用的RAM角色,默认为OOSServiceRole。 |
enterProcess | 开始执行任务时暂停的伸缩组流程。 |
exitProcess | 结束任务时需要恢复的伸缩组流程。 |
batchNumber | 执行任务时,将伸缩组内ECS实例分成几个批次,每批次至少包括一台ECS实例。 |
batchPauseOption | 执行任务时的暂停设置。取值范围:
|
sourceExecutionId | 执行回滚任务时,源滚动升级任务的执行ID。 |