AWS OpsWorks Stacks 数据包参考 - AWS OpsWorks

AWS OpsWorks Stacks 数据包参考

AWS OpsWorks Stacks 以 Chef 数据包内容的形式向配方公开各种设置。本参考列出了此数据包内容。

数据包是一个 Chef 概念。数据包是一种全局变量,在实例上存储为 JSON 数据;可从 Chef 访问该 JSON 数据。例如,数据包可以存储全局变量,如应用程序的源 URL、实例的主机名和关联堆栈的 VPC 标识符。AWS OpsWorks Stacks 将其数据包存储在每个堆栈的实例上。在 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 Stacks 不支持加密数据包。要以加密形式存储敏感数据,例如密码或证书,我们建议将其存储在私有 S3 存储桶中。然后,您可以创建使用适用于 Ruby 的 AWS 开发工具包的自定义配方来检索数据。有关示例,请参阅使用 适用于 Ruby 的开发工具包

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

  • 字符串内容,遵循标准 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-chef-12-linux-demo/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 以表示正在对其执行配方的实例。以下配方代码使用相应数据包项目的内容,将包含相应实例的 AWS OpsWorks Stacks 生成的 ID 和操作系统的消息写入 Chef 日志:

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 搜索。本指南中的所有相关示例均演示的是这种方法。