

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

# 本地打包说明书依赖项
<a name="best-practices-packaging-cookbooks-locally"></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 本地打包说明书依赖项，将该软件包上传到 Amazon S3，并修改您的堆栈以将 Amazon S3 上的软件包用作说明书源。发送到 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)。

以下演练描述了如何将您的食谱及其依赖项预打包到.zip 文件中，然后使用.zip 文件作为 Stacks 中 Linux 实例的食谱来源。 OpsWorks 第一个演练展示了如何打包一个说明书。第二个演练展示了如何打包多个说明书。

在开始之前，请先安装 [Chef 开发工具包](https://www.chef.io/downloads) (也称为 Chef DK)，该工具包是由 Chef 社区构建的各种工具。您需要此工具包才能使用 `chef` 命令行工具。

## 在 Chef 12 中打包依赖项
<a name="best-practices-packaging-cookbooks-locally-12"></a>

在 Chef 12 Linux 中，默认情况下，Berkshelf 不再安装在堆栈实例上。建议您在本地开发计算机上安装和使用 Berkshelf，以便在本地打包说明书依赖项。将您的程序包 (包含依赖项) 上传到 Amazon S3。最后，修改您的 Chef 12 Linux 堆栈，将已上传的程序包用作说明书源。当您在 Chef 12 中打包说明书时，请注意以下差异。

1. 在本地计算机上，通过运行 `chef` 命令行工具创建说明书。

   ```
   chef generate cookbook "server-app"
   ```

   此命令会创建一个说明书、一个 Berksfile、一个 `metadata.rb` 文件和一个配方目录，并将它们放置在与说明书同名的文件夹中。下面的示例显示所创建项目的结构。

   ```
   server-app <-- the cookbook you've just created
       └── Berksfile
       ├── metadata.rb
       └── recipes
   ```

1. 在文本编辑器中，编辑 Berksfile 以指向 `server-app` 说明书将依赖的说明书。在我们的示例中，我们希望 `server-app` 依赖于 Chef Supermarket 中的 [https://supermarket.chef.io/cookbooks/java](https://supermarket.chef.io/cookbooks/java) 说明书。我们将指定版本 1.50.0 或更新的次要版本，但您可以在单引号中输入任何发布的版本。保存更改并关闭文件。

   ```
   source 'https://supermarket.chef.io'
   cookbook 'java', '~> 1.50.0'
   ```

1. 编辑 `metadata.rb` 文件以添加依赖项。保存更改并关闭文件。

   ```
   depends 'java' , '~> 1.50.0'
   ```

1. 更改到 Chef 为您创建的 `server-app` 说明书目录，然后运行 `package` 创建说明书的 `tar` 文件。如果您要打包多个说明书，需要在存储所有说明书的根目录中运行此命令。要打包单个说明书，请在说明书目录级别运行此命令。在此示例中，我们在 `server-app` 目录中运行此命令。

   ```
   berks package cookbooks.tar.gz
   ```

   输出与以下内容类似。在本地目录中创建 `tar.gz` 文件。

   ```
   Cookbook(s) packaged to /Users/username/tmp/berks/cookbooks.tar.gz
   ```

1. 在中 AWS CLI，将您刚刚创建的包上传到 Amazon S3。在将说明书程序包上传到 S3 后，记下此程序包的新 URL；您的堆栈设置需要此 URL。

   ```
   aws s3 cp cookbooks.tar.gz s3://bucket-name/
   ```

   输出与以下内容类似。

   ```
   upload: ./cookbooks.tar.gz to s3://bucket-name/cookbooks.tar.gz
   ```

1. 在 OpsWorks Stacks 中，[修改您的堆栈](https://docs.aws.amazon.com/opsworks/latest/userguide/workingcookbook-installingcustom-enable.html)以使用您上传的包作为食谱来源。

   1. 将 **Use custom Chef cookbooks** 设置设为 **Yes**。

   1. 将 **Repository type** 设置为 **S3 Archive**。

   1. 在 **Repository URL** 中，粘贴您在步骤 5 中上传的说明书程序包的 URL。

   保存您的堆栈更改。

## 本地打包一个说明书的依赖项
<a name="best-practices-packaging-cookbooks-locally-one"></a>

****

1. 在本地计算机上，使用 chef 命令行工具创建说明书：

   ```
   chef generate cookbook "server-app"
   ```

   此命令会创建一个说明书和 Berksfile，并将它们放置在与说明书同名的文件夹中。

1.  更改到 Chef 为您创建的说明书目录，然后通过运行以下命令打包所有内容：

   ```
   berks package cookbooks.tar.gz
   ```

   该输出类似于以下示例：

   ```
   Cookbook(s) packaged to /Users/username/tmp/berks/cookbooks.tar.gz
   ```

1.  在中 AWS CLI，将您刚刚创建的包上传到 Amazon S3：

   ```
   aws s3 cp cookbooks.tar.gz s3://bucket-name/
   ```

   该输出类似于以下示例：

   ```
   upload: ./cookbooks.tar.gz to s3://bucket-name/cookbooks.tar.gz
   ```

1.  在 OpsWorks Stacks 中，[修改您的堆栈](https://docs.aws.amazon.com/opsworks/latest/userguide/workingcookbook-installingcustom-enable.html)以使用您上传的包作为食谱来源。

## 本地打包多个说明书的依赖项
<a name="best-practices-packaging-cookbooks-locally-multiple"></a>

此示例将创建两个说明书，并打包它们的依赖项。

1.  在本地计算机上，运行以下 `chef` 命令以生成两个说明书：

   ```
   chef generate cookbook "server-app"
   chef generate cookbook "server-utils"
   ```

   在本示例中，服务器应用程序说明书执行 Java 配置，因此我们需要添加对 Java 的依赖项。

1.  编辑 `server-app/metadata.rb` 以添加对社区 Java 说明书的依赖项：

   ```
   maintainer "The Authors"
   maintainer_email "you@example.com"
   license "all_rights"
   description "Installs/Configures server-app"
   long_description "Installs/Configures server-app"
   version "0.1.0"
   depends "java"
   ```

1.  通过编辑说明书根目录中的 Berksfile 文件，来告诉 Berkshelf 要打包的内容，如下所示：

   ```
   source "https://supermarket.chef.io"
   cookbook "server-app", path: "./server-app"
   cookbook "server-utils", path: "./server-utils"
   ```

   现在，您的文件结构如下所示：

   ```
    .. 
       └── Berksfile
       ├── server-app
       └── server-utils
   ```

1.  最后，创建一个 zip 压缩包，将其上传到 Amazon S3，然后修改您的 OpsWorks Stacks 堆栈以使用新的食谱来源。为此，请执行[本地打包一个说明书的依赖项](#best-practices-packaging-cookbooks-locally-one)中的步骤 2 到步骤 4。

## 其他资源
<a name="w2ab1c14c49c17c17"></a>

有关打包说明书依赖项的更多信息，请参阅以下内容。
+ [如何在 AWS 博客上使用 Berkshelf 在本地打包 Cookbook 依赖关系](https://aws.amazon.com/blogs/devops/how-to-package-cookbook-dependencies-locally-with-berkshelf/) DevOps 
+ 论坛上@@ [有 Berkshelf 的 Linux Chef 12](https://forums.aws.amazon.com/thread.jspa?threadID=221131) OpsWorks 
+ 论坛上的 [Chef 12 中的 Berkshel](https://forums.aws.amazon.com/message.jspa?messageID=694464) f OpsWorks 
+ 本指南中的[安装自定义说明书](workingcookbook-installingcustom-enable.md)
+ 本指南中的[说明书存储库](workingcookbook-installingcustom-repo.md)