全部產品
Search
文件中心

:使用Python SDK執行滾動升級任務

更新時間:Oct 25, 2024

通過阿里雲Python SDK,您不用複雜編程即可訪問阿里雲服務。本教程以運行Linux系統的電腦為例,介紹如何使用阿里雲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_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。