

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

# OpsWorks 堆栈数据包参考
<a name="data-bags"></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 为食谱提供了各种各样的设置作为厨师数据包的内容。本参考列出了此数据包内容。

*数据包*是一个 Chef 概念。数据包是一种全局变量，在实例上存储为 JSON 数据；可从 Chef 访问该 JSON 数据。例如，数据袋可以存储全局变量，例如应用程序的源 URL、实例的主机名和关联堆栈的 VPC 标识符。 OpsWorks 堆栈将其数据包存储在每个堆栈的实例上。在 Linux 实例上， OpsWorks Stacks 将数据包存储在`/var/chef/runs/run-ID/data_bags`目录中。在 Windows 实例上，它将数据包存储在 `drive:\chef\runs\run-id\data_bags` 目录中。在这两种情况下，都*run-ID*是 OpsWorks Stacks 分配给在实例上运行的每个 Chef 的唯一 ID。这些目录包含一组数据包（子目录）。每个数据包均包含零个或多个数据包项目，这些项目是 JSON 格式的文件，其中包含一系列数据包内容。

**注意**  
OpsWorks 堆栈不支持加密的数据包。要以加密形式存储敏感数据，例如密码或证书，我们建议将其存储在私有 S3 存储桶中。然后，您可以创建一个使用[适用于 Ruby 的 Amazon SDK](https://aws.amazon.com/documentation/sdk-for-ruby/) 来检索数据的自定义配方。有关示例，请参阅[使用适用于 Ruby 的 SDK](cookbooks-101-opsworks-s3.md)。

数据包内容可包括以下任一类型：
+ **字符串**内容，遵循标准 Ruby 语法，可使用单引号或双引号，但其中包含某些特殊字符的字符串必须用双引号引起来。有关更多信息，请转到 [Ruby](http://www.ruby-lang.org/en/documentation/) 文档站点。
+ **布尔值**内容，即 `true` 或 `false` (无引号)。
+ **数字**内容，可以是整数或小数，如 `4` 或 `2.5` (无引号)。
+ **列表**内容，格式为用方括号括起以逗号分隔的值（无引号），例如 `[ '80', '443' ]`
+ **JSON 对象**，其中包含额外数据包内容，如 `"my-app": {"elastic_ip": null,...}`。

Chef 配方可直接或通过 Chef 搜索来访问数据包、数据包项目和数据包内容。下面介绍了如何使用这两种访问方法 (虽然 Chef 搜索是首选)。

要通过 Chef 搜索访问数据包，请使用[搜索](https://docs.chef.io/dsl_recipe.html#search)方法，指定所需的搜索索引。 OpsWorks Stacks 提供以下搜索索引：
+ [aws\$1opsworks\$1app](data-bag-json-app.md)，表示为堆栈部署的一组应用程序。
+ [aws\$1opsworks\$1command](data-bag-json-command.md)，表示在堆栈上运行的一组命令。
+ [aws\$1opsworks\$1ecs\$1cluster](data-bag-json-ecs-cluster.md)，表示堆栈的一组 Amazon Elastic Container Service (Amazon ECS) 集群实例。
+ [aws\$1opsworks\$1elastic\$1load\$1balancer](data-bag-json-elb.md)，表示堆栈的一组 Elastic Load Balancing 负载均衡器。
+ [aws\$1opsworks\$1instance](data-bag-json-instance.md)，表示堆栈的一组实例。
+ [aws\$1opsworks\$1layer](data-bag-json-layer.md)，表示堆栈的一组层。
+ [aws\$1opsworks\$1rds\$1db\$1instance](data-bag-json-rds.md)，它表示堆栈的一组 Amazon Relational Database Service (Amazon RDS) 实例。
+ [aws\$1opsworks\$1stack](data-bag-json-stack.md)，表示一个堆栈。
+ [aws\$1opsworks\$1user](data-bag-json-user.md)，表示堆栈的一组用户。

获知搜索索引名称后，就可以访问该搜索索引的数据包内容。例如，以下配方代码使用 `aws_opsworks_app` 搜索索引来获取 `aws_opsworks_app` 数据包 (`aws_opsworks_app` 目录) 中第一个数据包项目 (第一个 JSON 文件) 的内容。然后，该代码会将两个消息写入 Chef 日志，一个消息包含应用程序的短名称数据包内容 (JSON 文件中的字符串)，另一个消息包含应用程序的源 URL 数据包内容 (JSON 文件中的另一个字符串)：

```
app = search("aws_opsworks_app").first
Chef::Log.info("********** The app's short name is '#{app['shortname']}' **********")
Chef::Log.info("********** The app's URL is '#{app['app_source']['url']}' **********")
```

其中，`['shortname']` 和 `['app_source']['url']` 在相应的 JSON 文件中指定以下数据包内容：

```
{
  ...
  "shortname": "mylinuxdemoapp",
  ...
  "app_source": {
    ...
    "url": "https://s3.amazonaws.com/opsworks-demo-assets/opsworks-linux-demo-nodejs.tar.gz",
  },
  ...  
}
```

有关您可以搜索的数据包内容列表，请参阅本节中的参考主题。

您也可以循环访问数据包中的一组数据包项目。例如，以下配方代码类似于上一个示例；在有多个数据包项目时，该代码可循环访问数据包中的每个数据包项目：

```
search("aws_opsworks_app").each do |app|
  Chef::Log.info("********** The app's short name is '#{app['shortname']}' **********")
  Chef::Log.info("********** The app's URL is '#{app['app_source']['url']}' **********")
end
```

如果您知道存在特定的数据包内容，则可以使用以下语法来查找相应的数据包项目：

```
search("search_index", "key:value").first
```

例如，以下配方代码使用 `aws_opsworks_app` 搜索索引，以查找包含应用程序短名称 `mylinuxdemoapp` 的数据包项目。然后，它使用该数据包项目的内容，将包含相应的应用程序短名称和源 URL 的消息写入 Chef 日志：

```
app = search("aws_opsworks_app", "shortname:mylinuxdemoapp").first
Chef::Log.info("********** For the app with the short name '#{app['shortname']}', the app's URL is '#{app['app_source']['url']}' **********")
```

仅针对 `aws_opsworks_instance` 搜索索引，您可以指定 `self:true` 以表示正在对其执行配方的实例。以下配方代码使用相应的数据袋项的内容向 Chef 日志写一条消息，其中包含相应实例的 OpsWorks Stacks 生成的 ID 和操作系统：

```
instance = search("aws_opsworks_instance", "self:true").first
Chef::Log.info("********** For instance '#{instance['instance_id']}', the instance's operating system is '#{instance['os']}' **********")
```

您可以直接访问数据包、数据包项目和数据包内容，而不使用 Chef 搜索进行访问。为此，可使用 [data\$1bag](https://docs.chef.io/dsl_recipe.html#data-bag) 和 [data\$1bag\$1item](https://docs.chef.io/dsl_recipe.html#data-bag-item) 方法分别访问数据包和数据包项目。例如，以下配方代码执行的操作与上述示例相同，只是该代码直接访问单个数据包项目，然后访问多数据包项目 (当有多个项目时)：

```
# Syntax: data_bag_item("the data bag name", "the file name in the data bag without the file extension")
app = data_bag_item("aws_opsworks_app", "mylinuxdemoapp")
Chef::Log.info("********** The app's short name is '#{app['shortname']}' **********")
Chef::Log.info("********** The app's URL is '#{app['app_source']['url']}' **********")
    
data_bag("aws_opsworks_app").each do |data_bag_item|
  app = data_bag_item("aws_opsworks_app", data_bag_item)
  Chef::Log.info("********** The app's short name is '#{app['shortname']}' **********")
  Chef::Log.info("********** The app's URL is '#{app['app_source']['url']}' **********")
end
```

在这两种方法中，我们建议您使用 Chef 搜索。本指南中的所有相关示例均演示的是这种方法。

**Topics**
+ [应用程序数据包 (aws\$1opsworks\$1app)](data-bag-json-app.md)
+ [命令数据包 (aws\$1opsworks\$1command)](data-bag-json-command.md)
+ [Amazon ECS 集群数据包 (aws\$1opsworks\$1ecs\$1cluster)](data-bag-json-ecs-cluster.md)
+ [Elastic Load Balancing 数据包（aws\$1opsworks\$1elastic\$1load\$1balancer）](data-bag-json-elb.md)
+ [实例数据包 (aws\$1opsworks\$1instance)](data-bag-json-instance.md)
+ [层数据包 (aws\$1opsworks\$1layer)](data-bag-json-layer.md)
+ [Amazon RDS 数据包 (aws\$1opsworks\$1rds\$1db\$1instance)](data-bag-json-rds.md)
+ [堆栈数据包 (aws\$1opsworks\$1stack)](data-bag-json-stack.md)
+ [用户数据包 (aws\$1opsworks\$1user)](data-bag-json-user.md)