

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

# 覆盖内置模板
<a name="cookbooks-101-opsworks-templates"></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 支持 团队联系。

**注意**  
本主题仅适用于 Linux 堆栈。您无法在 Windows 堆栈上覆盖内置模板。

 OpsWorks Stacks 内置配方使用模板在实例上创建文件，主要是服务器（例如 Apache）的配置文件。例如，`apache2` 配方使用 [https://github.com/aws/opsworks-cookbooks/blob/release-chef-11.10/apache2/templates/default/apache2.conf.erb](https://github.com/aws/opsworks-cookbooks/blob/release-chef-11.10/apache2/templates/default/apache2.conf.erb) 模板创建 Apache 服务器的主配置文件 `httpd.conf` (Amazon Linux) 或 `apache2.conf` (Ubuntu)。

这些模板中的大部分配置设置由属性表示，因此自定义配置文件的首选方法是覆盖相应的内置属性。有关示例，请参阅[覆盖内置属性](cookbooks-101-opsworks-attributes.md)。但是，如果您要自定义的设置不是由内置属性表示的，或根本不在模板中，则您必须覆盖模板本身。本主题介绍如何覆盖内置模板以指定自定义 Apache 配置设置。

您可以通过将 `ErrorDocument` 设置添加到 `httpd.conf` 文件来提供对 Apache 的自定义错误响应。`apache2.conf.erb` 仅包含一些注释掉的示例，如下所示：

```
...
#
# Customizable error responses come in three flavors:
# 1) plain text 2) local redirects 3) external redirects
#
# Some examples:
#ErrorDocument 500 "The server made a boo boo."
#ErrorDocument 404 /missing.html
#ErrorDocument 404 "/cgi-bin/missing_handler.pl"
#ErrorDocument 402 http://www.example.com/subscription_info.html
...
```

由于这些设置是硬编码注释，因此您无法通过覆盖属性来指定自定义值；您必须覆盖模板本身。但是，与属性不同，您无法通过任何方法覆盖模板文件的特定部分。您必须使用与内置版本相同的名称创建自定义说明书，将模板文件复制到同一子目录，然后根据需要修改文件。本主题说明如何覆盖 `apache2.conf.erb` 以提供对错误 500 的自定义响应。有关覆盖模板的一般性讨论，请参阅[使用自定义模板](workingcookbook-template-override.md)。

**重要**  
当您覆盖内置模板时，内置配方将使用您的模板的自定义版本而不是内置版本。如果 OpsWorks Stacks 更新内置模板，则自定义模板将不同步，可能无法正常工作。 OpsWorks Stacks 不经常进行此类更改，当模板发生更改时， OpsWorks Stacks 会列出更改，并允许您选择升级到新版本。建议您监控 [OpsWorks Stacks 存储库](https://github.com/aws/opsworks-cookbooks)的更改并根据需要手动更新您的自定义模板。请注意，该存储库对于每个支持的 Chef 版本都有一个单独的分支，因此，请确保您位于正常的分支中。

要开始，请创建一个自定义说明书。

**创建说明书**

1. 在 `opsworks_cookbooks` 目录中，创建名为 `apache2` 的说明书目录，然后导航到该目录。要覆盖内置模板，自定义说明书必须具有与内置说明书相同的名称，本例中为 `apache2`。
**注意**  
如果您已完成[覆盖内置属性](cookbooks-101-opsworks-attributes.md)演练，则可在本例中使用相同的 `apache2` 说明书，然后跳过步骤 2。

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

   ```
   name "apache2"
   version "0.1.0"
   ```

1. 在 `apache2` 目录中创建一个 `templates/default` 目录。
**注意**  
`templates/default` 目录适用于 Amazon Linux 实例，这些实例使用默认 `apache2.conf.erb` 模板。Ubuntu 14.04 实例使用特定于操作系统的 `apache2.conf.erb` 模板，该模板位于 `templates/ubuntu-14.04` 目录中。如果您希望自定义项也应用于 Ubuntu 14.04 实例，则还必须覆盖该模板。

1. 将[内置`apache2.conf.erb`模板](https://github.com/aws/opsworks-cookbooks/blob/release-chef-11.10/apache2/templates/default/apache2.conf.erb)复制到您的 `templates/default` 目录。打开模板文件，取消注释 `ErrorDocument 500` 行，然后提供自定义错误消息，如下所示：

   ```
   ...
   ErrorDocument 500 "A custom error message."
   #ErrorDocument 404 /missing.html
   ...
   ```

1. 创建 `opsworks_cookbooks` 的名为 `opsworks_cookbooks.zip` 的 `.zip` 存档，并将文件上传到 Amazon Simple Storage Service (Amazon S3) 存储桶。为简单起见，请[公开该存档](https://docs.aws.amazon.com/AmazonS3/latest/UG/EditingPermissionsonanObject.html)。记录该存档的 URL 以供将来使用。您也可以将说明书存储在私有 Amazon S3 存档或其他存储库类型中。有关更多信息，请参阅 [说明书存储库](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)。

**注意**  
为简单起见，本示例向该模板添加了一个硬编码的错误消息。要更改它，您必须修改该模板并[重新安装说明书](workingcookbook-installingcustom-enable-update.md)。要为自己提供更大的灵活性，您可以在自定义说明书的 [ 属性文件中为错误字符串](cookbooks-101-opsworks-attributes.md)定义一个默认自定义属性`customize.rb`，然后将该属性的值分配到 `ErrorDocument 500`。例如，如果您将属性命名为 `[:apache][:custom][:error500]`，则 `apache2.conf.erb` 中的对应行将类似于以下内容：  

```
...
ErrorDocument 500 <%= node[:apache][:custom][:error500] %>
#ErrorDocument 404 /missing.html
...
```
您随后可以通过覆盖 `[:apache][:custom][:error500]` 来随时更改自定义错误消息。如果您[使用自定义 JSON 覆盖属性](workingcookbook-json-override.md)，则您甚至不需要接触说明书。

要使用自定义模板，请创建一个堆栈并安装说明书。

**使用自定义模板**

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

1. 指定以下标准设置：
   + **姓名** — ApacheTemplate
   + **区域**-美国西部（俄勒冈州）
   + **默认 SSH 密钥** — 亚马逊弹性计算云 (Amazon EC2) 密钥对

     如果您需要创建亚马逊 EC2 密钥对，请参阅[亚马逊 EC2 密钥对](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-key-pairs.html)。请注意，该密钥对必须属于与实例相同的 Amazon Web Services Region。

   选择 **Advanced>>**，然后选择 **Use custom Chef cookbooks** 指定以下设置：
   + **存储库类型 **-**Http 存档 **
   + **存储库 URL **-您之前记录的说明书存档 URL。

   接受其他设置的默认值，然后选择 **Add Stack** 创建堆栈。

1. 选择 **Add a layer**，然后将采用默认设置的 [Java App Server 层添加到](layers-java.md)堆栈。

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

   本示例中，一个 t2.micro 实例已足够。

1. 在实例处于联机状态后，[使用 SSH 连接到它](workinginstances-ssh.md)。`httpd.conf` 文件位于 `/etc/httpd/conf` 目录中。该文件应包含您的自定义 `ErrorDocument` 设置，后者将类似于以下内容：

   ```
   ...
   # Some examples:
   ErrorDocument 500 "A custom error message."
   #ErrorDocument 404 /missing.html
   #ErrorDocument 404 "/cgi-bin/missing_handler.pl"
   #ErrorDocument 402 http://www.example.com/subscription_info.html
   ...
   ```