

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

# 通过覆盖属性 OpsWorks 来自定义堆栈配置
<a name="workingcookbook-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 堆栈和 Chef 12 Linux 堆栈， OpsWorks Stacks 使用单独的 Chef 运行来制作内置食谱和自定义食谱。这意味着，您无法使用此节中讨论的方法来覆盖 Windows 堆栈和 Chef 12 Linux 堆栈的内置属性。

配方和模板取决于实例的各种 Chef 属性或堆栈特定信息 (如层配置或应用程序服务器设置)。这些属性具有多个源：
+ **自定义 JSON** （可选）-您可在创建、更新或克隆堆栈时或部署应用程序时指定自定义 JSON 属性。
+ **堆栈配置属性** —OpsWorks 堆栈定义这些属性以保存堆栈配置信息，包括您通过控制台设置指定的信息。
+ **部署属性** — AWS OpsWorks 为 Deploy 事件定义与部署相关的属性。
+ **说明书属性** 内置说明书和自定义说明书通常包含一个或多个[属性文件](workingcookbook-installingcustom-components-attributes.md)，这些文件中包含表示说明书特定值（如应用程序服务器配置设置）的属性。
+ **Chef** - Chef 的 [Ohai 工具](http://docs.chef.io/resource_ohai.html)定义了表示各种系统配置设置 (如 CPU 类型和安装的内存) 的属性。

有关堆栈配置和部署属性以及内置说明书属性的完整列表，请参阅[堆栈配置和部署属性：Linux](attributes-json-linux.md) 和[内置说明书属性](attributes-recipes.md)。有关 Ohai 属性的更多信息，请参阅 [Ohai](https://docs.chef.io/ohai.html)。

当[生命周期事件](workingcookbook-events.md)（如部署或配置）出现时，或您运行[堆栈命令](workingstacks-commands.md)（如 `execute_recipes` 或 `update_packages`）时， OpsWorks Stacks 将执行以下操作：
+ 向每个受影响实例上的代理发送相应命令。

  代理将运行适当的配方。例如，对于部署事件，代理将运行内置部署配方，接着运行任何自定义部署配方。
+ 将任何自定义 JSON 和部署属性与堆栈配置属性进行合并，然后在实例上安装它们。

自定义 JSON 中的属性、堆栈配置和部署属性、说明书属性以及 Ohai 属性将会合并到一个*节点对象*中，从而为配方提供属性值。涉及到堆栈配置属性时，包括任何自定义 JSON，实例实际上是无状态的。当您运行某个部署或堆栈命令时，关联的配方将使用通过该命令下载的堆栈配置属性。

**Topics**
+ [

# 属性优先顺序
](workingcookbook-attributes-precedence.md)
+ [

# 使用自定义 JSON 覆盖属性
](workingcookbook-json-override.md)
+ [

# 使用自定义 OpsWorks Cookbook 属性覆盖堆栈属性
](workingcookbook-cookbook-attributes.md)

# 属性优先顺序
<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` 属性具有最低的优先顺序，并且无法覆盖任何属性。

# 使用自定义 JSON 覆盖属性
<a name="workingcookbook-json-override"></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 处理 Windows 堆栈的 Chef 运行方式与 Linux 堆栈不同，因此你不能将本节中讨论的技术用于 Windows 堆栈。

重写 OpsWorks Stacks 属性的最简单方法是在自定义 JSON 中对其进行定义，该属性优先于堆栈配置和部署属性以及内置和自定义食谱`default`属性。有关更多信息，请参阅 [属性优先顺序](workingcookbook-attributes-precedence.md)。

**重要**  
您应谨慎地覆盖堆栈配置和部署属性。例如，覆盖 `opsworks` 命名空间中的属性可能会影响内置配方。有关更多信息，请参阅 [堆栈配置和部署属性](workingcookbook-json.md)。

您还可使用自定义 JSON 来定义唯一属性 (通常用于将数据传递到您的自定义配方)。这些属性将简单地并入到节点对象中，并且配方可通过使用标准 Chef 节点语法来引用它们。

## 如何指定自定义 JSON
<a name="workingcookbook-json-override-specify"></a>

要使用自定义 JSON 来覆盖某个属性值，您必须先确定该属性的完全限定属性名称。然后，您创建一个包含要覆盖、设置为您的首选值的属性的 JSON 对象。为方便起见，[堆栈配置和部署属性：Linux](attributes-json-linux.md) 和[内置说明书属性](attributes-recipes.md)文档一般使用堆栈配置、部署和内置说明书属性，包括其完全限定名称。

对象的父子关系必须对应于适当的完全限定的 Chef 节点。例如，假设您需要更改以下 Apache 属性：
+ [`keepalivetimeout`](attributes-recipes-apache.md#attributes-recipes-apache-keep-timeout) 属性，其节点为 `node[:apache][:keepalivetimeout]` 并且具有默认值 `3`。
+ `logrotate` [`schedule`](attributes-recipes-apache.md#attributes-recipes-apache-log-schedule) 属性，其节点为 `node[:apache][:logrotate][:schedule]`，并且具有默认值 `"daily"`。

要覆盖这些属性并将值分别设置为 `5` 和 `"weekly"`，可使用以下自定义 JSON：

```
{
  "apache" : {
    "keepalivetimeout" : 5,
    "logrotate" : {
       "schedule" : "weekly"
    }
  }
}
```

## 何时指定自定义 JSON
<a name="workingcookbook-json-override-when"></a>

您可为下列任务指定自定义 JSON 结构：
+ [创建新堆栈](workingstacks-creating.md)
+ [更新堆栈](workingstacks-edit.md)
+ [运行堆栈命令](workingstacks-edit.md)
+ [克隆堆栈](workingstacks-cloning.md)
+ [部署应用程序](workingapps-deploying.md)

对于每项任务， OpsWorks Stacks 都会将自定义 JSON 属性与堆栈配置和部署属性合并，然后将其发送到实例，然后合并到节点对象中。但是，请注意以下事项：
+ 如果您在创建、克隆或更新堆栈时指定自定义 JSON，则这些属性将会合并到用于所有后续事件和堆栈命令的堆栈配置和部署属性中。
+ 如果您为部署指定自定义 JSON，则这些属性将会合并到仅用于相应的事件的堆栈配置和部署属性中。

  如果您想要为后续部署使用这些自定义属性，必须再次显式指定自定义 JSON。

请务必记住，这些属性仅在配方使用它们时才会影响实例。如果您覆盖某个属性值，但没有后续配方引用该属性，则更改不会产生影响。您必须确保在关联的配方运行之前发送自定义 JSON，或者确保重新运行适当的配方。

## 自定义 JSON 的最佳实践
<a name="workingcookbook-json-override-best"></a>

你可以使用自定义 JSON 来覆盖任何 OpsWorks Stacks 属性，但是手动输入信息有点麻烦，而且不受任何形式的源代码控制。自定义 JSON 最适合以下用途：
+ 您只想覆盖少量属性，并且您无需使用自定义说明书。

  通过自定义 JSON，您可避免仅为了覆盖一些属性而设置和维护说明书存储库所带来的开销。
+ 敏感值，如密码或身份验证密钥。

  说明书属性存储在一个存储库中，因此所有敏感信息都有泄露风险。可以改为定义使用虚拟值的属性，然后使用自定义 JSON 设置真实值。
+ 预计会变化的值。

  例如，建议的做法是通过不同的开发和暂存堆栈来支持您的生产堆栈。假设这些堆栈支持某个用于接受付款的应用程序。如果您使用自定义 JSON 来指定付款终端节点，则可以为您的暂存堆栈指定一个测试 URL。当您准备好将更新后的堆栈迁移到生产堆栈时，可使用相同的说明书并使用自定义 JSON 来将付款终端节点设置为生产 URL。
+ 特定于某个特殊堆栈或部署命令的值。

# 使用自定义 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` 的副本中的属性，您仅影响这些特定属性。配方将获取内置属性文件中的任何其他属性值，并且将自动获取您尚未覆盖的任何属性的当前值。  
此方法将帮助您在说明书存储库中维持少量的属性，从而降低您的维护开销并使未来的升级管理变得更轻松。