

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

# 在 Linux 实例上使用外部说明书：Berkshelf
<a name="cookbooks-101-opsworks-berkshelf"></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 支持 团队联系。

**注意**  
Berkshelf 仅适用于 Chef 11.10 Linux 堆栈。

在开始实施说明书之前，请查看 [Chef 社区说明书](https://github.com/opscode-cookbooks)，此类说明书包含 Chef 社区成员针对多种用途创建的说明书。这些食谱中有许多无需修改即可与 OpsWorks Stacks 一起使用，因此您可以利用它们来完成某些任务，而不必自己实现所有代码。

要在实例上使用外部说明书，您需要通过某种方式来安装说明书和管理任何依赖项。首选方法是实施支持名为 Berkshelf 的依存关系管理器的说明书。Berkshelf 适用于亚马逊 EC2 实例，包括 OpsWorks Stacks 实例，但它也专为与 Test Kitchen 和 Vagrant 配合使用而设计。但是，Vagrant上的用法与 OpsWorks Stacks的用法略有不同，因此本主题包括两个平台的示例。有关如何使用 Berkshelf 的更多信息，请参阅 [Berkshelf](http://berkshelf.com/)。

**Topics**
+ [将 Berkshelf 用于 Test Kitchen 和 Vagrant](#cookbooks-101-opsworks-berkshelf-vagrant)
+ [将 Berkshelf 与堆栈一起使用 OpsWorks](#opsworks-berkshelf-opsworks)

## 将 Berkshelf 用于 Test Kitchen 和 Vagrant
<a name="cookbooks-101-opsworks-berkshelf-vagrant"></a>

 此示例演示如何使用 Berkshelf 安装入门社区说明书并执行其配方，这将在实例的主目录中安装简短文本文件。

**安装 Berkshelf 并初始化说明书**

1. 在工作站上，按照如下所示安装 Berkshelf gem。

   ```
   gem install berkshelf
   ```

   根据您的工作站，此命令可能需要 `sudo`，或者您也可以使用 Ruby 环境管理器 (如 [RVM](https://rvm.io/))。要验证 Berkshelf 是否已安装成功，请运行 `berks --version`。

1. 此主题的说明书名为 external\$1cookbook。您可使用 Berkshelf 创建已初始化的说明书而不是之前的主题采用的手动方法。为此，请导航到 `opsworks_cookbooks` 目录并运行以下命令。

   ```
   berks cookbook external_cookbook
   ```

   此命令将创建 `external_cookbook` 目录和多个标准 Chef 和 Test Kitchen 子目录，包括 `recipes` 和 `test`。此命令还将创建大量标准文件的默认版本，包括：
   + `metadata.rb`
   + Vagrant、Test Kitchen 和 Berkshelf 的配置文件
   + `default.rb` 目录中的空 `recipes` 配方
**注意**  
您无需运行 `kitchen init`；`berks cookbook` 命令将处理这些任务。

1. 运行 `kitchen converge`。新创建的说明书此时不执行任何相关操作，而是执行聚合操作。

**注意**  
您还可使用 `berks init` 初始化现有说明书以使用 Berkshelf。

要使用 Berkshelf 管理说明书的外部依赖项，说明书的根目录必须包含 `Berksfile` (它是一个指定 Berkshelf 应如何管理依赖项的配置文件)。如果您使用 `berks cookbook` 创建 `external_cookbook` 说明书，则将使用下列内容创建一个 `Berksfile`。

```
source "https://supermarket.chef.io"
metadata
```

此文件具有以下声明：
+ `source`-说明书源的 URL。

  一个 Berksfile 可以包含任意数量的 `source` 声明，每个声明指定依赖说明书的默认源。如果您没有显式指定说明书的源，则 Berkshelf 将在默认存储库中查找同名说明书。默认 Berksfile 包含一个指定社区说明书存储库的 `source` 属性。该存储库包含入门说明书，因此您可将此行保持不变。
+ `metadata`-指示 Berkshelf 包含说明书的 `metadata.rb` 文件中声明的说明书依赖项。

  您也可通过包含 `cookbook` 属性来在 Berksfile 中声明依赖说明书，如下文所述。

可通过两种方法声明说明书依赖项：
+ 在 Berksfile 中包括 `cookbook` 声明。

  这是 OpsWorks Stacks 使用的方法。例如，要指定此示例中使用的入门说明书，请在 Berksfile 中包含 `cookbook "getting-started"`。随后，Berkshelf 将在默认存储库中查找带此名称的说明书。您也可以使用 `cookbook` 显式指定说明书源，甚至指定特定版本。有关更多信息，请参阅 [Berkshelf](http://berkshelf.com/)。
+ 在 Berksfile 中包含 `metadata` 声明并在 `metadata.rb` 中声明依赖项。

  此声明指示 Berkshelf 包含 `metadata.rb` 中声明的说明书依赖项。例如，要声明入门依赖项，请将 `depends 'getting-started'` 声明添加到说明书的 `metadata.rb` 文件。

为了与 OpsWorks Stacks 保持一致，此示例使用了第一种方法。

**安装入门说明书**

1. 编辑默认 Berksfile 以将 `metadata` 声明替换为 `cookbook` 的 `getting-started` 声明。内容应与以下内容类似。

   ```
   source "https://supermarket.chef.io"
   
   cookbook 'getting-started'
   ```

1. 运行 `berks install` 以从社区说明书存储库中将入门说明书下载到您的工作站的 Berkshelf 目录 (通常为 `~/.berkshelf`)。此目录通常称为 *Berkshelf*。在 Berkshelf 的 `cookbooks` 目录中查找，您应看到入门说明书的目录，其名称类似于 `getting-started-0.4.0`。

1. 将 `external_cookbook::default` 运行列表中的 `.kitchen.yml` 替换为 `getting-started::default`。此示例不运行来自 external\$1cookbook 的任何配方，它只是一种使用入门说明书的方式。现在 `.kitchen.yml` 文件应该呈现以下状态。

   ```
   ---
   driver:
     name: vagrant
   
   provisioner:
     name: chef_solo
   
   platforms:
     - name: ubuntu-12.04
   
   suites:
     - name: default
       run_list:
         - recipe[getting-started::default]
       attributes:
   ```

1. 运行 `kitchen converge`，然后使用 `kitchen login` 登录实例。登录目录应包含名为 `chef-getting-started.txt` 的文件，其中部分内容与以下内容类似：

   ```
   Welcome to Chef!
   
   This is Chef version 11.12.8.
   Running on ubuntu.
   Version 12.04.
   ```

   Test Kitchen 将在实例的 `/tmp/kitchen/cookbooks` 目录中安装说明书。如果您列出该目录的内容，则将看到两个说明书：external\$1cookbook 和 getting-started。

1. 运行 `kitchen destroy` 以关闭实例。下一个示例使用 OpsWorks 堆栈实例。

## 将 Berkshelf 与堆栈一起使用 OpsWorks
<a name="opsworks-berkshelf-opsworks"></a>

OpsWorks Stacks 可以选择支持 Berkshelf for Chef 11.10 堆栈。要将 Berkshelf 用于您的堆栈，您必须执行下列操作。
+ 为堆栈启用 Berkshelf。

  OpsWorks 然后，堆栈会处理在堆栈实例上安装 Berkshelf 的细节。
+ 将 Berksfile 添加到您的说明书存储库的根目录。

  Berksfile 应包含所有依赖说明书的 `source` 和 `cookbook` 声明。

当 OpsWorks Stacks 在实例上安装您的自定义食谱存储库时，它会使用 Berkshelf 来安装存储库的 Berksfile 中声明的依赖食谱。有关更多信息，请参阅 [使用 Berkshelf](workingcookbook-chef11-10.md#workingcookbook-chef11-10-berkshelf)。

此示例说明如何使用 Berkshelf 在 Stacks 实例上安装入门社区食谱。 OpsWorks 它还将安装某个版本的 createfile 自定义说明书，这将在指定目录中创建一个文件。有关 createfile 工作原理的更多信息，请参阅[从说明书安装文件](cookbooks-101-basics-files.md#cookbooks-101-basics-files-cookbook_file)。

**注意**  
如果这是你第一次在 Stac OpsWorks ks 堆栈上安装自定义食谱，你应该先看一下这个例子。[在 Linux 实例上运行配方](cookbooks-101-opsworks-opsworks-instance.md)

首先创建堆栈，如以下内容所汇总。有关更多信息，请参阅 [创建新堆栈](workingstacks-creating.md)。

**创建堆栈**

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

1. 指定以下设置，接受其他设置的默认值，然后单击 **Add Stack**。
   + **姓名** — BerksTest
   + **默认 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** 并将采用以下设置的[自定义层添加到](workinglayers-custom.md)堆栈。
   + **姓名** — BerksTest
   + **短名称 **- berkstest

   在此示例中，您实际上可使用任何层类型。但是，此示例不需要其他层安装的任何程序包，因此自定义层是最简单的方法。

1. 使用默认设置向 BerksTest 图层@@ [添加全天候实例](workinginstances-add.md)，但暂时不要启动。

使用 OpsWorks Stacks，食谱必须位于具有标准目录结构的远程存储库中。然后，您将下载信息提供给 OpsWorks Stacks，堆栈会在启动时自动将存储库下载到堆栈的每个实例。为简单起见，本示例的存储库是一个公共的 Amazon S3 档案，但是 OpsWorks Stacks 还支持 HTTP 档案、Git 存储库和 Subversion 存储库。有关更多信息，请参阅 [说明书存储库](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. 在您的 `opsworks_cookbooks` 目录中，创建名为 `berkstest_cookbooks` 的目录。如果您愿意，可在任何方便位置创建此目录，因为您会将它上传到存储库。

1. 将名为 Berksfile 的文件添加到具有下列内容的 `berkstest_cookbooks`。

   ```
   source "https://supermarket.chef.io"
   
   cookbook 'getting-started'
   ```

   此文件将声明入门说明书依赖项，并指示 Berkshelf 从社区说明书站点下载此依赖项。

1. 将 `createfile` 目录添加到包含以下内容的 `berkstest_cookbooks` 中。
   + 包含下列内容的 `metadata.rb` 文件。

     ```
     name "createfile"
     version "0.1.0"
     ```
   + 一个 `files/default` 目录，其中包含具有以下内容的 `example_data.json` 文件。

     ```
     {
       "my_name" : "myname",
       "your_name" : "yourname",
       "a_number" : 42,
       "a_boolean" : true
     }
     ```

     该文件的名称和内容是任意的。配方会将此文件复制到指定位置。
   + 一个 `recipes` 目录，其中包含具有以下配方代码的 `default.rb` 文件。

     ```
     directory "/srv/www/shared" do
       mode 0755
       owner 'root'
       group 'root'
       recursive true
       action :create
     end
     
     cookbook_file "/srv/www/shared/example_data.json" do
       source "example_data.json"
       mode 0644
       action :create_if_missing
     end
     ```

     此配方创建 `/srv/www/shared` 并将 `example_data.json` 从说明书的 `files` 目录复制到此目录。

1. 为 `berkstest_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。

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

**安装说明书并运行配方**

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

   前两个设置为 OpsWorks Stacks 提供了将食谱存储库下载到您的实例所需的信息。最后一个设置启用 Berkshelf 支持，这会将入门说明书下载到实例。接受其他设置的默认值，然后单击 **Save** 更新堆栈配置。

1. 编辑 BerksTest 图层，[将以下配方添加到该图层的设置生命周期事件](workingcookbook-assigningcustom.md)中。
   + `getting-started::default`
   + `createfile::default`

1. [启动实例。](workinginstances-starting.md)Setup 事件在实例完成启动后发生。 OpsWorks 然后，Stacks 安装食谱存储库，使用 Berkshelf 下载入门食谱，然后运行该层的设置和部署食谱，包括和。`getting-started::default` `createfile::default`

1. 在实例处于联机状态后，[使用 SSH 登录](workinginstances-ssh.md)。您应该看到以下内容
   + `/srv/www/shared` 应包含 `example_data.json`。
   + `/root` 应包含 `chef-getting-started.txt`。

     OpsWorks Stacks 以 root 用户身份运行配方，因此入门会将文件安装在`/root`目录中，而不是您的主目录中。