

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

# 对 Linux 堆栈使用搜索
<a name="cookbooks-101-opsworks-opsworks-stack-config-search-linux"></a>

**重要**  
该 AWS OpsWorks Stacks 服务于 2024 年 5 月 26 日终止，新客户和现有客户均已禁用。我们强烈建议客户尽快将其工作负载迁移到其他解决方案。如果您对迁移有疑问，请通过 re [AWS : Post 或通过 Pre](https://repost.aws/) mium Su [AWS pp](https://aws.amazon.com/support) ort 与 AWS 支持 团队联系。

此示例基于包含单台 PHP 应用程序服务器的 Linux 堆栈。它使用 Chef 搜索来获取服务器的公有 IP 地址，然后将该地址放入 `/tmp` 目录下的文件中。实际上，它将从节点对象获取与[直接获取属性值](cookbooks-101-opsworks-opsworks-stack-config-node.md)相同的信息，但代码简单得多，并且不依赖堆栈配置和部署属性结构的详细信息。

下面简单总结了为此示例创建堆栈的方式。有关更多信息，请参阅 [创建新堆栈](workingstacks-creating.md)。

**注意**  
如果你之前没有在 OpsWorks Stacks 实例上运行过自定义配方，你应该先看一下这个[在 Linux 实例上运行配方](cookbooks-101-opsworks-opsworks-instance.md)例子。

**创建堆栈**

1. 打开 [OpsWorks Stacks 控制台](https://console.aws.amazon.com/opsworks/)，然后单击 **Add Stack (添加堆栈)**。

1. 指定以下设置，接受其他设置的默认值，然后单击 **Add Stack**。
   + **名称 **- SearchJSON
   + **默认 SSH 密钥** — Amazon EC2 密钥对

   如果您需要创建亚马逊 EC2 密钥对，请参阅[亚马逊 EC2 密钥对](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-key-pairs.html)。请注意，该密钥对必须属于与实例相同的 Amazon Web Services Region。此示例使用美国西部（俄勒冈州）区域。

1. 单击 **Add a layer**，然后将采用默认设置的 [PHP App Server 层添加到](workinglayers-custom.md)堆栈。

1. 向层[添加全天候实例](workinginstances-add.md) (采用默认设置) 并[启动该实例](workinginstances-starting.md)。

**设置说明书**

1. 在 `opsworks_cookbooks` 中创建一个名为 `searchjson` 的目录并导航到该目录。

1. 创建一个包含以下内容的 `metadata.rb` 文件，并将该文件保存到 `opstest`。

   ```
   name "searchjson"
   version "0.1.0"
   ```

1. 在 `recipes` 中创建 `searchjson` 目录。

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

   ```
   phpserver = search(:node, "layers:php-app").first
   Chef::Log.info("**********The public IP address is: '#{phpserver[:ip]}'**********")
   
   file "/tmp/ip_addresses" do
     content "#{phpserver[:ip]}"
     mode 0644
     action :create
   end
   ```

   Linux 堆栈仅支持 `node` 搜索索引。配方使用此索引获取 `php-app` 层中实例的列表。由于已知层只有一个实例，配方只需将第一个实例分配给 `phpserver`。如果层具有多个实例，您可枚举这些实例以检索必需信息。每个列表项均为一个包含一组实例属性的哈希表。`ip` 属性设置为实例的公有 IP 地址，因此您可在后续配方代码中将此地址表示为 `phpserver[:ip]`。

   在将消息添加到 Chef 日志后，配方将使用 [https://docs.chef.io/chef/resources.html#file](https://docs.chef.io/chef/resources.html#file) 资源创建一个名为 `ip_addresses` 的文件。`content` 属性设置为 `phpserver[:ip]` 的字符串表示形式。当 Chef 创建 `ip_addresses` 时，它会将此字符串添加到该文件。

1. 为 `opsworks_cookbooks` 创建 `.zip` 存档，[将存档上传到 Amazon S3 存储桶](https://docs.aws.amazon.com/AmazonS3/latest/UG/UploadingObjectsintoAmazonS3.html)，[公开存档](https://docs.aws.amazon.com/AmazonS3/latest/UG/EditingPermissionsonanObject.html)并记录存档的 URL。有关说明书存储库的更多信息，请参阅[说明书存储库](workingcookbook-installingcustom-repo.md)。

   发送到 Amazon S3 存储桶的内容可能包含客户内容。有关删除敏感数据的更多信息，请参阅[如何清空 S3 存储桶？](https://docs.aws.amazon.com/AmazonS3/latest/userguide/empty-bucket.html)或[如何删除 S3 存储桶？](https://docs.aws.amazon.com/AmazonS3/latest/userguide/delete-bucket.html)。

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

**运行配方**

1. [编辑堆栈以启用自定义说明书](workingcookbook-installingcustom-enable.md)，然后指定以下设置。
   + **存储库类型 **-**Http 存档 **
   + **存储库 URL **-您之前记录的说明书存档 URL

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

1. 编辑自定义图层配置并[分配`searchjson::default`给](workingcookbook-assigningcustom.md)图层的 Setup 事件。 OpsWorks 堆栈将在实例启动后或您明确触发安装事件后运行配方。

1. [运行“Update Custom Cookbooks”堆栈命令](workingstacks-commands.md)，这会将当前版本的自定义说明书存储库安装到堆栈的实例上。如果存在早期版本的存储库，此命令会将其覆盖。

1. 通过运行 **Setup** 堆栈命令在实例上触发设置事件并运行 `searchjson::default` 来执行配方。使 **Running command setup page** 保持打开状态。

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

**验证 searchjson**

1. 第一步是查看 [Chef 日志](troubleshoot-debug-log.md)以了解最新的设置事件。在 **Running command setup page** 上，单击 php-app1 实例 **Log** 列中的 **show**，显示日志。向下滚动以查找您的日志消息 (接近中间位置)，该日志消息与以下内容类似。

   ```
   ...
   [2014-09-05T17:08:41+00:00] WARN: Previous bash[logdir_existence_and_restart_apache2]: ...
   [2014-09-05T17:08:41+00:00] WARN: Current  bash[logdir_existence_and_restart_apache2]: ...
   [2014-09-05T17:08:41+00:00] INFO: **********The public IP address is: '192.0.2.0'**********
   [2014-09-05T17:08:41+00:00] INFO: Processing directory[/etc/sysctl.d] action create (opsworks_initial_setup::sysctl line 1)
   ...
   ```

1. [使用 SSH 登录实例](workinginstances-ssh.md)并列出 `/tmp` 的内容，该内容应包含一个名为 `ip_addresses` 的文件 (其中包含 IP 地址)。