全部產品
Search
文件中心

Elastic Compute Service:通過雲助手命令停止或重啟執行個體

更新時間:Nov 27, 2024

本文介紹如何通過雲助手命令停止或重啟執行個體。

前提條件

  • 執行個體的狀態必須為運行中(Running)。

  • 目標執行個體已安裝雲助手Agent。具體操作,請參見安裝雲助手Agent

(推薦)通過指定特殊退出碼停止或重啟執行個體

通過雲助手執行命令來停止或重啟執行個體時,建議您在命令末尾指定退出碼,以保證命令執行狀態的準確性與即時性。如果您直接通過命令停止或重啟執行個體,即使停止或重啟操作是命令的最後一步,由於雲助手Agent不儲存停止或重啟操作前的執行狀態,導致無法上報執行結果,命令執行狀態也可能無法正確更新。

重要

請確保目標執行個體所安裝的雲助手Agent不低於以下版本:

  • Linux:2.2.3.317

  • Windows:2.1.3.317

如果執行命令時報錯,請將用戶端更新至最新版本。具體操作,請參見升級或禁止升級雲助手Agent

  1. 登入ECS管理主控台

  2. 在左側導覽列,選擇營運與監控 > 雲助手

  3. 在頁面左側頂部,選擇目標資源所在的資源群組和地區。地區

  4. 在頁面右上方,單擊建立/執行命令

  5. 進入命令信息地區,設定相關參數。更多資訊,請參見建立並執行命令

  6. 命令內容末尾設定對應的退出碼。

    • 當您在命令中需要停止執行個體時,您可以指定以下退出碼。

      作業系統

      退出碼

      命令樣本

      Linux

      193

      # 以Shell命令為例,以下命令以退出碼193返回,會觸發停止執行個體的動作
      exit 193

      Windows

      3009

      # 以PowerShell命令為例,以下命令以退出碼3009返回,會觸發停止執行個體的動作
      exit 3009
    • 當您在命令中需要重啟執行個體時,您可以指定以下退出碼。

      作業系統

      退出碼

      命令樣本

      Linux

      194

      # 以Shell命令為例,以下命令以退出碼194返回,會觸發重啟執行個體的動作
      exit 194

      Windows

      3010

      # 以PowerShell命令為例,以下命令以退出碼3010返回,會觸發重啟執行個體的動作
      exit 3010
  7. 選擇實例選擇受管理的執行個體地區,選中需要執行命令的目標執行個體。

    說明

    受管理的執行個體是雲助手託管的非阿里雲伺服器,更多資訊,請參見阿里雲受管理的執行個體

  8. 單擊執行並儲存執行,立即開始執行任務。

使用OpenAPI批量執行雲助手命令重啟執行個體

阿里雲提供了豐富的OpenAPI供您管理雲上資源,本步驟以在本地Linux環境中運行Python代碼調用OpenAPI為例,示範如何批量執行命令並重啟執行個體。

  1. 準備執行命令所需的資訊。

    1. 擷取AccessKey。

      建議您擷取RAM使用者的AccessKey,具體操作,請參見建立AccessKey

    2. 擷取地區ID。

      您可以調用DescribeRegions擷取地區列表,詳細的參數說明,請參見DescribeRegions

    3. 擷取待執行命令的執行個體ID。

      您可以調用DescribeInstances篩選符合指定條件的執行個體,例如狀態為運行中的執行個體、綁定了指定標籤的執行個體。詳細的參數說明,請參見DescribeInstances

  2. 在本地配置環境並運行範例程式碼。

    1. 安裝阿里雲Python SDK。

      sudo pip install aliyun-python-sdk-ecs
    2. 升級Python SDK至最新版本。

      sudo pip install --upgrade aliyun-python-sdk-ecs
    3. 建立.py檔案,並寫入範例程式碼。

      請用您擷取的資訊替換範例程式碼中的以下資訊:

      • AccessKey ID:

        access_key = os.environ['ALIBABA_CLOUD_ACCESS_KEY_ID']

      • AccessKey Secret:

        access_key_secret = os.environ['ALIBABA_CLOUD_ACCESS_KEY_SECRET']

      • Region ID:

        region_id = '<yourRegionId>'

      • 執行個體ID:

        ins_ids= ["i-bp185fcs****","i-bp14wwh****","i-bp13jbr****"]

      單擊查看範例程式碼

      # coding=utf-8
      # If the Python sdk is not installed, run 'sudo pip install aliyun-python-sdk-ecs'.
      # Make sure you're using the latest sdk version.
      # Run 'sudo pip install --upgrade aliyun-python-sdk-ecs' to upgrade.
      
      import json
      import sys
      import base64
      import time
      import logging
      import os
      from aliyunsdkcore.client import AcsClient
      from aliyunsdkcore.acs_exception.exceptions import ClientException
      from aliyunsdkcore.acs_exception.exceptions import ServerException
      from aliyunsdkecs.request.v20140526.RunCommandRequest import RunCommandRequest
      from aliyunsdkecs.request.v20140526.DescribeInvocationResultsRequest import DescribeInvocationResultsRequest
      from aliyunsdkecs.request.v20140526.RebootInstancesRequest import RebootInstancesRequest
      from aliyunsdkecs.request.v20140526.DescribeInstancesRequest import DescribeInstancesRequest
      
      # Configure the log output formatter
      logging.basicConfig(level=logging.INFO,
                          format="%(asctime)s %(name)s [%(levelname)s]: %(message)s",
                          datefmt='%m-%d %H:%M')
      
      logger = logging.getLogger()
      
      # 請確保代碼運行環境設定了環境變數 ALIBABA_CLOUD_ACCESS_KEY_ID 和 ALIBABA_CLOUD_ACCESS_KEY_SECRET。
      # 工程代碼泄露可能會導致 AccessKey 泄露,並威脅帳號下所有資源的安全性。以下程式碼範例使用環境變數擷取 AccessKey 的方式進行調用,僅供參考,建議使用更安全的 STS 方式。
      access_key = os.environ['ALIBABA_CLOUD_ACCESS_KEY_ID']  
      access_key_secret = os.environ['ALIBABA_CLOUD_ACCESS_KEY_SECRET']  
      region_id = '<yourRegionId>'  # 請填入您擷取的Region ID
      
      client = AcsClient(access_key, access_key_secret, region_id)
      
      def base64_decode(content, code='utf-8'):
          if sys.version_info.major == 2:
              return base64.b64decode(content)
          else:
              return base64.b64decode(content).decode(code)
      
      def get_invoke_result(invoke_id):
          request = DescribeInvocationResultsRequest()
          request.set_accept_format('json')
      
          request.set_InvokeId(invoke_id)
          response = client.do_action_with_exception(request)
          response_details = json.loads(response)["Invocation"]["InvocationResults"]["InvocationResult"]
          dict_res = { detail.get("InstanceId",""):{"status": detail.get("InvocationStatus",""),"output":base64_decode(detail.get("Output",""))}  for detail in response_details }
          return dict_res
      
      def get_instances_status(instance_ids):
          request = DescribeInstancesRequest()
          request.set_accept_format('json')
          request.set_InstanceIds(instance_ids)
          response = client.do_action_with_exception(request)
          response_details = json.loads(response)["Instances"]["Instance"]
          dict_res = { detail.get("InstanceId",""):{"status":detail.get("Status","")} for detail in response_details }
          return dict_res
      
      def run_command(cmdtype,cmdcontent,instance_ids,timeout=60):
          """
          cmdtype: 命令類型: RunBatScript;RunPowerShellScript;RunShellScript
          cmdcontent: 命令內容
          instance_ids 執行個體ID列表
          """
          try:
              request = RunCommandRequest()
              request.set_accept_format('json')
      
              request.set_Type(cmdtype)
              request.set_CommandContent(cmdcontent)
              request.set_InstanceIds(instance_ids)
              # 執行命令的逾時時間,單位s,預設是60s,請根據執行的實際命令來設定合適的逾時時間
              request.set_Timeout(timeout)
              response = client.do_action_with_exception(request)
              invoke_id = json.loads(response).get("InvokeId")
              return invoke_id
          except Exception as e:
              logger.error("run command failed")
      
      def reboot_instances(instance_ids,Force=False):
          """
          instance_ids: 需要重啟的執行個體列表
          Force: 是否強制重啟,預設否
          """
          request = RebootInstancesRequest()
          request.set_accept_format('json')
          request.set_InstanceIds(instance_ids)
          request.set_ForceReboot(Force)
          response = client.do_action_with_exception(request)
      
      def wait_invoke_finished_get_out(invoke_id,wait_count,wait_interval):
          for i in range(wait_count):
              result = get_invoke_result(invoke_id)
              if set([res["status"] for _,res in result.items()]) & set(["Running","Pending","Stopping"]):
                  time.sleep(wait_interval)
              else:
                  return result
          return result
      
      def wait_instance_reboot_ready(ins_ids,wait_count,wait_interval):
          for i in range(wait_count):
              result = get_instances_status(ins_ids)
              if set([res["status"] for _,res in result.items()]) != set(["Running"]):
                  time.sleep(wait_interval)
              else:
                  return result
          return result
      
      def run_task():
          # 設定雲助手命令的命令類型
          cmdtype = "RunShellScript"
          # 設定雲助手命令的命令內容
          cmdcontent = """
          #!/bin/bash
          echo helloworld
          """
          # 設定逾時時間
          timeout = 60
          # 請填入需要執行命令並重啟的執行個體的ID
          ins_ids= ["i-bp185fcs****","i-bp14wwh****","i-bp13jbr****"]
      
          # 執行命令
          invoke_id = run_command(cmdtype,cmdcontent,ins_ids,timeout)
          logger.info("run command,invoke-id:%s" % invoke_id)
      
          # 等待命令執行完成,迴圈查詢10次,每次間隔5秒,查詢次數和間隔請根據實際情況配置
          invoke_result = wait_invoke_finished_get_out(invoke_id,10,5)
          for ins_id,res in invoke_result.items():
              logger.info("instance %s command execute finished,status: %s,output:%s" %(ins_id,res["status"],res["output"]))
      
          # 重啟執行個體
          logger.warn("reboot instance Now")
          reboot_instances(ins_ids)
      
          time.sleep(5)
          # 等待執行個體重啟至Running狀態,迴圈查詢30次,每次間隔10秒
          reboot_result = wait_instance_reboot_ready(ins_ids,30,10)
          logger.warn("reboot instance Finished")
          for ins_id,res in reboot_result.items():
              logger.info("instance %s status: %s" %(ins_id,res["status"]))
      
      if __name__ == '__main__':
          run_task()
    4. 運行.py檔案。

      運行效果如下圖所示,對3台執行個體執行命令輸出helloworld,然後自動重啟執行個體。openapi-exec-reboot

使用OOS批量執行雲助手命令重啟執行個體

系統營運管理OOS是阿里雲提供的雲上自動化營運服務,您可以通過模板定義營運動作,然後執行模板自動化運行營運任務。

  1. 進入模板配置頁面。

    1. 登入OOS控制台

    2. 在左側導覽列,單擊自動化任務 > 自訂工作範本

    3. 單擊建立模板

  2. 完成模板配置。

    1. 建立模板頁面,保持預設配置,然後單擊下一步

    2. 單擊YAML頁簽,並輸入以下代碼。

      單擊查看範例程式碼

      FormatVersion: OOS-2019-06-01
      Description:
        en: Bulky run command on ECS instances and reboot instance.
        zh-cn: 批量在多台ECS執行個體上運行雲助手命令並重啟執行個體。
        name-en: ACS-ECS-BulkyRunCommandRboot
        name-zh-cn: 批量在ECS執行個體上運行命令並重啟執行個體
        categories:
          - run_command
      Parameters:
        regionId:
          Type: String
          Description:
            en: The id of region
            zh-cn: 地區ID
          Label:
            en: Region
            zh-cn: 地區
          AssociationProperty: RegionId
          Default: '{{ ACS::RegionId }}'
        targets:
          Type: Json
          Label:
            en: TargetInstance
            zh-cn: 目標執行個體
          AssociationProperty: Targets
          AssociationPropertyMetadata:
            ResourceType: ALIYUN::ECS::Instance
            RegionId: regionId
        commandType:
          Description:
            en: The type of command
            zh-cn: 雲助手命令類型
          Label:
            en: CommandType
            zh-cn: 雲助手命令類型
          Type: String
          AllowedValues:
            - RunBatScript
            - RunPowerShellScript
            - RunShellScript
          Default: RunShellScript
        commandContent:
          Description:
            en: Command content to run in ECS instance
            zh-cn: 在ECS執行個體中執行的雲助手命令
          Label:
            en: CommandContent
            zh-cn: 雲助手命令
          Type: String
          MaxLength: 16384
          AssociationProperty: Code
          Default: echo hello
        workingDir:
          Description:
            en: 'The directory where the created command runs on the ECS instances.Linux instances: under the home directory of the administrator (root user): /root.Windows instances: under the directory where the process of the Cloud Assistant client is located, such asC:\Windows\System32.'
            zh-cn: 指令碼在ECS執行個體中的運行目錄。Linux系統執行個體預設在管理員(root使用者)的home目錄下,即/root。Windows系統執行個體預設在雲助手Agent進程所在目錄,例如C:\Windows\System32。
          Label:
            en: WorkingDir
            zh-cn: 運行目錄
          Type: String
          Default: ''
        timeout:
          Description:
            en: The value of the invocation timeout period of a command on ECS instances
            zh-cn: ECS執行個體中執行命令的逾時時間
          Label:
            en: Timeout
            zh-cn: 逾時時間
          Type: Number
          Default: 600
        enableParameter:
          Description:
            en: Whether to include secret parameters or custom parameters in the command
            zh-cn: 命令中是否包含加密參數或自訂參數
          Label:
            en: EnableParameter
            zh-cn: 命令中是否包含加密參數或自訂參數
          Type: Boolean
          Default: false
        username:
          Description:
            en: The username that is used to run the command on the ECS instance
            zh-cn: 在ECS執行個體中執行命令的使用者名稱稱
          Label:
            en: Username
            zh-cn: 執行命令的使用者名稱稱
          Type: String
          Default: ''
        windowsPasswordName:
          Description:
            en: The name of the password used to run the command on a Windows instance
            zh-cn: 在Windows執行個體中執行命令的使用者的密碼名稱
          Label:
            en: WindowsPasswordName
            zh-cn: 在Windows執行個體中執行命令的使用者的密碼名稱
          Type: String
          Default: ''
          AssociationProperty: SecretParameterName
        rateControl:
          Description:
            en: Concurrency ratio of task execution
            zh-cn: 任務執行的並發比率
          Label:
            en: RateControl
            zh-cn: 任務執行的並發比率
          Type: Json
          AssociationProperty: RateControl
          Default:
            Mode: Concurrency
            MaxErrors: 0
            Concurrency: 10
        OOSAssumeRole:
          Description:
            en: The RAM role to be assumed by OOS
            zh-cn: OOS扮演的RAM角色
          Label:
            en: OOSAssumeRole
            zh-cn: OOS扮演的RAM角色
          Type: String
          Default: OOSServiceRole
      RamRole: '{{ OOSAssumeRole }}'
      Tasks:
        - Name: getInstance
          Description:
            en: Views the ECS instances.
            zh-cn: 擷取ECS執行個體。
          Action: ACS::SelectTargets
          Properties:
            ResourceType: ALIYUN::ECS::Instance
            RegionId: '{{ regionId }}'
            Filters:
              - '{{ targets }}'
          Outputs:
            instanceIds:
              Type: List
              ValueSelector: Instances.Instance[].InstanceId
        - Name: runCommand
          Action: ACS::ECS::RunCommand
          Description:
            en: Execute cloud assistant command.
            zh-cn: 執行雲助手命令。
          Properties:
            regionId: '{{ regionId }}'
            commandContent: '{{ commandContent }}'
            instanceId: '{{ ACS::TaskLoopItem }}'
            commandType: '{{ commandType }}'
            workingDir: '{{ workingDir }}'
            timeout: '{{ timeout }}'
            enableParameter: '{{ enableParameter }}'
            username: '{{ username }}'
            windowsPasswordName: '{{ windowsPasswordName }}'
          Loop:
            RateControl: '{{ rateControl }}'
            Items: '{{ getInstance.instanceIds }}'
            Outputs:
              commandOutputs:
                AggregateType: Fn::ListJoin
                AggregateField: commandOutput
          Outputs:
            commandOutput:
              Type: String
              ValueSelector: invocationOutput
        - Name: rebootInstance
          Action: ACS::ECS::RebootInstance
          Description:
            en: Restarts the ECS instances.
            zh-cn: 重啟執行個體。
          Properties:
            regionId: '{{ regionId }}'
            instanceId: '{{ ACS::TaskLoopItem }}'
          Loop:
            RateControl: '{{ rateControl }}'
            Items: '{{ getInstance.instanceIds }}'
      Outputs:
        instanceIds:
          Type: List
          Value: '{{ getInstance.instanceIds }}'
    3. 單擊建立模板

    4. 在彈出的對話方塊中,輸入模板名稱runcommand_reboot_instances,然後單擊完成建立

  3. 執行模板。

    1. 找到剛建立的模板,在操作列單擊建立執行

    2. 完成執行配置。

      按提示逐步完成配置,在設定參數頁面選擇多台執行個體,其他設定保持預設即可。exec-temp

    3. 確定頁面,單擊建立

      建立執行後自動開始執行模板,並跳轉至執行的基本資料頁面,等待執行狀態變為成功後即執行完成。

  4. 查看任務執行過程和各任務節點執行詳情。

    1. 執行步驟和結果地區,單擊查看執行流程圖查看執行過程。

      image

    2. 單擊執行雲助手命令,在迴圈工作清單頁簽下,查看各任務節點執行詳情。如下圖所示,可以看出預定動作均已成功完成。

      image