创建/执行命令

当需要对实例执行重复性运维任务时,例如安装软件、更新配置、采集日志等,手动登录每台实例操作效率低下、容易出错。云助手支持通过脚本(如 Shell、PowerShell)在多台目标实例上安全、可靠地执行任务。

操作步骤

控制台

  1. 访问ECS控制台-云助手

  2. 在页面左侧顶部,选择目标资源所在的资源组和地域。地域

  3. ECS 云助手页面右上角,单击创建/执行命令

  4. 命令信息区域,完成以下配置:

    • 命令内容:可开启使用参数

      命令内容在Base64编码后,选择执行并保存命令时不能超过18 KB,选择执行时不能超过24 KB。
      • 自定义参数:使用{{parameter}}格式定义参数,手动赋值,能满足动态取值以及一值多用的场景。

      • 内置参数:云助手提供了一些内置参数,无需手动赋值,可在执行时自动替换,例如 {{ACS::RegionId}}(地域 ID)、{{ACS::InstanceId}}(实例 ID)等。

      #!/bin/bash
      # 示例
      # {{name}}是自定义参数,需要在命令内容编写完成后进行手动赋值
      echo {{name}}
      
      # {{ACS::RegionId}}是内置参数,无需手动赋值
      echo {{ACS::RegionId}}
    • 执行计划

      • 仅预检:只预检此次请求,命令内容不会实际生效,检查项包括请求参数、实例执行环境、云助手Agent运行状态等。

      • 定时执行

        • 固定时间间隔执行:基于Rate表达式,仅适用于固定的时间间隔。

          设置的时间间隔不大于7天、不小于60秒,且需大于定时任务的超时时间。
        • 基于时钟定时执行:基于Cron表达式,配置灵活,适用于较复杂的定时任务执行场景。

    • 执行用户:默认为root (Linux) 或System (Windows)。建议遵循最小权限原则,使用普通用户执行。

    • 执行路径:脚本在实例内的执行目录。Linux 默认在 /root 目录下,Windows 默认在 C:\Windows\system32 目录下。为确保脚本在预期路径下执行,建议在脚本开头使用cd命令切换目录。

    • 超时时间:默认为 60 秒。可设定超时范围为10~86400秒(24小时)。

    • 任务终止模式

      • 脚本进程:停止任务时会终止脚本进程。

      • 进程树:停止任务时会终止进程树(脚本进程以及它创建的所有子进程的集合)。

  5. 选择实例或者选择托管实例区域,选中需要执行命令的目标实例。

    可选择多台实例,最多支持100台。
  6. 单击执行并保存执行,开始执行任务。

CLI

  1. 准备命令内容

    RunCommand 接口支持将 CommandContent 参数值设置为明文内容或 Base64 编码后的内容。Base64 编码后的内容,则必须设置ContentEncoding参数为Base64。使用以下命令对脚本内容进行Base64编码:

    Linux / macOS

    # 编码字符串 "hello world"
    # 使用 -n 来避免末尾的换行符被编码
    echo -n "hello world" | base64
    # 输出: aGVsbG8gd29ybGQ=

    Windows (PowerShell)

    # 编码字符串 "hello world"
    [Convert]::ToBase64String([System.Text.Encoding]::UTF8.GetBytes("hello world"))
    # 输出: aGVsbG8gd29ybGQ=
  2. 执行命令

    使用aliyun ecs RunCommand命令执行。参数说明,请参见RunCommand

    • 示例 1:在单台实例上立即执行命令

      # 将 "yum -y update" Base64编码后为 "eXVtIC15IHVwZGF0ZQ=="
      aliyun ecs RunCommand --RegionId 'cn-hangzhou' \
        --Type 'RunShellScript' \
        --ContentEncoding 'Base64' \
        --CommandContent 'eXVtIC15IHVwZGF0ZQ==' \
        --InstanceId.1 'i-bp1************de01' \
    • 示例 2:在多台实例上批量执行命令

      # 重复使用 --InstanceId.N 参数指定多个实例
      aliyun ecs RunCommand --RegionId 'cn-hangzhou' \
        --Type 'RunShellScript' \
        --ContentEncoding 'Base64' \
        --CommandContent 'eXVtIC15IHVwZGF0ZQ==' \
        --InstanceId.1 'i-bp1************de01' \
        --InstanceId.2 'i-bp1************de02' \
        --InstanceId.3 'i-bp1************de03'
    • 示例 3:创建 Cron 定时任务

      # Frequency 参数使用 Cron 表达式和时区
      # 示例:在上海时区,2024 年每天中午 12:00 执行
      aliyun ecs RunCommand --RegionId 'cn-hangzhou' \
        --Type 'RunShellScript' \
        --ContentEncoding 'Base64' \
        --CommandContent 'eXVtIC15IHVwZGF0ZQ==' \
        --RepeatMode 'Period' \
        --Frequency '0 0 12 * * ? 2024 Asia/Shanghai' \
        --InstanceId.1 'i-bp1************de01'
  3. 查询执行结果

    RunCommand会返回InvokeId,使用aliyun ecs DescribeInvocationResults命令和InvokeId查询详细结果。参数说明,请参见DescribeInvocationResults

    # 将 t-hz018qlm86d**** 替换为您的 InvokeId
    aliyun ecs DescribeInvocationResults --RegionId 'cn-hangzhou' --InvokeId '<invoke_id>'

    返回结果中的 Output 字段即为脚本的标准输出(STDOUT),ErrorInfoErrorMsg 字段则包含错误信息。

配额与限制

  • 实例数量:调用API执行命令时最多可以选择100台实例,可申请提升配额

  • 命令保存数量:在单个阿里云地域下,默认可以保存500条云助手命令,配额随云服务器使用情况可能会增加。可申请提升配额

    在立即执行命令时,如果只执行但不保存命令,则不占用云助手命令配额。
  • 功能与客户端版本依赖:部分高级功能依赖于特定版本的云助手 Agent。更多信息,请参见支持功能及版本

生产应用建议

  • 幂等性保障

    在通过 API 或 CLI 调用RunCommand接口时,为避免网络重试等问题导致命令重复执行,建议设置 ClientToken参数来保证幂等性

  • 监控与告警

    监控云助手执行状态,特别是 Failed 状态的执行任务。通过事件总线(EventBridge)或云监控(CloudMonitor)订阅云助手事件对命令失败事件设置告警,以便及时发现和处理问题。

常见问题

Q:如何检查 ECS 实例上的云助手 Agent 版本?

A:支持通过控制台或者登录实例内部查看云助手版本。具体步骤,请参见查看ECS实例的云助手Agent信息

Q:创建了一个固定时间间隔执行的定时任务,它是会立即执行一次,还是会等待10分钟后才首次执行?

A:任务不会在创建后立即执行,将在设定的时间间隔过后首次执行,并且执行间隔只基于固定频率,与任务实际执行需要的时间无关。如果您在上午10:00创建了一个每10分钟执行一次的任务,那么它的首次执行时间将会是上午10:10,第二次执行时间是10:20,以此类推。

Q:命令执行失败,如何排查?

A:1. 在控制台的执行结果页面查看详细的Output日志,分析脚本的报错信息。

2. 检查命令执行用户是否对相关文件或目录有读写执行权限。

3. 确认脚本语法是否正确,是否能在实例上本地手动执行成功。

4. 检查实例状态是否为运行中,网络是否正常。

5. 如果返回ClientNeedUpgrade错误,请先检查并升级云助手Agent

更多信息,请参见查看执行结果及修复常见问题