

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

# 使用自定义 JSON
<a name="workingstacks-json"></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 操作允许你指定自定义 JSON， OpsWorks Stacks 会将其安装在实例上并可供配方使用。

您可以在以下情况下指定自定义 JSON：
+ 当您创建、更新或克隆堆栈时。

  AWS OpsWorks Stacks 在所有实例上安装自定义 JSON，用于所有后续[生命周期事件](workingcookbook-events.md)。
+ 当您运行部署或堆栈命令时。

  AWS OpsWorks Stacks 仅将该事件的自定义 JSON 传递给实例。

自定义 JSON 必须由有效的 JSON 对象表示，并且必须格式化为有效的 JSON 对象。例如：

```
{
  "att1": "value1",
  "att2": "value2"
  ...
}
```

OpsWorks 堆栈将自定义 JSON 存储在以下位置：

在 Linux 实例上：
+ `/var/chef/runs/run-ID/attribs.json`
+ `/var/chef/runs/run-ID/nodes/hostname.json`

在 Windows 实例上：
+ `drive:\chef\runs\run-ID\attribs.json`
+ `drive:\chef\runs\run-ID\nodes\hostname.json`

**注意**  
在 Chef 11.10 和较早版本的 Linux 中，自定义 JSON 位于 Linux 实例的以下路径中，Windows 实例不可用，且没有 `attribs.json` 文件。日志存储在与 JSON 相同的文件夹或目录中。有关 Chef 11.10 和较早版本的 Linux 中的自定义 JSON 的信息，请参阅[用自定义 JSON 覆盖属性](https://docs.aws.amazon.com/opsworks/latest/userguide/workingcookbook-json-override.html)和 [Chef 日志](https://docs.aws.amazon.com/opsworks/latest/userguide/troubleshoot-debug-log.html#troubleshoot-debug-log-instance)。  
`/var/lib/aws/opsworks/chef/hostname.json`

在前面的路径中，*run-ID*是 OpsWorks Stacks 分配给在实例上运行的每个 Chef 的唯一 ID，*hostname*它是该实例的主机名。

要访问 Chef 配方的自定义 JSON，请使用标准 Chef `node` 语法。

例如，假设您想为您要部署的某个应用程序定义简单的设置，如该应用程序最初是否显示，以及该应用程序的初始前台和后台颜色。假设您使用如下所示的 JSON 对象来定义这些应用程序设置：

```
{
  "state": "visible",
  "colors": {
    "foreground": "light-blue",
    "background": "dark-gray"
  }
}
```

声明堆栈的自定义 JSON：

1. 在堆栈页面上，选择 **Stack Settings**，然后选择 **Edit**。

1. 对于 **Custom Chef JSON**，键入 JSON 对象，然后选择 **Save**。

**注意**  
您可以在部署、层和堆栈级别声明自定义 JSON。如果您希望某些自定义 JSON 仅对单个部署或层显示，则建议您执行此操作。或者，例如，建议您使用在层级别声明的自定义 JSON 来临时覆盖在堆栈级别声明的自定义 JSON。如果您在多个级别声明自定义 JSON，则在部署级别声明的自定义 JSON 将覆盖同时在层级别和堆栈级别声明的任何自定义 JSON。在层级别声明的自定义 JSON 会覆盖只在堆栈级别声明的任何自定义 JSON。  
要使用 OpsWorks Stacks 控制台为部署指定自定义 JSON，请在**部署应用程序**页面上选择**高级**。在 **Custom Chef JSON** 框中键入自定义 JSON，然后选择 **Save**。  
要使用 OpsWorks Stacks 控制台为图层指定自定义 JSON，请在**图层**页面上为所需图层选择**设置**。在 **Custom JSON** 框中键入自定义 JSON，然后选择 **Save**。  
有关更多信息，请参阅[编辑图 OpsWorks 层的配置](workinglayers-basics-edit.md)和[部署应用程序](workingapps-deploying.md)。

当您运行部署或堆栈命令时，配方可通过使用标准 Chef `node` 语法来检索这些自定义值，该语法会直接映射到自定义 JSON 对象中的层次结构。例如，以下配方代码会将关于上述自定义 JSON 值的消息写入 Chef 日志：

```
Chef::Log.info("********** The app's initial state is '#{node['state']}' **********")
Chef::Log.info("********** The app's initial foreground color is '#{node['colors']['foreground']}' **********")
Chef::Log.info("********** The app's initial background color is '#{node['colors']['background']}' **********")
```

这种方法对于将数据传递给配方很有用。 OpsWorks Stacks 将这些数据添加到实例中，配方可以使用标准的 Chef `node` 语法来检索数据。

**注意**  
自定义 JSON 限制为 120 KB。如果您需要更多容量，则建议您将部分数据存储在 Amazon Simple Storage Service (Amazon S3) 上。然后，您的自定义配方可以使用 [AWS CLI](https://aws.amazon.com/documentation/cli/) 或 [适用于 Ruby 的 AWS SDK](https://docs.aws.amazon.com/sdk-for-ruby/v3/api/) 将 Amazon S3 存储桶中的数据下载到您的实例。