全部產品
Search
文件中心

Elastic Compute Service:使用雲助手自動化管理執行個體

更新時間:Aug 23, 2018

運維 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)。

  • 您需要 升級 SDK

  • 修改 CLI 配置:

    1. 下載檔案 aliyunOpenApiData.py
    2. 使用下載的檔案替換路徑中 %python_install_path%\Lib\site-packages\aliyuncli 中的檔案 aliyunOpenApiData.py。
      AliyunOpenApiData

關於如何配置阿里雲 CLI,參閱文檔 配置命令列工具和 SDK

操作步驟

以下舉例說明怎麼在阿里雲 CLI 中通過 API 使用雲助手,為 ECS 執行個體執行相應命令。以執行一條 echo 123 命令為例。

  1. 在本機電腦的 CMD、PowerShell 或者 Shell 中運行 aliyuncli ecs CreateCommand --CommandContent ZWNobyAxMjM= --Type RunShellScript --Name test --Description test 建立命令CreateCommand)。

    注意

    • CommandContent 中的 ZWNobyAxMjM= 是命令 echo 123 轉化後的 Base64 碼。關於 Base 64 編碼或者解碼,您可以參閱 Wikipedia 相關介紹。Base64
    • 如果目標 ECS 執行個體為 Windows 執行個體,將 type 修改為 RunBatScript 或者 RunPowershellScript
    • 建立成功後,將返回 CommandId 資訊。

    Example

  2. 運行 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 查詢命令的執行情況。
  3. (可選)運行 aliyuncli ecs DescribeInvocations --InstanceId your-vm-instance-id --InvokeId your-invoke-id 查看命令執行狀態DescribeInvocations)。其中,InvokeId第二步 為 ECS 執行個體執行命令時返回的執行 ID。

    返回參數 InvokeStatusFinished 時僅表示命令進程 執行完成,不代表一定有預期的命令效果,您需要通過 DescribeInvocationResults 中的參數 Output 查看實際的具體執行結果。

  4. (可選)運行 aliyuncli ecs DescribeInvocationResults --InstanceId your-vm-instance-id --InvokeId your-invoke-id 查看指定 ECS 執行個體的命令的實際執行結果DescribeInvocationResults)。其中,InvokeId第二步 為 ECS 執行個體執行命令時返回的執行 ID。

建立命令CreateCommand) 時,您還可以為命令設定如下請求參數。

命令屬性 參數 描述
執行目錄 WorkingDir 命令將在 ECS 執行個體中的什麼路徑下執行。預設值:
  • 對於 Linux 執行個體,預設在管理員 root 使用者的 home 目錄下,具體為 /root 目錄。
  • 對於 Windows 執行個體,預設在雲助手用戶端進程所在目錄,例如 C:\ProgramData\aliyun\assist\$(version)
逾時時間 TimeOut 修改命令在 ECS 執行個體中執行時最大的逾時時間,單位為秒。
當因為某種原因無法運行您建立的命令時,會出現逾時現象;逾時後,雲助手用戶端會強制終止命令進程,即取消命令的 PID。
參數取值必須大於等於 60,如果取值小於 60,預設為 60 秒。
預設值:3600
  • 單次執行
    • 逾時後,該命令針對指定的 ECS 執行個體的執行狀態(InvokeRecordStatus)變為執行失敗(Failed)。
  • 周期執行
    • 周期執行的逾時時間對每一次執行記錄均有效。
    • 某次執行逾時後,該次執行記錄的狀態(InvokeRecordStatus)變為執行失敗(Failed)。
    • 上次執行逾時與否不影響下一次執行。

通過 Python SDK 使用雲助手的完整程式碼範例

您也可以通過 阿里雲 SDK 使用雲助手。關於如何配置阿里雲 SDK,參閱文檔 配置命令列工具和 SDK。以下為通過 Python SDK 使用雲助手的完整程式碼範例。

  1. # coding=utf-8
  2. # if the python sdk is not install using 'sudo pip install aliyun-python-sdk-ecs'
  3. # if the python sdk is install using 'sudo pip install --upgrade aliyun-python-sdk-ecs'
  4. # make sure the sdk version is 2.1.2, you can use command 'pip show aliyun-python-sdk-ecs' to check
  5. import json
  6. import logging
  7. import os
  8. import time
  9. import datetime
  10. import base64
  11. from aliyunsdkcore import client
  12. from aliyunsdkecs.request.v20140526.CreateCommandRequest import CreateCommandRequest
  13. from aliyunsdkecs.request.v20140526.InvokeCommandRequest import InvokeCommandRequest
  14. from aliyunsdkecs.request.v20140526.DescribeInvocationResultsRequest import DescribeInvocationResultsRequest
  15. # configuration the log output formatter, if you want to save the output to file,
  16. # append ",filename='ecs_invoke.log'" after datefmt.
  17. logging.basicConfig(level=logging.INFO,
  18. format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s',
  19. datefmt='%a, %d %b %Y %H:%M:%S',filename='aliyun_assist_openapi_test.log', filemode='w')
  20. #access_key = 'Your Access Key Id'
  21. #acess_key_secrect = 'Your Access Key Secrect'
  22. #region_name = 'cn-shanghai'
  23. #zone_id = 'cn-shanghai-b'
  24. access_key = 'LTAIXXXXXXXXXXXX'
  25. acess_key_secrect = '4dZXXXXXXXXXXXXXXXXXXXXXXXX'
  26. region_name = 'cn-hangzhou'
  27. zone_id = 'cn-hangzhou-f'
  28. clt = client.AcsClient(access_key, acess_key_secrect, region_name)
  29. def create_command(command_content, type, name, description):
  30. request = CreateCommandRequest()
  31. request.set_CommandContent(command_content)
  32. request.set_Type(type)
  33. request.set_Name(name)
  34. request.set_Description(description)
  35. response = _send_request(request)
  36. if response is None:
  37. return None
  38. command_id = response.get('CommandId')
  39. return command_id;
  40. def invoke_command(instance_id, command_id, timed, cronat):
  41. request = InvokeCommandRequest()
  42. request.set_Timed(timed)
  43. InstanceIds = [instance_id]
  44. request.set_InstanceIds(InstanceIds)
  45. request.set_CommandId(command_id)
  46. request.set_Frequency(cronat)
  47. response = _send_request(request)
  48. invoke_id = response.get('InvokeId')
  49. return invoke_id;
  50. def get_task_output_by_id(instance_id, invoke_id):
  51. logging.info("Check instance %s invoke_id is %s", instance_id, invoke_id)
  52. request = DescribeInvocationResultsRequest()
  53. request.set_InstanceId(instance_id)
  54. request.set_InvokeId(invoke_id)
  55. response = _send_request(request)
  56. invoke_detail = None
  57. output = None
  58. if response is not None:
  59. result_list = response.get('Invocation').get('InvocationResults').get('InvocationResult')
  60. for item in result_list:
  61. invoke_detail = item
  62. output = base64.b64decode(item.get('Output'))
  63. break;
  64. return output;
  65. def execute_command(instance_id):
  66. command_str = 'yum check-update'
  67. command_id = create_command(base64.b64encode(command_str), 'RunShellScript', 'test', 'test')
  68. if(command_id is None):
  69. logging.info('create command failed')
  70. return
  71. invoke_id = invoke_command(instance_id, command_id, 'false', '')
  72. if(invoke_id is None):
  73. logging.info('invoke command failed')
  74. return
  75. time.sleep(15)
  76. output = get_task_output_by_id(instance_id, invoke_id)
  77. if(output is None):
  78. logging.info('get result failed')
  79. return
  80. logging.info("output: %s is \n", output)
  81. # send open api request
  82. def _send_request(request):
  83. request.set_accept_format('json')
  84. try:
  85. response_str = clt.do_action(request)
  86. logging.info(response_str)
  87. response_detail = json.loads(response_str)
  88. return response_detail
  89. except Exception as e:
  90. logging.error(e)
  91. if __name__ == '__main__':
  92. execute_command('i-bp17zhpbXXXXXXXXXXXXX')

相關連結

以上樣本示範了如何通過阿里雲 CLI 以及雲助手 API CreateCommandInvokeCommandDescribeInvocationsDescribeInvocationResults 自動化運維 ECS 執行個體,您還可以使用雲助手其他 API 便捷地管理您的 ECS 執行個體。