

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 直接取得屬性值
<a name="cookbooks-101-opsworks-opsworks-stack-config-node"></a>

**重要**  
 AWS OpsWorks Stacks 此服務已於 2024 年 5 月 26 日終止，並已針對新客戶和現有客戶停用。我們強烈建議客戶盡快將其工作負載遷移至其他解決方案。如果您對遷移有任何疑問，請透過 [AWS re：Post](https://repost.aws/) 或透過 [AWS Premium Support](https://aws.amazon.com/support) 聯絡 AWS 支援 團隊。

**注意**  
此方式僅適用於 Linux 堆疊。

[在 Vagrant 上模擬堆疊組態和部署屬性](opsworks-opsworks-mock.md)顯示如何使用節點語法取得堆疊組態和部署資料，以直接參考特定屬性。這有時是最佳方式。不過，許多屬性都定義在集合或清單中，而集合或清單的內容和名稱可能會因不同的堆疊以及特定堆疊的一段時間而不同。例如，`deploy` 屬性包含應用程式屬性清單，而應用程式屬性以應用程式的短名命名。此清單 (包括應用程式屬性名稱) 通常會因不同的堆疊甚至會因不同的部署而不同。

以清單或集合形式列舉屬性來取得所需的資料，通常更為有用，有時甚至是必要的。例如，假設您想要知道堆疊執行個體的公有 IP 地址。該資訊位於設定為雜湊表的 `['opsworks']['layers']` 屬性中，而雜湊表針對每個堆疊 layer 都包含一個元素，以 layer 的短名命名。每個 layer 元素都會設定為包含 layer 屬性的雜湊表，而其中一個是 `['instances']`。該元素接著會設定為另一個雜湊表，其中針對每個 layer 執行個體都包含一個屬性，以執行個體的短名命名。每個執行個體屬性都會設定為另一個雜湊表，其中包含執行個體屬性 (包括代表公有 IP 地址的 `['ip']`)。如果您無法視覺化此項目，則下列程序包括 JSON 格式的範例。

此範例顯示如何從堆疊 layer 的堆疊組態和部署 JSON 取得資料。

**設定技術指南**

1. 在 `opsworks_cookbooks` 內建立並導覽至名為 `listip` 的目錄。

1. 初始化並設定 Test Kitchen，如[範例 1：安裝套件](cookbooks-101-basics-packages.md)中所述。

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:
   ```

在設定技術指南之後，您可以使用下列配方來記錄 layer ID。

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

配方會列舉 `['opsworks']['layers']` 中的 layer，並記錄每 layer 的名稱和 ID。

**執行 layer 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
```

內部迴圈會逐一查看每 layer 的執行個體，並記錄 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 集合的其中一個最常見原因，是取得特定已部署應用程式的資料 (例如其部署目錄)。如需範例，請參閱 [部署配方](create-custom-deploy.md)。