本文介紹如何通過云助手命令停止或重啟實例。
前提條件
實例的狀態必須為運行中(Running)。
目標實例已安裝云助手Agent。具體操作,請參見安裝云助手Agent。
(推薦)通過指定特殊退出碼停止或重啟實例
通過云助手執行命令來停止或重啟實例時,建議您在命令末尾指定退出碼,以保證命令執行狀態的準確性與實時性。如果您直接通過命令停止或重啟實例,即使停止或重啟操作是命令的最后一步,由于云助手Agent不保存停止或重啟操作前的執行狀態,導致無法上報執行結果,命令執行狀態也可能無法正確更新。
請確保目標實例所安裝的云助手Agent不低于以下版本:
Linux:2.2.3.317
Windows:2.1.3.317
如果執行命令時報錯,請將客戶端更新至最新版本。具體操作,請參見升級或禁止升級云助手Agent。
登錄ECS管理控制臺。
在左側導航欄,選擇 。
在頁面左側頂部,選擇目標資源所在的資源組和地域。
在頁面右上角,單擊創建/執行命令。
進入命令信息區域,設置相關參數。更多信息,請參見創建并執行命令。
在命令內容末尾設置對應的退出碼。
當您在命令中需要停止實例時,您可以指定以下退出碼。
操作系統
退出碼
命令示例
Linux
193
# 以Shell命令為例,以下命令以退出碼193返回,會觸發停止實例的動作 exit 193
Windows
3009
# 以PowerShell命令為例,以下命令以退出碼3009返回,會觸發停止實例的動作 exit 3009
當您在命令中需要重啟實例時,您可以指定以下退出碼。
操作系統
退出碼
命令示例
Linux
194
# 以Shell命令為例,以下命令以退出碼194返回,會觸發重啟實例的動作 exit 194
Windows
3010
# 以PowerShell命令為例,以下命令以退出碼3010返回,會觸發重啟實例的動作 exit 3010
在選擇實例或選擇托管實例區域,選中需要執行命令的目標實例。
說明托管實例是云助手托管的非阿里云服務器,更多信息,請參見阿里云托管實例。
單擊執行并保存或執行,立即開始執行任務。
使用OpenAPI批量執行云助手命令重啟實例
阿里云提供了豐富的OpenAPI供您管理云上資源,本步驟以在本地Linux環境中運行Python代碼調用OpenAPI為例,演示如何批量執行命令并重啟實例。
準備執行命令所需的信息。
獲取AccessKey。
建議您獲取RAM用戶的AccessKey,具體操作,請參見創建AccessKey。
獲取地域ID。
您可以調用DescribeRegions獲取地域列表,詳細的參數說明,請參見DescribeRegions。
獲取待執行命令的實例ID。
您可以調用DescribeInstances篩選符合指定條件的實例,例如狀態為運行中的實例、綁定了指定標簽的實例。詳細的參數說明,請參見DescribeInstances。
在本地配置環境并運行示例代碼。
安裝阿里云Python SDK。
sudo pip install aliyun-python-sdk-ecs
升級Python SDK至最新版本。
sudo pip install --upgrade aliyun-python-sdk-ecs
創建
.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()
運行
.py
文件。運行效果如下圖所示,對3臺實例執行命令輸出
helloworld
,然后自動重啟實例。
使用OOS批量執行云助手命令重啟實例
系統運維管理OOS是阿里云提供的云上自動化運維服務,您可以通過模板定義運維動作,然后執行模板自動化運行運維任務。
進入模板配置頁面。
登錄OOS控制臺。
在左側導航欄,單擊
。單擊創建模板。
完成模板配置。
在創建模板頁面,保持默認配置,然后單擊下一步。
單擊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 }}'
單擊創建模板。
在彈出的對話框中,輸入模板名稱
runcommand_reboot_instances
,然后單擊完成創建。
執行模板。
找到剛創建的模板,在操作列單擊創建執行。
完成執行配置。
按提示逐步完成配置,在設置參數頁面選擇多臺實例,其他設置保持默認即可。
在確定頁面,單擊創建。
創建執行后自動開始執行模板,并跳轉至執行的基本信息頁面,等待執行狀態變為成功后即執行完成。
查看任務執行過程和各任務節點執行詳情。
在執行步驟和結果區域,單擊查看執行流程圖查看執行過程。
單擊執行云助手命令,在循環任務列表頁簽下,查看各任務節點執行詳情。如下圖所示,可以看出預定動作均已成功完成。