

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

# 直接获取属性值
<a name="cookbooks-101-opsworks-opsworks-stack-config-node"></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 支持 团队联系。

**注意**  
此方法仅适用于 Linux 堆栈。

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

通过枚举列表或集合中的属性来获取所需的数据通常更有用，有时甚至是必须的。例如，假设您想知道堆栈实例的公有 IP 地址。该信息位于 `['opsworks']['layers']` 属性中，该属性被设置为包含堆栈的各个层的一个元素的哈希表 (使用层的短名称命名)。每个层元素都被设置为包含该层的属性的哈希表，其中一个属性是 `['instances']`。该元素反过来又被设置为另一个包含该层的各个实例的一个属性的哈希表 (使用实例的短名称命名)。每个实例属性又被设置为另一个哈希表，该表包含实例属性，包括表示公有 IP 地址的 `['ip']`。如果您很难在脑海中清晰地呈现这种结构，可参考以下过程，当中的 JSON 格式的示例可帮助您理解。

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

**设置说明书**

1. 在 `opsworks_cookbooks` 中创建一个名为 `listip` 的目录并导航到该目录。

1. 按照[示例 1：安装软件包](cookbooks-101-basics-packages.md)中所述初始化并配置 Test Kitchen。

1. 将以下两个目录添加到 `listip`：`recipes` 和 `environments`。

1. 创建包含相关属性的 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"
             }
           }
         }
       }
     }
   }
   ```

1. 创建名为 `test.json` 的环境文件，将示例 JSON 粘贴到 `default_attributes`，并将该文件保存到说明书的 `environments` 文件夹。该文件应类似于以下内容 (为简洁起见，大多数示例 JSON 用省略号表示)。

   ```
   {
     "default_attributes" : {
       "opsworks": {
         "layers": {
           ...
         }
       }
     },
     "chef_type" : "environment",
     "json_class" : "Chef::Environment"
   }
   ```

1. 使用以下内容替换 `.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` 目录。

1. 运行 `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` 中的代码替换为示例配方。

1. 运行 `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 配方](create-custom-deploy.md)。