使用 AWS OpsWorks Stacks 代理 CLI - AWS OpsWorks

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

使用 AWS OpsWorks Stacks 代理 CLI

重要

AWS OpsWorks Stacks 不再接受新客户。在 2024 年 5 月 26 日之前,现有客户将能够照常使用 OpsWorks 控制台、API、CLI 和 CloudFormation 资源,届时这些工具或资源将停用。为准备此过渡,我们建议您尽快将堆栈过渡到AWS Systems Manager。有关更多信息,请参阅 AWS OpsWorks Stacks 生命周期终止常见问题解答将 AWS OpsWorks Stacks 应用程序迁移到 AWS Systems Manager Application Manager

注意

代理 CLI 仅适用于 Linux 实例。

在每个联机实例上,AWS OpsWorks Stacks 会安装一个与服务进行通信的代理。AWS OpsWorks Stacks 服务反过来会该代理发送命令,以执行任务,例如在生命周期事件发生时开始在实例上运行 Chef。在 Linux 实例中,代理公开了一个对故障排除非常有用的命令行界面 (CLI)。要运行代理 CLI 命令,请使用 SSH 连接到实例。然后,您就可以运行代理 CLI 命令来执行各种任务,包括以下任务:

有关如何设置与实例的 SSH 连接的更多信息,请参阅使用 SSH 登录。您还必须拥有堆栈的 SSH 和 Sudo 权限

本部分介绍了如何使用代理 CLI 进行故障排除。有关更多信息和完整的命令参考,请参阅 AWS OpsWorks Stacks 代理 CLI

执行配方

代理 CLI run_command 命令指示代理返回一个它之前执行过的命令。对故障排除最有用的命令为 setupconfiguredeployundeploy,每个命令对应于一个生命周期事件。这些命令指示代理启动 Chef 运行以执行关联的配方。

注意

run_command 命令仅限于执行与指定命令关联的配方组,通常是与生命周期事件关联的配方。您不能用它来执行特定的配方。要执行一个或多个指定的配方,请使用 Execute Recipes 堆栈命令或等效的 CLI 或 API 操作(create-deploymentCreateDeployment)。

run_command 命令对调试自定义配方非常有用,尤其是分配到 Setup 和 Configure 生命周期事件的配方,您无法从控制台直接触发这些事件。通过使用 run_command,您可以随时依照您的需要来运行特定事件的配方,而无须启动或停止实例。

注意

AWS OpsWorks Stacks 从实例的说明书缓存中运行配方,而不是从说明书存储库中运行。AWS OpsWorksStacks 会在实例启动时将说明书下载到此缓存中;但是,如果您后来修改了您的说明书,它不会自动更新联机实例上的缓存。如果您在实例启动后修改了您的说明书,请确保运行 Update Cookbooks 堆栈命令以使用存储库中最新版本更新说明书缓存。

代理仅缓存最近的命令。您可以通过运行 list_commands 列出这些命令,它会返回一个包含已缓存的命令和命令执行时间的列表。

sudo opsworks-agent-cli list_commands 2013-02-26T19:08:26 setup 2013-02-26T19:12:01 configure 2013-02-26T19:12:05 configure 2013-02-26T19:22:12 deploy

要重新运行最近的命令,请运行:

sudo opsworks-agent-cli run_command

要重新运行最近实例的指定命令,请运行:

sudo opsworks-agent-cli run_command command

例如,要重新运行 Setup 配方,您可以运行以下命令:

sudo opsworks-agent-cli run_command setup

每个命令都有一个关联的堆栈配置和部署 JSON,表示该命令运行时堆栈和部署的状态。由于这些数据可能会因命令而异,因此,较早实例的命令与最近的命令可能使用略微不同的数据。要重新运行特定实例的命令,请复制 list_commands 输出中的时间,并运行以下命令:

sudo opsworks-agent-cli run_command time

前面的示例均使用默认的 JSON 重新运行命令,即为该命令安装的 JSON。您可以使用任意 JSON 文件重新运行命令,如下所示:

sudo opsworks-agent-cli run_command -f /path/to/valid/json.file

显示 Chef 日志

代理 CLI show_log 命令显示一个指定的日志。在该命令执行完毕后,您将看到文件结尾。因此,show_log 命令提供了一种查看日志结尾的简便方法,您通常会在这里找到错误信息。您可以向上滚动以查看日志的前面部分。

要显示当前命令的日志,请运行以下命令:

sudo opsworks-agent-cli show_log

您也可以显示特定命令的日志,但请注意,代理仅缓存最后 30 个命令的日志。您可以通过运行 list_commands,列出某个实例的命令,该命令返回一个包含已缓存的命令和命令执行时间的列表。有关示例,请参阅 执行配方

要显示特定命令最近执行情况的日志,请运行以下命令:

sudo opsworks-agent-cli show_log command

该命令参数可设置为 setupconfiguredeployundeploystartstoprestart。大多数这些命令对应于生命周期事件,指示代理运行关联的配方。

要显示特定命令执行情况的日志,请复制 list_commands 输出中的日期并运行:

sudo opsworks-agent-cli show_log date

如果命令仍在执行中,show_log 会显示日志的当前状态。

注意

使用 show_log 排除错误和内存不足问题的一种方法是,在执行期间显示日志的结尾部分,如下所示:

  1. 使用 run_command 来触发相应的生命周期事件。有关更多信息,请参阅执行配方

  2. 重复运行 show_log 以在日志写入时查看日志的结尾部分。

如果 Chef 运行的内存不足或意外退出,则日志将突然结束。如果配方失败,则日志的结尾将包含一个异常信息和堆栈跟踪。

显示堆栈配置和部署 JSON

配方使用的大部分数据来自堆栈配置和部署 JSON,它定义了一组 Chef 属性,提供堆栈配置、任何部署和用户可添加的可选自定义属性的详细描述。对于每个命令,AWS OpsWorks Stacks 会安装一个 JSON,表示在执行该命令时的堆栈和部署状态。有关更多信息,请参阅堆栈配置和部署属性

如果您的自定义配方从堆栈配置和部署 JSON 中获取数据,您可以通过检查该 JSON 来验证数据。显示堆栈配置和部署 JSON 最简单的方式是运行代理 CLI get_json 命令,该命令将显示格式化版本的 JSON 对象。下面显示了某些典型输出的前几行内容:

{ "opsworks": { "layers": { "php-app": { "id": "4a2a56c8-f909-4b39-81f8-556536d20648", "instances": { "php-app2": { "elastic_ip": null, "region": "us-west-2", "booted_at": "2013-02-26T20:41:10+00:00", "ip": "10.112.235.192", "aws_instance_id": "i-34037f06", "availability_zone": "us-west-2a", "instance_type": "c1.medium", "private_dns_name": "ip-10-252-0-203.us-west-2.compute.internal", "private_ip": "10.252.0.203", "created_at": "2013-02-26T20:39:39+00:00", "status": "online", "backends": 8, "public_dns_name": "ec2-10-112-235-192.us-west-2.compute.amazonaws.com" ...

您可以显示最近的堆栈配置和部署 JSON,如下所示:

sudo opsworks-agent-cli get_json

通过执行以下命令,您可以显示特定命令最近的堆栈配置和部署 JSON:

sudo opsworks-agent-cli get_json command

该命令参数可设置为 setupconfiguredeployundeploystartstoprestart。大多数这些命令对应于生命周期事件,指示代理运行关联的配方。

通过指定命令的日期,您可以显示特定命令执行的堆栈配置和部署 JSON,如下所示:

sudo opsworks-agent-cli get_json date

使用此命令的最简单方法如下所示:

  1. 运行 list_commands,该命令会返回一个列表,其中包含已在实例上运行的命令以及每个命令的运行日期。

  2. 复制相应命令的日期,并将该日期用作 get_json date 参数。