

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

# 使用自定义 OpsWorks Cookbook 属性覆盖堆栈属性
<a name="workingcookbook-cookbook-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 支持 团队联系。

**注意**  
对于 Windows 堆栈， OpsWorks Stacks 使用单独的 Chef 运行来生成内置食谱和自定义食谱。这意味着，您无法使用此节中讨论的方法来覆盖 Windows 堆栈的内置属性。

自定义 JSON 是覆盖 OpsWorks Stacks 堆栈配置和内置食谱属性的便捷方法，但它有一些限制。具体而言，您必须在每次使用时手动输入自定义 JSON，因此您没有管理定义的稳健方式。更好的方式一般是使用自定义说明书属性文件来覆盖内置属性。这样做可让您将定义置于源代码管理之下。

使用自定义属性文件覆盖 OpsWorks 堆栈定义的过程非常简单。

**重写 OpsWorks Stacks 属性定义**

1. 如[说明书和诀窍](workingcookbook.md)中所述设置说明书存储库。

1. 使用与包含您要覆盖的属性的内置说明书相同的名称创建一个说明书。例如，要覆盖 Apache 属性，说明书应命名为 apache2。

1. 将 `attributes` 文件夹添加到说明书并将一个名为 `customize.rb` 的文件添加到该文件夹中。

1. 将一个属性定义添加到您要覆盖、设置为您的首选值的每个内置说明书属性的文件中。该属性必须是`normal`类型或更高的类型，并且与相应的 OpsWorks Stacks 属性具有完全相同的节点名称。有关 OpsWorks 堆栈属性的详细列表，包括节点名称，请参阅[堆栈配置和部署属性：Linux](attributes-json-linux.md)和。[内置说明书属性](attributes-recipes.md)有关属性和属性文件的更多信息，请参阅[关于属性文件](http://docs.chef.io/attributes.html)。
**重要**  
您的属性必须是`normal`类型才能覆盖 OpsWorks Stacks 属性；`default`类型没有优先级。例如，如果您的 `customize.rb` 文件包含 `default[:apache][:keepalivetimeout] = 5` 属性定义，则内置 `apache.rb` 属性文件中的对应属性将先进行评估，并且优先。有关更多信息，请参阅 [覆盖属性](workingcookbook-attributes.md)。

1. 对于包含您要覆盖的属性的每个内置说明书，重复步骤 2 至 4。

1. 为您的堆栈启用自定义食谱，并提供 Stac OpsWorks ks 将您的食谱下载到堆栈实例所需的信息。有关更多信息，请参阅 [安装自定义说明书](workingcookbook-installingcustom-enable.md)。

**注意**  
有关此过程的完整演练，请参阅[覆盖内置属性](cookbooks-101-opsworks-attributes.md)。

后续生命周期事件、部署命令和堆栈命令使用的节点对象现在将包含您的属性定义而不是 OpsWorks 堆栈值。

例如，要覆盖`keepalivetimeout` 中讨论的内置 `logrotate schedule` 和 [如何指定自定义 JSON](workingcookbook-json-override.md#workingcookbook-json-override-specify) 设置，请将 `apache2`apache 说明书添加到您的存储库并将 `customize.rb` 文件添加到说明书中包含下列内容的 `attributes` 文件夹。

```
normal[:apache][:keepalivetimeout] = 5
normal[:apache][:logrotate][:schedule] = 'weekly'
```

**重要**  
不应通过修改关联的内置属性文件的副本来覆盖 OpsWorks Stacks 属性。例如，如果您将 `apache.rb` 复制到您的 `apache2/attributes` 文件夹并修改其部分设置，实际上将会覆盖内置文件中的所有属性。配方将使用副本中的属性定义并忽略内置文件。如果 OpsWorks Stacks 之后修改内置属性文件，除非您手动更新副本，否则配方将无权访问更改。  
为避免这种情况，所有内置说明书都包含空的 `customize.rb` 属性文件，该文件是所有模块中通过 `include_attribute` 指令要求的。通过覆盖 `customize.rb` 的副本中的属性，您仅影响这些特定属性。配方将获取内置属性文件中的任何其他属性值，并且将自动获取您尚未覆盖的任何属性的当前值。  
此方法将帮助您在说明书存储库中维持少量的属性，从而降低您的维护开销并使未来的升级管理变得更轻松。