

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

# 简短的题外话：食谱、食谱和堆栈属性 OpsWorks
<a name="gettingstarted-db-recipes"></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 食谱、食谱和动态属性。你可以实现两个配方，一个用于设置数据库，一个用于配置应用程序的连接设置，然后让 OpsWorks Stacks 为你运行它们。

phpapp 说明书 (其中包含所需的配方) 已经实施并且准备就绪，可供使用；如果您愿意，您可以直接跳至 [步骤 3.3：将自定义食谱添加到 MyStack](gettingstarted-db-cookbooks.md)。如果您想要了解更多信息，本部分提供了一些关于说明书和配方的背景知识，并介绍了配方的工作原理。要查看说明书，请转至 [phpapp 说明书](https://github.com/amazonwebservices/opsworks-example-cookbooks/tree/master/phpapp)。

**Topics**
+ [配方和属性](#gettingstarted-db-recipes-attributes)
+ [设置数据库](#gettingstarted-db-recipes-dbsetup)
+ [将应用程序连接到数据库](#gettingstarted-db-recipes-appsetup)

## 配方和属性
<a name="gettingstarted-db-recipes-attributes"></a>

Chef 配方基本上是一个专门的 Ruby 应用程序，可在实例上执行任务，例如安装程序包、创建配置文件、执行 shell 命令等。相关配方的组被组织成*说明书*，其中还包含配置文件创建模板等支持文件。

OpsWorks Stacks 有一套支持内置图层的食谱。您也可以用自己的配方创建自定义说明书，以便在您的实例上执行自定义任务。本主题简要介绍配方，并展示如何使用配方来设置数据库并配置应用程序的连接设置。有关说明书和配方的更多信息，请参阅 [说明书和诀窍](workingcookbook.md) 或 [自定义堆栈 OpsWorks](customizing.md)。

配方通常依靠 Chef *属性*来获得输入数据：
+ 其中一些属性由 Chef 定义并提供关于实例的基本信息，例如操作系统。
+ OpsWorks 堆栈定义了一组属性，这些属性包含有关堆栈的信息（例如图层配置）和有关已部署应用程序的信息（例如应用程序存储库）。

  您可以通过向堆栈或部署分配[自定义 JSON](workingstacks-json.md) 的方法向该组添加自定义属性。
+ 您的说明书也可以定义特定于说明书的属性。

  在 `attributes/default.rb` 中定义了 phpapp 说明书属性。

有关 OpsWorks 堆栈属性的完整列表，请参阅[堆栈配置和部署属性：Linux](attributes-json-linux.md)和。[内置说明书属性](attributes-recipes.md)有关更多信息，请参阅 [覆盖属性](workingcookbook-attributes.md)。

属性按层次结构进行组织，可以表示为 JSON 对象。

您通过使用如下所示的 Chef 节点语法将此数据整合到应用程序中：

```
[:deploy][:simplephpapp][:database][:username]
```

`deploy` 节点具有单个应用程序节点 `simplephpapp`，该节点包含有关应用程序数据库、Git 存储库等内容的信息。本示例表示数据库用户名称的值，该值被解析为 `root`。

## 设置数据库
<a name="gettingstarted-db-recipes-dbsetup"></a>

MySQL 层的内置“设置”配方会自动为以应用程序的短名称命名的应用程序创建数据库，因此本示例中已经有一个名为 simplephpapp 的数据库。但是，您需要通过为应用程序创建表来存储其数据，以完成设置。你可以手动创建表，但更好的方法是实现自定义配方来处理任务，然后让 OpsWorks Stacks 为你运行它。本部分介绍了如何实施 `dbsetup.rb` 配方。稍后将介绍让 OpsWorks Stacks 运行配方的过程。

要查看存储库中的配方，请转至 [dbsetup.rb](https://github.com/amazonwebservices/opsworks-example-cookbooks/blob/master/phpapp/recipes/dbsetup.rb)。以下示例显示了 `dbsetup.rb` 代码。

`execute` 是执行指定命令的 *Chef 资源*。在本例中，它是一个用于创建表的 MySQL 命令。`not_if` 指令可确保如果指定表已经存在，则不会运行此命令。有关 Chef 资源的更多信息，请参阅[关于资源和提供程序](https://docs.chef.io/resource.html)。

配方使用之前讨论的节点语法将属性值插入命令字符串中。例如，以下会插入数据库的用户名称。

```
#{deploy[:database][:username]}
```

让我们对这个有些神秘的代码进行解压缩：
+ 对于每个迭代，将 `deploy` 设置为当前应用程序节点，因此它会解析为 `[:deploy][:app_name]`。在本示例中，它会解析为 `[:deploy][:simplephpapp]`。
+ 使用之前所示的部署属性值，整个节点将解析为 `root`。
+ 在 \$1\$1 \$1 中封装该节点，以将其插入到字符串中。

其他大多数节点都以类似方式进行解析。但 `#{node[:phpapp][:dbtable]}` 例外，它由自定义说明书的属性文件定义，并解析为表名称 `urler`。因此在 MySQL 实例上运行的实际命令是：

```
"/usr/bin/mysql 
    -uroot
    -pvjud1hw5v8
    simplephpapp
    -e'CREATE TABLE urler(
       id INT UNSIGNED NOT NULL AUTO_INCREMENT,
       author VARCHAR(63) NOT NULL,
       message TEXT,
       PRIMARY KEY (id))'
"
```

此命令使用部署属性中的凭证和数据库名称来创建一个名为 `urler` 的表，其中包含 ID、作者和消息字段。

## 将应用程序连接到数据库
<a name="gettingstarted-db-recipes-appsetup"></a>

第二个难题是应用程序，它需要数据库密码等连接信息来访问表。Simple PHPApp 实际上只有一个工作文件，而`app.php`只`index.php`需要加载即可`app.php`。

`app.php` 包含 `db-connect.php`，该文件可处理数据库连接，但它不在存储库中。您无法提前创建 `db-connect.php`，因为它根据特定实例来定义数据库。而是由 `appsetup.rb` 配方使用部署属性中的连接数据来生成 `db-connect.php`。

要查看存储库中的配方，请转至 [appsetup.rb](https://github.com/amazonwebservices/opsworks-example-cookbooks/blob/master/phpapp/recipes/appsetup.rb)。以下示例显示了 `appsetup.rb` 代码。

像 `dbsetup.rb` 一样，`appsetup.rb` 会迭代 `deploy` 节点中的应用程序，simplephpapp 也同样。它运行包含 `script` 资源和 `template` 资源的代码块。

`script` 资源会安装 [Composer](http://www.getcomposer.org)，它是 PHP 应用程序的依存关系管理器。然后将运行 Composer 的 `install` 命令将示例应用程序的依赖项安装到应用程序的根目录中。

`template` 资源生成 `db-connect.php` 并将其放到 `/srv/www/simplephpapp/current` 中。注意以下几点：
+ 配方使用条件语句来指定文件所有者，这取决于实例的操作系统。
+ 只有当指定目录存在时，`only_if` 指令才会指示 Chef 生成模板。

`template` 资源可对其内容和结构与关联文件基本相同、但包含各种数据值占位符的模板执行操作。`source` 参数指定模板 `db-connect.php.erb`，该模板在 phpapp 说明书的 `templates/default` 目录中，其中包含以下内容：

当 Chef 处理该模板时，它会用模板资源中相应变量的值替换 `<%= =>` 占位符，这些变量值又从部署属性中提取。因此，生成的文件将是：