AWS OpsWorks 堆栈数据包参考 - AWS OpsWorks

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

AWS OpsWorks 堆栈数据包参考

重要

该 AWS OpsWorks Stacks 服务于 2024 年 5 月 26 日终止,新客户和现有客户均已禁用。我们强烈建议客户尽快将其工作负载迁移到其他解决方案。如果您对迁移有疑问,请通过 re AWS : Post 或通过 Pre mium Su AWS pp ort 与 AWS 支持 团队联系。

AWS OpsWorks Stacks 为食谱提供了各种各样的设置作为厨师数据包的内容。本参考列出了此数据包内容。

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

注意

AWS OpsWorks 堆栈不支持加密的数据包。要以加密形式存储敏感数据,例如密码或证书,我们建议将其存储在私有 S3 存储桶中。然后,您可以创建一个使用适用于 Ruby 的 Amazon SDK 来检索数据的自定义配方。有关示例,请参阅在 Ruby SDK 中使用

数据包内容可包括以下任一类型:

  • 字符串内容,遵循标准 Ruby 语法,可使用单引号或双引号,但其中包含某些特殊字符的字符串必须用双引号引起来。有关更多信息,请转到 Ruby 文档站点。

  • 布尔值内容,即 truefalse (无引号)。

  • 数字内容,可以是整数或小数,如 42.5 (无引号)。

  • 列表内容,格式为用方括号括起以逗号分隔的值(无引号),例如 [ '80', '443' ]

  • JSON 对象,其中包含额外数据包内容,如 "my-app": {"elastic_ip": null,...}

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

要通过 Chef 搜索访问数据包,请使用搜索方法,指定所需的搜索索引。 AWS OpsWorks Stacks 提供以下搜索索引:

获知搜索索引名称后,就可以访问该搜索索引的数据包内容。例如,以下配方代码使用 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 日志写一条消息,其中包含相应实例的 AWS 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_bagdata_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 搜索。本指南中的所有相关示例均演示的是这种方法。