直接获取属性值 - AWS OpsWorks

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

直接获取属性值

重要

这些区域有: AWS OpsWorks Stacks 该服务已于 2024 年 5 月 26 日终止,新客户和现有客户均已禁用。我们强烈建议客户尽快将其工作负载迁移到其他解决方案。如果您对迁移有疑问,请联系 AWS Support 团队开启 AWS re: post 或通过 AWS 高级支持

注意

此方法仅适用于 Linux 堆栈。

在 Vagrant 上模拟堆栈配置和部署属性介绍了如何通过使用节点语法直接引用特定属性来获取堆栈配置和部署数据。有时,这也是最佳方法。但是,很多属性是以集合或列表形式定义的,它们的内容和名称可能因堆栈而异,对于特定堆栈也可能会随着时间的推移而改变。例如,deploy 属性包含一个应用程序属性列表,这些属性是使用应用程序的短名称命名的。此列表 (包括应用程序属性名称) 通常会因堆栈而异,甚至会因部署而异。

通过枚举列表或集合中的属性来获取所需的数据通常更有用,有时甚至是必须的。例如,假设您想知道堆栈实例的公有 IP 地址。该信息位于 ['opsworks']['layers'] 属性中,该属性被设置为包含堆栈的各个层的一个元素的哈希表 (使用层的短名称命名)。每个层元素都被设置为包含该层的属性的哈希表,其中一个属性是 ['instances']。该元素反过来又被设置为另一个包含该层的各个实例的一个属性的哈希表 (使用实例的短名称命名)。每个实例属性又被设置为另一个哈希表,该表包含实例属性,包括表示公有 IP 地址的 ['ip']。如果您在可视化时遇到问题,则以下过程包括JSON格式示例。

此示例说明如何从堆栈配置和部署中JSON获取堆栈层的数据。

设置说明书
  1. opsworks_cookbooks 中创建一个名为 listip 的目录并导航到该目录。

  2. 按照示例 1:安装软件包中所述初始化并配置 Test Kitchen。

  3. 将以下两个目录添加到 listiprecipesenvironments

  4. 创建包含相关属性的 MyStack 配置和部署属性的编辑JSON版本。它应该类似于以下内容。

    { "opsworks": { "layers": { "php-app": { "name": "PHP App Server", "id": "efd36017-ec42-4423-b655-53e4d3710652", "instances": { "php-app1": { "ip": "192.0.2.0" } } }, "db-master": { "name": "MySQL", "id": "2d8e0b9a-0d29-43b7-8476-a9b2591a7251", "instances": { "db-master1": { "ip": "192.0.2.5" } } }, "lb": { "name": "HAProxy", "id": "d5c4dda9-2888-4b22-b1ea-6d44c7841193", "instances": { "lb1": { "ip": "192.0.2.10" } } } } } }
  5. 创建一个名为的环境文件test.json,JSON将示例粘贴到default_attributes,然后将该文件保存到食谱的environments文件夹中。该文件应如下所示(为简洁起见,示例的大部分内容JSON都用省略号表示)。

    { "default_attributes" : { "opsworks": { "layers": { ... } } }, "chef_type" : "environment", "json_class" : "Chef::Environment" }
  6. 使用以下内容替换 .kitchen.yml 中的文本。

    --- driver: name: vagrant provisioner: name: chef_zero environments_path: ./environment platforms: - name: ubuntu-12.04 suites: - name: listip provisioner: client_rb: environment: test run_list: - recipe[listip::default] attributes:

设置好食谱后,你可以使用以下食谱来记录图层IDs。

node['opsworks']['layers'].each do |layer, layerdata| log "#{layerdata['name']} : #{layerdata['id']}" end

该配方将枚举 ['opsworks']['layers'] 中的层并记录每个层的名称和 ID。

运行层 ID 日志记录配方
  1. 使用示例配方创建一个名为 default.rb 的文件,并将该文件保存到 recipes 目录。

  2. 运行 kitchen converge

输出的相关部分应该类似于以下内容。

Recipe: listip::default * log[PHP App Server : efd36017-ec42-4423-b655-53e4d3710652] action write[2014-07-17T22:56:19+00:00] INFO: Processing log[PHP App Server : efd36017-ec42-4423-b655-53e4d3710652] action write (listip::default line 4) [2014-07-17T22:56:19+00:00] INFO: PHP App Server : efd36017-ec42-4423-b655-53e4d3710652 * log[MySQL : 2d8e0b9a-0d29-43b7-8476-a9b2591a7251] action write[2014-07-17T22:56:19+00:00] INFO: Processing log[MySQL : 2d8e0b9a-0d29-43b7-8476-a9b2591a7251] action write (listip::default line 4) [2014-07-17T22:56:19+00:00] INFO: MySQL : 2d8e0b9a-0d29-43b7-8476-a9b2591a7251 * log[HAProxy : d5c4dda9-2888-4b22-b1ea-6d44c7841193] action write[2014-07-17T22:56:19+00:00] INFO: Processing log[HAProxy : d5c4dda9-2888-4b22-b1ea-6d44c7841193] action write (listip::default line 4) [2014-07-17T22:56:19+00:00] INFO: HAProxy : d5c4dda9-2888-4b22-b1ea-6d44c7841193

要列出实例的 IP 地址,您需要一个类似于下方所示的嵌套循环。

node['opsworks']['layers'].each do |layer, layerdata| log "#{layerdata['name']} : #{layerdata['id']}" layerdata['instances'].each do |instance, instancedata| log "Public IP: #{instancedata['ip']}" end end

内部循环将遍历每个层的实例并记录 IP 地址。

运行实例 IP 日志记录配方
  1. default.rb 中的代码替换为示例配方。

  2. 运行 kitchen converge 以执行该配方。

输出的相关部分应该类似于以下内容。

* log[PHP App Server : efd36017-ec42-4423-b655-53e4d3710652] action write[2014-07-17T23:09:34+00:00] INFO: Processing log[PHP App Server : efd36017-ec42-4423-b655-53e4d3710652] action write (listip::default line 2) [2014-07-17T23:09:34+00:00] INFO: PHP App Server : efd36017-ec42-4423-b655-53e4d3710652 * log[Public IP: 192.0.2.0] action write[2014-07-17T23:09:34+00:00] INFO: Processing log[Public IP: 192.0.2.0] action write (listip::default line 4) [2014-07-17T23:09:34+00:00] INFO: Public IP: 192.0.2.0 * log[MySQL : 2d8e0b9a-0d29-43b7-8476-a9b2591a7251] action write[2014-07-17T23:09:34+00:00] INFO: Processing log[MySQL : 2d8e0b9a-0d29-43b7-8476-a9b2591a7251] action write (listip::default line 2) [2014-07-17T23:09:34+00:00] INFO: MySQL : 2d8e0b9a-0d29-43b7-8476-a9b2591a7251 * log[Public IP: 192.0.2.5] action write[2014-07-17T23:09:34+00:00] INFO: Processing log[Public IP: 192.0.2.5] action write (listip::default line 4) [2014-07-17T23:09:34+00:00] INFO: Public IP: 192.0.2.5 * log[HAProxy : d5c4dda9-2888-4b22-b1ea-6d44c7841193] action write[2014-07-17T23:09:34+00:00] INFO: Processing log[HAProxy : d5c4dda9-2888-4b22-b1ea-6d44c7841193] action write (listip::default line 2) [2014-07-17T23:09:34+00:00] INFO: HAProxy : d5c4dda9-2888-4b22-b1ea-6d44c7841193 * log[Public IP: 192.0.2.10] action write[2014-07-17T23:09:34+00:00] INFO: Processing log[Public IP: 192.0.2.10] action write (listip::default line 4) [2014-07-17T23:09:34+00:00] INFO: Public IP: 192.0.2.10

完成后,请运行 kitchen destroy;下一个主题将使用新说明书。

注意

枚举堆栈配置和部署JSON集合的最常见原因之一是获取特定已部署应用程序的数据,例如其部署目录。有关示例,请参阅Deploy 配方