

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

# 属性优先顺序
<a name="workingcookbook-attributes-precedence"></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 支持 团队联系。

如果一个属性是唯一定义的，Chef 则会简单地将它并入到节点对象中。但是，任何属性源可定义任何属性，因此有可能同一个属性会具有多个使用不同的值的定义。例如，内置 `apache2` 说明书定义 `node[:apache][:keepalive]`，但是您也可在自定义 JSON 或自定义说明书中定义该属性。如果一个属性具有多个定义，则将按下文中描述的顺序对这些定义进行评估，节点对象将接收具有最高最先顺序的定义。

属性的定义如下所示：

```
node.type[:attribute][:sub_attribute][:...]=value
```

如果一个属性有多个定义，则该类型决定哪个定义具有优先级，并将该定义合并到节点对象中。 OpsWorks 堆栈使用以下属性类型：
+ **default**-这是最常见的类型，并且它实际上意味着“如果属性尚未定义，请使用此值。” 如果属性的所有定义都是 `default` 类型，则评估顺序中的第一个定义具有优先顺序并且后续值将被忽略。请注意， OpsWorks Stacks 将所有堆栈配置和部署属性定义设置为`default`类型。
+ **normal**-此类型的属性将覆盖评估顺序中之前定义的任何 `default` 或 `normal` 属性。例如，如果第一个属性来自内置说明书并且具有 `default` 类型，第二个是具有 `normal` 类型的用户定义属性，则第二个定义具有优先顺序。
+ **set** -这是您可能会在早期说明书中看到的已弃用类型。它已由具有相同的优先顺序的 `normal` 取代。

Chef 支持多种其他属性类型，包括优先于所有其他属性定义的 `automatic` 类型。Chef 的 Ohai 工具生成的属性定义均为 `automatic` 类型，因此它们实际上是只读的。这通常不是问题，因为没有理由重写它们，而且它们与 OpsWorks Stacks 的属性不同。但是，您应谨慎为您的自定义说明书属性命名，以便将它们与 Ohai 属性区分开。有关更多信息，请参阅[关于属性](http://docs.chef.io/attributes.html)。

**注意**  
Ohai 工具是您可通过命令行运行的可执行文件。要列出某个实例的 Ohai 属性，请登录该实例并在终端窗口中运行 `ohai`。请注意，此操作将生成一个非常长的输出。

下面是将各种属性定义并入到节点对象中的步骤：

1. 将任何自定义堆栈配置属性合并到堆栈配置和部署属性中。

   可为堆栈或某个特殊部署设置自定义 JSON 属性。它们在评估顺序中优先并且实际上为 `normal` 类型。如果一个或多个堆栈配置属性也是在自定义 JSON 中定义的，则自定义 JSON 值将优先。否则， OpsWorks Stacks 只是将自定义 JSON 属性并入到堆栈配置中。

1. 将任何部署自定义 JSON 属性合并到堆栈配置和部署属性中。

   部署自定义 JSON 属性实际上也是 `normal` 类型，因此它们优先于内置和自定义堆栈配置 JSON 以及内置部署 JSON。

1. 将堆栈配置和部署属性合并到实例的节点对象中。

1. 将实例的内置说明书属性合并到节点对象中。

   内置说明书属性均为 `default` 类型。如果一个或多个内置说明书属性也是在堆栈配置和部署属性中定义的(通常因为您使用自定义 JSON 定义它们)，堆栈配置定义将优先于内置说明书定义。所有其他内置说明书属性将简单地合并到节点对象中。

1. 将实例的自定义说明书属性合并到节点对象中。

   自定义说明书属性通常是 `normal` 或 `default` 类型。唯一属性将合并到节点对象中。如果步骤 1 至步骤 3 中还定义了任何自定义说明书属性 (通常是因为您使用自定义 JSON 定义了它们)，则优先顺序取决于自定义说明书属性的类型：
   + 步骤 1-步骤 3 中定义的属性优先于自定义说明书 `default` 属性。
   + 自定义说明书 `normal` 属性优先于步骤 1 - 步骤 3 中的定义。

**重要**  
请勿使用自定义说明书 `default` 属性覆盖堆栈配置或内置说明书属性。由于自定义说明书属性将最后进行评估，因此 `default` 属性具有最低的优先顺序，并且无法覆盖任何属性。