在 AWS OpsWorks Stacks Linux 实例上运行配方 - AWS OpsWorks

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

在 AWS OpsWorks Stacks Linux 实例上运行配方

重要

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

Test Kitchen 和 Vagrant 提供了一种简单高效的说明书实施方法,但为了验证说明书的配方在生产中能否正确运行,您必须在 AWS OpsWorks Stacks 实例上运行它们。本主题介绍如何在 AWS OpsWorks Stacks Linux 实例上安装自定义说明书并运行简单的配方。本主题还提供了一些高效修复配方错误的提示。

有关如何在 Windows 实例上运行配方的说明,请参阅在 Windows 实例上运行配方

创建和运行配方

首先,您需要创建一个堆栈。下面简要总结了如何为本示例创建堆栈。有关更多信息,请参阅 创建新堆栈

创建 堆栈
  1. 打开 AWS OpsWorks Stacks 控制台,然后单击 Add Stack (添加堆栈)

  2. 指定以下设置,接受其他设置的默认值,然后单击 Add Stack

    • 姓名 — OpsTest

    • 默认 SSH 密钥 - Amazon EC2 密钥对

    如果您需要创建 Amazon EC2 密钥对,请参阅 Amazon EC2 密钥对。请注意,该密钥对必须属于与实例相同的 Amazon Web Services Region。本示例使用了默认的美国西部(俄勒冈州)区域。

  3. 单击 Add a layer 并将采用以下设置的自定义层添加到堆栈。

    • 姓名 — OpsTest

    • 短名称 - opstest

    实际上任何层类型均适用于 Linux 堆栈,但本示例不需要由其他层类型安装的任何程序包,因此自定义层是最简单的方法。

  4. 向层添加全天候实例 (采用默认设置) 并启动该实例

当实例正在启动时(通常需要几分钟),您可以创建说明书。本示例将使用的配方是在条件逻辑中的配方的基础上稍作修改得来的,该配方将创建一个名称取决于平台的数据目录。

设置说明书
  1. opsworks_cookbooks 中创建一个名为 opstest 的目录并导航到该目录。

  2. 创建一个包含以下内容的 metadata.rb 文件,并将该文件保存到 opstest

    name "opstest" version "0.1.0"
  3. recipes 中创建 opstest 目录。

  4. 创建包含以下配方的 default.rb 文件,并将该文件保存到 recipes 目录。

    Chef::Log.info("******Creating a data directory.******") data_dir = value_for_platform( "centos" => { "default" => "/srv/www/shared" }, "ubuntu" => { "default" => "/srv/www/data" }, "default" => "/srv/www/config" ) directory data_dir do mode 0755 owner 'root' group 'root' recursive true action :create end

    请注意,配方会记录消息,但它是通过调用 Chef::Log.info 来实现的。您没有将 Test Kitchen 用于本示例,因此 log 方法不太有用。Chef::Log.info 会将消息记录到 Chef 日志中,您可以在 Chef 运行完后读取该日志。AWS OpsWorksStacks 提供了一种查看这些日志的简单方法,如下文所述。

    注意

    Chef 日志通常包含大量例程和相对无关的信息。“*”字符会将消息文本括起来,使其更容易被发现。

  5. 创建 opsworks_cookbooks.zip 存档。要在 AWS OpsWorks Stacks 实例上安装您的说明书,您必须将其存储在存储库中,并为 AWS OpsWorks Stacks 提供将说明书下载到实例所需的信息。您可以将说明书存储在任一受支持的存储库类型中。本实例会将包含说明书的存档文件存储在 Amazon S3 存储桶中。有关说明书存储库的更多信息,请参阅说明书存储库

    注意

    为简单起见,本示例仅存档整个 opsworks_cookbooks 目录。但是,这意味着 AWS OpsWorks Stacks 会将 opsworks_cookbooks 中的所有说明书下载到实例,即使您只会使用其中一个。要仅安装示例说明书,请创建另一个父目录并将 opstest 移动到该目录。然后创建该父目录的 .zip 存档,并用它代替 opsworks_cookbooks.zip

    发送到 Amazon S3 存储桶的内容可能包含客户内容。有关删除敏感数据的更多信息,请参阅如何清空 S3 存储桶?如何删除 S3 存储桶?

  6. 将存档上传到 Amazon S3 存储桶公开存档,然后记录存档的 URL。

您现在可以安装说明书并运行配方。

运行配方
  1. 编辑堆栈以启用自定义说明书,然后指定以下设置。

    • 存储库类型 - S3 存档

    • 存储库 URL -您之前记录的说明书存档 URL

    对其他设置使用默认值,然后单击 Save 更新堆栈配置。

  2. 运行“Update Custom Cookbooks”堆栈命令,这会将当前版本的自定义说明书安装到堆栈的实例上。如果您的说明书存在早期版本,此命令会覆盖该版本。

  3. 通过在 Recipes to execute 设置为 opstest::default 的情况下运行 Execute Recipes 堆栈命令来执行配方。此命令将使用一个包含 opstest::default 的运行列表来启动 Chef 运行。

配方成功运行后,您可以对其进行验证。

验证 opstest
  1. 第一步是检查 Chef 日志。单击 opstest1 实例 Log 列中的 show,显示日志。向下滚动,您将在接近底部的位置看到您的日志。

    ... [2014-07-31T17:01:45+00:00] INFO: Storing updated cookbooks/opsworks_cleanup/attributes/customize.rb in the cache. [2014-07-31T17:01:45+00:00] INFO: Storing updated cookbooks/opsworks_cleanup/metadata.rb in the cache. [2014-07-31T17:01:46+00:00] INFO: ******Creating a data directory.****** [2014-07-31T17:01:46+00:00] INFO: Processing template[/etc/hosts] action create (opsworks_stack_state_sync::hosts line 3) ...
  2. 使用 SSH 登录实例并列出 /srv/www/ 的内容。

如果您执行了所有步骤,您将看到 /srv/www/config 而不是您需要的 /srv/www/shared 目录。以下部分提供了一些快速修复此类错误的指南。

自动执行配方

Execute Recipes 命令是一种测试自定义配方的便捷方式,这正是大多数此类示例中都使用它的原因。但是,在实践中,您通常会在实例生命周期中的标准时间点运行配方,例如实例完成启动后或您部署应用程序时。AWS OpsWorks Stacks 可简化在实例上运行配方的过程,方法是对每个层支持一组生命周期事件:设置、配置、部署、取消部署和关闭。您可以将某个配方分配给相应的生命周期事件,从而让 AWS OpsWorks Stacks 在层的实例上自动运行该配方。

您通常会在实例完成启动后立即创建目录,与设置事件对应。下面展示了如何使用之前在示例中创建的同一堆栈在设置时运行示例配方。您可以对其他事件使用相同的过程。

在设置时自动运行配方
  1. 在导航窗格中选择 “图层”,然后选择图 OpsTest 层的 “食谱” 链接旁边的铅笔图标。

  2. opstest::default 添加到层的 Setup (设置) 配方,单击 + 将前者添加到层,然后选择 Save (保存) 保存配置。

  3. 选择 Instances,将另一个实例添加到层,然后启动该实例。

    该实例应名为 opstest2。在该实例完成启动后,AWS OpsWorks Stacks 将运行 opstest::default

  4. opstest2 实例处于在线状态后,请验证 /srv/www/shared 是否存在。

注意

如果您已将配方分配给设置、配置或部署事件,您也可以使用堆栈命令 (设置和配置) 或部署命令 (部署) 来触发事件,手动运行。请注意,如果您向某个事件分配了多个配方,那么这些命令将运行所有这些配方。

排查并修复配方问题

如果您没有得到预期结果,或者您的配方甚至都没有成功运行,那么问题排查通常从检查 Chef 日志开始。它包含运行的详细说明,并包含来自您的配方的任何内联日志消息。如果您的配方只是失败了,日志就会特别有用。当出现这种情况时,Chef 会记录错误 (包括堆栈跟踪)。

如果配方像在本示例中一样成功了,则 Chef 日志通常不会有太大帮助。在这种情况下,您只需更仔细地观察配方即可找到问题所在,特别是前几行:

Chef::Log.info("******Creating a data directory.******") data_dir = value_for_platform( "centos" => { "default" => "/srv/www/shared" }, "ubuntu" => { "default" => "/srv/www/data" }, "default" => "/srv/www/config" ) ...

当您在 Vagrant 上测试配方时,CentOS 是 Amazon Linux 的合理替代品,但现在您正在实际的 Amazon Linux 实例上运行。Amazon Linux 的平台值为 amazon,该值未包含在 value_for_platform 调用中,因此配方将默认创建 /srv/www/config。有关问题排查的更多信息,请参阅调试和故障排除指南

既然您已经确定问题,您需要更新配方并验证修复。您可以返回到原始的源文件,更新 default.rb,将新存档上传到 Amazon S3 或执行其他操作。但是,这个过程可能有点枯燥和费时。下面所介绍的这种方法在速度上要快得多,这种方法对类似于下例中错误的简单配方错误特别有用:在实例上编辑配方。

在实例上编辑配方
  1. 使用 SSH 登录实例,然后运行 sudo su 以提升您的权限。您需要根权限才能访问说明书目录。

  2. AWS OpsWorks Stacks 在 /opt/aws/opsworks/current/site-cookbooks 中存储您的说明书,因此请导航到 /opt/aws/opsworks/current/site-cookbooks/opstest/recipes

    注意

    AWS OpsWorks Stacks 还会将您的说明书的一个副本存储在 /opt/aws/opsworks/current/merged-cookbooks 中。请勿编辑该说明书。当您执行配方时,AWS OpsWorks Stacks 会将说明书从 .../site-cookbooks 复制到 .../merged-cookbooks,因此您在 .../merged-cookbooks 中所做的任何更改都将被覆盖。

  3. 在实例上使用文本编辑器编辑 default.rb,并将 centos 替换为 amazon。现在,您的配方应该类似于以下形式。

    Chef::Log.info("******Creating a data directory.******") data_dir = value_for_platform( "amazon" => { "default" => "/srv/www/shared" }, "ubuntu" => { "default" => "/srv/www/data" }, "default" => "/srv/www/config" ) ...

要验证修复情况,请再次运行 Execute Recipe 堆栈命令来执行配方。现在,实例应该具有 /srv/www/shared 目录。如果您需要进一步更改配方,则可以按所需的频率运行 Execute Recipe;您不需要在每次运行命令时停止并重新启动实例。当您对配方正常工作感到满意后,请勿忘记更新您的源说明书中的代码。

注意

如果您已将配方分配给某个生命周期事件,使得 AWS OpsWorks Stacks 自动运行该配方,则您始终可以使用 Execute Recipe (执行配方) 来重新运行配方。您也可以将配方重新运行所需的次数,无需使用 AWS OpsWorks Stacks 控制台手动触发相应事件来重新启动实例。但是,这种方法会运行事件的所有配方。提醒一下:

  • 使用堆栈命令可触发设置事件或配置事件。

  • 使用部署命令可触发部署事件或取消部署事件。