

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

# 从 Chef 服务器迁移到 OpsWorks 堆栈
<a name="best-practices-server-migrate"></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 支持 团队联系。

由于 OpsWorks Stacks 基于 Chef，因此从 Chef Server 迁移到 OpsWorks Stacks 相对简单。本主题提供了修改 Chef Server 代码以用于 OpsWorks Stacks 的指南。

**注意**  
我们不建议使用版本低于 11.10 的 Chef 迁移到堆栈，这些版本基于 chef-solo，不支持搜索或数据包。

**Topics**
+ [将角色映射到层](#best-practices-server-migrate-roles)
+ [使用数据包](#best-practices-server-migrate-data-bags)
+ [使用 Chef 搜索](#best-practices-server-migrate-search)
+ [管理说明书和配方](#best-practices-server-migrate-cookbooks)
+ [使用 Chef 环境](#best-practices-server-migrate-environments)

## 将角色映射到层
<a name="best-practices-server-migrate-roles"></a>

Chef Server 使用角色来表示和管理具有相同用途和配置的实例，例如每个实例都托管了一个 Java 应用程序服务器的一组实例。[OpsWorks Stacks 层](workinglayers.md)的作用与 Chef 角色的基本相同。层是创建一组具有相同配置、已安装软件包、应用程序部署过程等的亚马逊弹性计算云 (Amazon EC2) 实例的蓝图。

OpsWorks 堆栈包括一组用于多种类型的应用程序服务器的[内置层](workinglayers.md)、一个 HAProxy 负载平衡器、一个 MySQL 数据库主服务器和 Ganglia 监控主服务器。例如，内置的 [Java App Server](layers-java.md) 层是用于创建托管 Tomcat 服务器的实例的蓝图。

要迁移到 OpsWorks Stacks，您需要将每个角色与提供同等功能的层相关联。对于一些角色，您可能只需要使用其中一个内置层。其他角色可能需要进行不同程度的自定义。首先需要检查内置层的功能，包括与各层关联的配方，以查看是否有某个层至少提供了您的角色的一些功能。有关内置层的更多信息，请参阅[图层](workinglayers.md)和[OpsWorks 堆栈图层参考](layers.md)。要查看内置配方，请参阅 [OpsWorks Stacks 公共 GitHub存储库](https://github.com/aws/opsworks-cookbooks)。

接下来如何继续取决于层与各个角色之间的匹配程度，如下所示。

**一个内置层支持角色的所有功能**  
如果需要，您可以进行最少的自定义来直接使用内置层。例如，如果某个角色支持 Tomcat 服务器，则 Java App Server 层的配方可能已经处理了角色的所有任务，可能还有一些适当的自定义。例如，您可以通过覆盖相应的[属性](workingcookbook-attributes.md)或[模板](workingcookbook-template-override.md)，让层的内置配方使用自定义 Tomcat 或 Apache 配置设置。

**一个内置层支持部分而非全部角色功能。**  
您也许可以通过[扩展层](workingcookbook-extend.md)来使用内置层。这通常涉及到实施自定义配方来支持缺少的功能，以及将配方分配到层的生命周期事件中。例如，假设您的角色在托管 Tomcat 服务器的同一个实例上安装了 Redis 服务器。您可以实施自定义的配方，在该层的实例上安装 Redis 并将配方分配到该层的“Setup”事件，从而扩展 Java App Server 层以匹配角色的功能。

**没有内置层能够为角色功能提供充分支持**  
实施自定义层。例如，假设您的角色支持 MongoDB 数据库服务器，但任何内置层不支持该服务器。您可以通过实施配方来安装所需的软件包、配置服务器等并将配方分配到自定义层的生命周期事件，从而提供该支持。通常，您可以至少将角色的一些配方用于此目的。有关如何实施自定义层的更多信息，请参阅[创建自定义 Tomcat 服务器层](create-custom.md)。

## 使用数据包
<a name="best-practices-server-migrate-data-bags"></a>

Chef Server 允许您通过数据包将用户定义的数据传递到配方。
+ 您将数据与说明书保存在一起，Chef 将它安装在各个实例上。
+ 您可以将加密的数据包用于敏感数据，例如密码。

 OpsWorks Stacks 支持数据包；配方可以使用与 Chef Server 完全相同的代码来检索数据。但是，该支持具有以下限制和区别：
+ 只有 Chef 11.10 Linux 和更高版本的堆栈上支持数据包。

  运行较早版本 Chef 的 Windows 堆栈和 Linux 堆栈不支持数据包。
+ 您不能将数据包存储在说明书存储库中。

  相反，您使用自定义 JSON 来管理数据包的数据。
+ OpsWorks 堆栈不支持加密的数据包。

  如果您需要以加密形式存储敏感数据，例如密码或证书，我们建议将其存储在私有 S3 存储桶中。然后，您可以创建一个使用[适用于 Ruby 的 Amazon SDK](https://aws.amazon.com/documentation/sdk-for-ruby/) 来检索数据的自定义配方。有关示例，请参阅[使用适用于 Ruby 的 SDK](cookbooks-101-opsworks-s3.md)。

有关更多信息，请参阅 [使用数据包](workingcookbook-chef11-10.md#workingcookbook-chef11-10-databag)。

## 使用 Chef 搜索
<a name="best-practices-server-migrate-search"></a>

Chef Server 将 IP 地址和角色配置等堆栈配置信息存储在服务器上。食谱使用 Chef 搜索来检索这些数据。 OpsWorks Stacks 使用的方法略有不同。例如，Chef 11.10 Linux 堆栈基于 Chef Client 本地模式，这是一个在实例上本地运行 Chef Server 的轻量级版本 (通常称为 Chef Zero) 的 Chef Client 选项。Chef Zero 支持搜索存储在实例的节点对象中的数据。

Stack OpsWorks s 不会将堆栈数据存储在远程服务器上，而是为每个生命周期事件的每个实例的节点对象添加一组[堆栈配置和部署属性](workingcookbook-json.md)。这些属性表示堆栈配置的快照。它们使用与 Chef Server 相同的语法，提供配方从服务器检索所需的大部分数据。

你通常不需要修改食谱中依赖于搜索的 Stacks 代码。 OpsWorks 由于 Chef 搜索对节点对象（包括堆栈配置和部署属性）进行操作，因此 OpsWorks Stacks 中的搜索查询通常与 Chef Server 中的搜索查询完全相同。

主要的例外是由于堆栈配置和部署属性仅包含 OpsWorks Stacks 在实例上安装属性时知道的数据。如果您在特定实例上本地创建或修改属性，则这些更改不会传播回 OpsWorks 堆栈，也不会合并到安装在其他实例上的堆栈配置和部署属性中。您可以使用搜索来仅检索该实例上的属性值。有关更多信息，请参阅 [使用 Chef 搜索](workingcookbook-chef11-10.md#workingcookbook-chef11-10-search)。

为了与 Chef Server 兼容， OpsWorks Stacks 向节点对象添加了一组`role`属性，每个属性都包含堆栈的一个层属性。如果您的配方使用 `roles` 作为搜索关键字，则无需更改搜索代码。该查询自动返回对应层的数据。例如，以下查询均返回 `php-app` 层的属性。

```
phpserver = search(:node, "layers:php-app").first
```

```
phpserver = search(:node, "roles:php-app").first
```

## 管理说明书和配方
<a name="best-practices-server-migrate-cookbooks"></a>

OpsWorks Stacks 和 Chef Server 处理食谱和食谱的方式略有不同。对于 Chef Server：
+ 您提供所有说明书，可以自行实施，也可以使用社区说明书。
+ 您在服务器上存储说明书。
+ 您可以手动或定期执行配方。

使用 OpsWorks 堆栈：
+ OpsWorks Stacks 为每个内置图层提供一本或多本食谱。这些说明书处理标准任务，例如安装和配置内置层的软件以及部署应用程序。

  要处理并非由内置说明书执行的任务，您需要添加自定义说明书到堆栈或使用社区说明书。
+ 您可以将 OpsWorks Stacks 食谱存储在远程存储库中，例如 S3 存储桶或 Git 存储库。

  有关更多信息，请参阅 [存储说明书](#best-practices-server-migrate-cookbooks-store)。
+ 您可以[手动执行配方](workingcookbook-manual.md)，但通常会让 OpsWorks Stacks 为您执行配方，以响应在实例[生命周期关键时刻发生的一系列生命周期事件](workingcookbook-events.md)。

  有关更多信息，请参阅 [执行配方](#best-practices-server-migrate-cookbooks-execute)。
+ OpsWorks Stacks 仅支持 Chef 11.10 堆栈上的 Berkshelf。如果您使用 Berkshelf 来管理自己的说明书依赖项，则不能使用运行 Chef 11.4 或更低版本的堆栈。

  有关更多信息，请参阅 [使用 Berkshelf](workingcookbook-chef11-10.md#workingcookbook-chef11-10-berkshelf)。

**Topics**
+ [存储说明书](#best-practices-server-migrate-cookbooks-store)
+ [执行配方](#best-practices-server-migrate-cookbooks-execute)

### 存储说明书
<a name="best-practices-server-migrate-cookbooks-store"></a>

使用 Chef Server，您可以将说明书存储在服务器上并将其从服务器部署到实例。使用 OpsWorks Stacks，您可以将食谱存储在存储库中，即 S3 或 HTTP 存档或 Git 或 Subversion 存储库。[安装食谱](workingapps-creating.md)时，您可以指定 OpsWorks Stacks 将代码从存储库下载到堆栈实例所需的信息。

要从 Chef Server 迁移，您必须将说明书放在这些存储库之一中。有关如何构造说明书存储库结构的信息，请参阅[说明书存储库](workingcookbook-installingcustom-repo.md)。

### 执行配方
<a name="best-practices-server-migrate-cookbooks-execute"></a>

在 OpsWorks Stacks 中，每个层都有一组[生命周期事件](workingcookbook-events.md)（设置、配置、部署、取消部署和关闭），每个事件都发生在实例生命周期的关键时刻。要执行自定义配方，您通常需要将其分配到相应层上的相应事件。发生事件时， OpsWorks Stacks 运行关联的配方。例如，“Setup”事件在实例完成启动后发生，因此您通常可以将执行诸如安装和配置软件包并启动服务等任务的配方分配到此事件。

您可以使用 [Execute Recipes 堆栈命令](workingstacks-commands.md)手动执行配方。此命令对于开发和测试非常有用，不过您还可以将其用于执行不映射到生命周期事件的配方。您还可以使用 Execute Recipes 命令手动触发设置和配置事件。

除了 OpsWorks Stacks 控制台之外，您还可以使用 [AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-welcome.html) 或[SDKs](https://aws.amazon.com/tools/)执行配方。这些工具支持所有 [OpsWorks Stacks API 操作](https://docs.aws.amazon.com/opsworks/latest/APIReference/Welcome.html)，不过比 API 更容易使用。使用 [create-deployment](https://docs.aws.amazon.com/cli/latest/reference/opsworks/create-deployment.html) CLI 命令可触发生命周期事件，这将运行所有关联的配方。您还可以使用此命令来执行一个或多个配方而不触发事件。等效的开发工具包代码取决于特定语言，不过通常类似于 CLI 命令。

以下示例介绍了使用 `create-deployment` CLI 命令自动完成应用程序部署的两种方式。
+ 通过添加具有单个实例的自定义层到您的堆栈，定期部署您的应用程序。

  将自定义设置配方添加到在实例上创建 `cron` 作业的层，以按照指定计划运行命令。有关如何使用配方创建 `cron` 作业的示例，请参阅[在 Linux 实例上运行 Cron 作业](workingcookbook-extend-cron.md)。
+ 将任务添加到使用 `create-deployment` CLI 命令部署应用程序的连续集成管道。

## 使用 Chef 环境
<a name="best-practices-server-migrate-environments"></a>

OpsWorks Stacks 不支持 Chef 环境；`node.chef_environment`总是会返回`_default`。