運維 ECS 執行個體的目的是保持 ECS 執行個體的最佳狀態以及確保排錯的效率,但是手動維護會花費您大量的時間和精力,因此阿里雲研製了 雲助手,用以解決如何自動化、批量處理日常維護任務。本文舉例如何使用雲助手 API,為 ECS 執行個體執行相應命令,達到自動化運維 ECS 執行個體的目的。
命令類型介紹
目前,雲助手支援如下三種命令類型。
命令類型 | 參數 | 描述 |
---|---|---|
Shell 指令碼或直譯式程式 | RunShellScript | 為運行中的 Linux 執行個體執行 Shell 指令碼或直譯式程式,命令內容為需要執行的 Shell 指令碼或直譯式程式內容。 |
PowerShell 指令碼或直譯式程式 | RunPowerShellScript | 為運行中的 Windows 執行個體執行 PowerShell 指令碼或直譯式程式,命令內容為需要執行的 PowerShell 指令碼或直譯式程式內容。 |
Bat 指令碼或直譯式程式 | RunBatScript | 為運行中的 Windows 執行個體執行 Bat 指令碼或直譯式程式,命令內容為需要執行的 Bat 指令碼或直譯式程式內容。 |
前提條件
您需要確保目標 ECS 執行個體的網路類型為 專有網路(VPC)。
目標 ECS 執行個體的狀態必須為 運行中(
Running
)。目標 ECS 執行個體必須預先安裝雲助手用戶端。您可以參閱 阿里雲助手 安裝並使用雲助手用戶端。
執行類型為 PowerShell 的命令時,您需要確保目標 Windows 執行個體已經配置了 PowerShell 模組。
以下樣本在命令列工具中完成,您需要確保您已經安裝了阿里雲命令列工具 CLI(Command-Line Interface)。
Windows 執行個體參閱 線上安裝命令列工具和 SDK。
Linux 執行個體參閱 線上安裝命令列工具和 SDK。
您需要 升級 SDK。
修改 CLI 配置:
- 下載檔案 aliyunOpenApiData.py。
- 使用下載的檔案替換路徑中 %python_install_path%\Lib\site-packages\aliyuncli 中的檔案 aliyunOpenApiData.py。
關於如何配置阿里雲 CLI,參閱文檔 配置命令列工具和 SDK。
操作步驟
以下舉例說明怎麼在阿里雲 CLI 中通過 API 使用雲助手,為 ECS 執行個體執行相應命令。以執行一條 echo 123
命令為例。
在本機電腦的 CMD、PowerShell 或者 Shell 中運行
aliyuncli ecs CreateCommand --CommandContent ZWNobyAxMjM= --Type RunShellScript --Name test --Description test
建立命令(CreateCommand
)。注意:
CommandContent
中的ZWNobyAxMjM=
是命令echo 123
轉化後的 Base64 碼。關於 Base 64 編碼或者解碼,您可以參閱 Wikipedia 相關介紹。- 如果目標 ECS 執行個體為 Windows 執行個體,將
type
修改為RunBatScript
或者RunPowershellScript
。 - 建立成功後,將返回
CommandId
資訊。
運行
aliyuncli ecs InvokeCommand --InstanceIds your-vm-instance-id1 instance-id2 --CommandId your-command-id --Timed false
執行命令(InvokeCommand
)。注意:
InstanceIds
為您的 ECS 執行個體 ID,支援多台 ECS 執行個體,最多 100 台。Timed
表示是否為週期性任務,Timed True
表示是週期性任務,Timed False
表示不是週期性任務。- 當您的任務為週期性任務時,即參數
Timed
取值為True
時,您需要通過參數Frequency
指定周期,例如0 */20 * * * *
表示周期為每 20 分鐘。更多關於 Cron 運算式詳情,請參閱 Cron 運算式取值說明。 - 返回結果為所有的目標 ECS 執行個體返回一個共同的
InvokeId
。您可以使用該InvokeId
查詢命令的執行情況。
(可選)運行
aliyuncli ecs DescribeInvocations --InstanceId your-vm-instance-id --InvokeId your-invoke-id
查看命令執行狀態(DescribeInvocations
)。其中,InvokeId
是 第二步 為 ECS 執行個體執行命令時返回的執行 ID。返回參數
InvokeStatus
為Finished
時僅表示命令進程 執行完成,不代表一定有預期的命令效果,您需要通過 DescribeInvocationResults 中的參數Output
查看實際的具體執行結果。(可選)運行
aliyuncli ecs DescribeInvocationResults --InstanceId your-vm-instance-id --InvokeId your-invoke-id
查看指定 ECS 執行個體的命令的實際執行結果(DescribeInvocationResults
)。其中,InvokeId
是 第二步 為 ECS 執行個體執行命令時返回的執行 ID。
在 建立命令(CreateCommand
) 時,您還可以為命令設定如下請求參數。
命令屬性 | 參數 | 描述 |
---|---|---|
執行目錄 | WorkingDir | 命令將在 ECS 執行個體中的什麼路徑下執行。預設值:
|
逾時時間 | TimeOut | 修改命令在 ECS 執行個體中執行時最大的逾時時間,單位為秒。 當因為某種原因無法運行您建立的命令時,會出現逾時現象;逾時後,雲助手用戶端會強制終止命令進程,即取消命令的 PID。 參數取值必須大於等於 60 ,如果取值小於 60 ,預設為 60 秒。預設值:3600
|
通過 Python SDK 使用雲助手的完整程式碼範例
您也可以通過 阿里雲 SDK 使用雲助手。關於如何配置阿里雲 SDK,參閱文檔 配置命令列工具和 SDK。以下為通過 Python SDK 使用雲助手的完整程式碼範例。
# coding=utf-8
# if the python sdk is not install using 'sudo pip install aliyun-python-sdk-ecs'
# if the python sdk is install using 'sudo pip install --upgrade aliyun-python-sdk-ecs'
# make sure the sdk version is 2.1.2, you can use command 'pip show aliyun-python-sdk-ecs' to check
import json
import logging
import os
import time
import datetime
import base64
from aliyunsdkcore import client
from aliyunsdkecs.request.v20140526.CreateCommandRequest import CreateCommandRequest
from aliyunsdkecs.request.v20140526.InvokeCommandRequest import InvokeCommandRequest
from aliyunsdkecs.request.v20140526.DescribeInvocationResultsRequest import DescribeInvocationResultsRequest
# configuration the log output formatter, if you want to save the output to file,
# append ",filename='ecs_invoke.log'" after datefmt.
logging.basicConfig(level=logging.INFO,
format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s',
datefmt='%a, %d %b %Y %H:%M:%S',filename='aliyun_assist_openapi_test.log', filemode='w')
#access_key = 'Your Access Key Id'
#acess_key_secrect = 'Your Access Key Secrect'
#region_name = 'cn-shanghai'
#zone_id = 'cn-shanghai-b'
access_key = 'LTAIXXXXXXXXXXXX'
acess_key_secrect = '4dZXXXXXXXXXXXXXXXXXXXXXXXX'
region_name = 'cn-hangzhou'
zone_id = 'cn-hangzhou-f'
clt = client.AcsClient(access_key, acess_key_secrect, region_name)
def create_command(command_content, type, name, description):
request = CreateCommandRequest()
request.set_CommandContent(command_content)
request.set_Type(type)
request.set_Name(name)
request.set_Description(description)
response = _send_request(request)
if response is None:
return None
command_id = response.get('CommandId')
return command_id;
def invoke_command(instance_id, command_id, timed, cronat):
request = InvokeCommandRequest()
request.set_Timed(timed)
InstanceIds = [instance_id]
request.set_InstanceIds(InstanceIds)
request.set_CommandId(command_id)
request.set_Frequency(cronat)
response = _send_request(request)
invoke_id = response.get('InvokeId')
return invoke_id;
def get_task_output_by_id(instance_id, invoke_id):
logging.info("Check instance %s invoke_id is %s", instance_id, invoke_id)
request = DescribeInvocationResultsRequest()
request.set_InstanceId(instance_id)
request.set_InvokeId(invoke_id)
response = _send_request(request)
invoke_detail = None
output = None
if response is not None:
result_list = response.get('Invocation').get('InvocationResults').get('InvocationResult')
for item in result_list:
invoke_detail = item
output = base64.b64decode(item.get('Output'))
break;
return output;
def execute_command(instance_id):
command_str = 'yum check-update'
command_id = create_command(base64.b64encode(command_str), 'RunShellScript', 'test', 'test')
if(command_id is None):
logging.info('create command failed')
return
invoke_id = invoke_command(instance_id, command_id, 'false', '')
if(invoke_id is None):
logging.info('invoke command failed')
return
time.sleep(15)
output = get_task_output_by_id(instance_id, invoke_id)
if(output is None):
logging.info('get result failed')
return
logging.info("output: %s is \n", output)
# send open api request
def _send_request(request):
request.set_accept_format('json')
try:
response_str = clt.do_action(request)
logging.info(response_str)
response_detail = json.loads(response_str)
return response_detail
except Exception as e:
logging.error(e)
if __name__ == '__main__':
execute_command('i-bp17zhpbXXXXXXXXXXXXX')
相關連結
以上樣本示範了如何通過阿里雲 CLI 以及雲助手 API CreateCommand、InvokeCommand、DescribeInvocations 和 DescribeInvocationResults 自動化運維 ECS 執行個體,您還可以使用雲助手其他 API 便捷地管理您的 ECS 執行個體。
- StopInvocation:停止進行中的命令進程
- ModifyCommand:修改已建立的命令的內容
- DescribeCommands:查詢您已經建立的命令
- DeleteCommand:刪除已建立的命令