

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

# 属性
<a name="workingcookbook-installingcustom-components-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 支持 团队联系。

配方和模板取决于各种值，如配置设置。您可以创建一个包含表示每个值的属性的属性文件，而不是直接在配方或模板中对这些值进行硬编码。然后，在您的配方或模板中使用这些属性而不是显式值。使用属性的优点是，您可以覆盖属性值而不用接触到说明书。因此，您应始终使用属性来定义以下类型的值：
+ 因堆栈不同或随时间可能发生变化的值，如用户名。

  如果对这类值进行硬编码，您必须在每次需要更改值时更改相应的配方或模板。通过使用属性定义这些值，您可以针对每个堆栈使用相同的说明书，而且只需覆盖相应的属性。
+ 敏感值，如密码或私有密钥。

  将显式敏感值放置于您的说明书中可能会增加暴露的风险。相反，应使用虚拟值定义属性，然后覆盖它们以设置实际值。覆盖这类属性的最佳方法是使用自定义 JSON。有关更多信息，请参阅 [使用自定义 JSON](workingcookbook-json-override.md)。

有关属性以及如何覆盖它们的更多信息，请参阅[覆盖属性](workingcookbook-attributes.md)。

以下示例是示例属性文件的一部分。

```
...
default["apache"]["listen_ports"] = [ '80','443' ]
default["apache"]["contact"] = 'ops@example.com'
default["apache"]["timeout"] = 120
default["apache"]["keepalive"] = 'Off'
default["apache"]["keepaliverequests"] = 100
default["apache"]["keepalivetimeout"] = 3
default["apache"]["prefork"]["startservers"] = 16
default["apache"]["prefork"]["minspareservers"] = 16
default["apache"]["prefork"]["maxspareservers"] = 32
default["apache"]["prefork"]["serverlimit"] = 400
default["apache"]["prefork"]["maxclients"] = 400
default["apache"]["prefork"]["maxrequestsperchild"] = 10000
...
```

 OpsWorks Stacks 使用以下语法定义属性：

```
node.type["attribute"]["subattribute"]["..."]=value
```

您也可以使用冒号 (:)，如下所示：

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

一个属性定义包含以下部分：

## `node.`
<a name="node"></a>

`node.` 前缀是可选的且通常会被省略，如示例中所示。

## `type`
<a name="type"></a>

该类型决定该属性是否可以被覆盖。 OpsWorks 堆栈属性通常使用以下类型之一：
+ `default` 是最常用类型，因为它允许覆盖属性。
+ `normal`定义一个属性，该属性会覆盖标准 OpsWorks 堆栈属性值之一。

**注意**  
Chef 支持其他类型，这些类型对于 OpsWorks Stacks 来说不是必需的，但可能对你的项目有用。有关更多信息，请参阅[关于属性](http://docs.chef.io/attributes.html)。

## `attribute name`
<a name="attribute-name"></a>

属性名称使用标准 Chef 节点语法：`[:attribute][:subattribute][...]`。您可以为您的属性使用您喜欢的任何名称。不过，如[覆盖属性](workingcookbook-attributes.md)中所讨论的，自定义说明书属性与来自堆栈配置的属性和部署属性，以及 Chef 的 [Ohai 工具](https://docs.chef.io/ohai.html)一起，合并到实例的节点对象中。常用配置名称 (如 *port* 或 *user*) 可能会显示在各种说明书中。

为避免名称冲突，通常的做法是创建至少包含两个元素的限定属性名称，如示例中所示。第一个元素应是唯一的且通常基于产品名称，如 *Apache*。它后接一个或多个标识特定值的子属性，如 `[:user]` 或 `[:port]`。您可以根据项目的需要使用任意数量的子属性。

## `value`
<a name="value"></a>

一个属性可设置为以下类型的值：
+ 字符串，如 `default[:apache][:keepalive] = 'Off'`。
+ 数字 (不带引号)，如 `default[:apache][:timeout] = 120`。
+ 布尔值，可以是 `true` 或 `false` (不带引号)。
+ 值列表，如 `default[:apache][:listen_ports] = [ '80','443' ]`

属性文件是一个 Ruby 应用程序，因此您还可以使用节点语法和逻辑运算符来基于其他属性分配值。有关如何定义属性的更多信息，请参阅[关于属性](https://docs.chef.io/chef_overview_attributes.html)。[有关工作属性文件的示例，请参阅 opsworks-cookbooks 上的 OpsWorks Stacks 内置食谱。https://github.com/aws/](https://github.com/aws/opsworks-cookbooks)