通過阿里雲Python SDK,您不用複雜編程即可訪問阿里雲服務。本教程為您介紹如何使用阿里雲Python SDK調用CloudOps Orchestration Service (OOS)的API執行滾動升級任務。
背景資訊
滾動升級是指通過任務形式批次更新ECS執行個體配置。通過滾動升級,您可以為伸縮組內處於服務中狀態的ECS執行個體批次更新鏡像、執行指令碼或者安裝OOS軟體包。
前提條件
已建立RAM使用者並擷取AccessKey,如果沒有,請建立RAM使用者的AccessKey。在調用阿里雲API時您需要使用AccessKey完成身分識別驗證。
重要為避免主帳號泄露AccessKey帶來的安全風險,強烈建議您建立RAM使用者,授予RAM使用者相關存取權限,再使用RAM使用者的AccessKey調用SDK。具體操作,請參見Auto Scaling系統權限原則參考。
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。 |