

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

# 覆盖内置属性
<a name="cookbooks-101-opsworks-attributes"></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 服务器配置设置。通过将这些设置放在属性文件中，您可以采用以下任一方式覆盖对应的内置属性，从而自定义多种配置设置：
+ 在自定义 JSON 中定义属性。

  此方法的优点是简单灵活。但是，您必须手动输入自定义 JSON，因此没有可靠的方法来管理属性定义。
+ 在 `customize.rb` 属性文件中实施自定义说明书并定义属性。

  此方法比使用自定义 JSON 的灵活性更小，但更可靠，因为您可以将自定义说明书置于源代码管理下。

本主题介绍如何使用自定义说明书属性文件覆盖内置属性，例如使用 Apache 服务器。有关如何使用自定义 JSON 覆盖属性的更多信息，请参阅[使用自定义 JSON](workingcookbook-json-override.md)。有关如何覆盖属性的一般性讨论，请参阅[覆盖属性](workingcookbook-attributes.md)。

**注意**  
覆盖属性是自定义配置设置的首选方法，但设置并不总是由属性表示。在出现这种情况时，您通常可以通过覆盖内置配方用于创建配置文件的模板来自定义配置文件。有关示例，请参阅[覆盖内置模板](cookbooks-101-opsworks-templates.md)。

内置属性通常表示 Setup 配方用于创建配置文件的模板文件中的值。例如，一种 `apache2` Setup 配方 [https://github.com/aws/opsworks-cookbooks/blob/release-chef-11.10/apache2/recipes/default.rb](https://github.com/aws/opsworks-cookbooks/blob/release-chef-11.10/apache2/recipes/default.rb) 使用 [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)。下面是来自模板文件的摘录：

```
...
#
# MaxKeepAliveRequests: The maximum number of requests to allow
# during a persistent connection. Set to 0 to allow an unlimited amount.
# We recommend you leave this number high, for maximum performance.
#
MaxKeepAliveRequests <%= node[:apache][:keepaliverequests] %>
#
# KeepAliveTimeout: Number of seconds to wait for the next request from the
# same client on the same connection.
#
KeepAliveTimeout <%= node[:apache][:keepalivetimeout] %>
##
## Server-Pool Size Regulation (MPM specific)
##

...
```

在本示例中，`KeepAliveTimeout` 设置是 `[:apache][:keepalivetimeout]` 属性的值。此属性的默认值在 `apache2` 说明书的 [https://github.com/aws/opsworks-cookbooks/blob/release-chef-11.10/apache2/attributes/apache.rb](https://github.com/aws/opsworks-cookbooks/blob/release-chef-11.10/apache2/attributes/apache.rb) 属性文件中定义，如以下摘录所示：

```
...
# General settings
default[:apache][:listen_ports] = [ '80','443' ]
default[:apache][:contact] = 'ops@example.com'
default[:apache][:log_level] = 'info'
default[:apache][:timeout] = 120
default[:apache][:keepalive] = 'Off'
default[:apache][:keepaliverequests] = 100
default[:apache][:keepalivetimeout] = 3
...
```

**注意**  
有关常用内置属性的更多信息，请参阅[内置说明书属性](attributes-recipes.md)。

为了支持覆盖内置属性，所有内置说明书都要包含一个 `customize.rb` 属性文件，该文件将通过 `include_attribute` 指令集成到所有模块中。内置说明书的 `customize.rb` 文件未包含任何属性定义且对内置属性没有影响。要覆盖内置属性，您应使用与内置说明书相同的名称创建自定义说明书，然后将自定义属性定义放在同样名为 `customize.rb` 的属性文件中。该文件优先于内置版本且包含在任何相关模块中。如果您在 `customize.rb` 中定义了任何内置属性，则它们会覆盖对应的内置属性。

本示例说明如何覆盖内置 `[:apache][:keepalivetimeout]` 属性以将其值设置为 5 而不是 3。您可以对任何内置属性使用类似方法。但是，请注意您覆盖的属性。例如，在 `opsworks` 命名空间中覆盖属性可能会导致一些内置配方出现问题。

**重要**  
请勿通过修改内置属性文件本身的副本来覆盖内置属性。例如，您*可以* 将 `apache.rb` 的副本放在您的自定义说明书的 `apache2/attributes` 文件夹中并修改此文件的某些设置。但是，此文件优先于内置版本，而且内置配方现在将使用您的 `apache.rb` 版本。如果 OpsWorks Stacks 稍后修改了内置`apache.rb`文件，则除非您手动更新版本，否则配方将不会获得新值。通过使用`customize.rb`，您只能覆盖指定的属性；内置配方会继续自动获取您尚未覆盖的每个属性的 up-to-date值。

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

**创建说明书**

1. 在您的 `opsworks_cookbooks` 目录中，创建名为 `apache2` 的说明书目录并导航到该目录。

   要覆盖内置属性，自定义说明书必须具有与内置说明书相同的名称，本例中为 `apache2`。

1. 在 `apache2` 目录中创建一个 `attributes` 目录。

1. 将一个名为 `customize.rb` 的文件添加到 `attributes` 目录并使用该文件定义要覆盖的内置说明书属性。在本示例中，该文件应包含以下内容：

   ```
   normal[:apache][:keepalivetimeout] = 5
   ```
**重要**  
要覆盖内置属性，自定义属性必须为 `normal` 类型或更高类型且具有与对应的内置属性完全相同的节点名称。`normal` 类型可确保自定义属性优先于内置属性，后者都是 `default` 类型。有关更多信息，请参阅 [属性优先顺序](workingcookbook-attributes-precedence.md)。

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)。

要使用自定义属性，请创建堆栈并安装说明书。

**使用自定义属性**

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

1. 指定以下标准设置。
   + **姓名** — ApacheConfig
   + **区域**-美国西部（俄勒冈州）

     虽然您可将堆栈放在任何区域中，但在教程中，建议您放在美国西部（俄勒冈州）中。
   + **默认 SSH 密钥**- EC2 密钥对

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

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

   接受其他设置的默认值，然后选择 **Add Stack** 创建堆栈。
**注意**  
本示例使用默认操作系统 Amazon Linux。如果您愿意，则可以使用 Ubuntu。唯一区别是：在 Ubuntu 系统上，内置 Setup 配方会生成一个具有相同设置的名为 `apache2.conf` 的配置文件并将该文件放在 `/etc/apache2` 目录中。

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

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

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

1. 在实例处于联机状态后，[使用 SSH 连接到它](workinginstances-ssh.md)。`httpd.conf` 文件位于 `/etc/httpd/conf` 目录中。如果您检查该文件，则应看到您的自定义 `KeepAliveTimeout` 设置。设置的其余部分将具有内置 `apache.rb` 文件中的默认值。`httpd.conf` 的相关部分应类似于以下内容：

   ```
   ...
   #
   # KeepAliveTimeout: Number of seconds to wait for the next request from the
   # same client on the same connection.
   #
   KeepAliveTimeout 5
   ...
   ```