

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

# 在 Vagrant 上模擬堆疊組態和部署屬性
<a name="opsworks-opsworks-mock"></a>

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

**注意**  
本主題僅適用於 Linux 執行個體。Test Kitchen 尚未支援 Windows，因此您將在 Stacks 執行個體上執行所有 Windows OpsWorks 範例。

OpsWorks Stacks 會將[堆疊組態和部署屬性](workingcookbook-json.md)新增至堆疊中每個生命週期事件每個執行個體的節點物件。這些屬性提供堆疊組態的快照，包括每 layer 和其線上執行個體的組態、每個已部署應用程式的組態，以此類推。由於這些屬性位於節點物件中，因此任何配方都可以存取它們；大多數 Stacks OpsWorks 執行個體的配方會使用一或多個這些屬性。

在 Vagrant 方塊中執行的執行個體不是由 Stacks OpsWorks 管理，因此其節點物件預設不會包含任何堆疊組態和部署屬性。不過，您可以將適合的屬性集新增至 Test Kitchen 環境。Test Kitchen 接著會將屬性新增至執行個體的節點物件，而您的配方可以像在 Stacks OpsWorks 執行個體上一樣存取屬性。

本主題顯示如何取得適合堆疊組態和部署屬性的複本、在執行個體上安裝屬性，以及存取它們。

**注意**  
如果您使用 Test Kitchen 在配方上執行測試，則 [fauxhai](https://github.com/customink/fauxhai) 提供替代方法來模擬堆疊組態和部署 JSON。

**設定技術指南**

1. 建立並導覽至名為 `printjson` 的 `opsworks_cookbooks` 子目錄。

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

1. 將兩個子目錄新增至 `printjson`：`recipes` 和 `environments`。

您可以將具有適當定義的屬性檔案新增至技術指南，來模擬堆疊組態和部署屬性，但更佳的方式是使用 Test Kitchen 環境。有兩種基本方式：
+ 將屬性定義新增至 `.kitchen.yml`。

  如果您只有幾個屬性，則此方式最為有用。如需詳細資訊，請參閱 [kitchen.yml](https://docs.chef.io/config_yml_kitchen.html)。
+ 在環境檔案中定義屬性，並參考 `.kitchen.yml` 中的檔案。

  此方式通常適用於堆疊組態和部署屬性，因為環境檔案已為 JSON 格式。您可以從適當的 Stacks OpsWorks 執行個體取得 JSON 格式的屬性副本，並直接貼上。所有範例都會使用環境檔案。

建立您技術指南的堆疊組態和部署屬性的最簡單方法是建立已適當設定的堆疊，以及從執行個體複製產生的屬性且其格式為 JSON。為了讓 Test Kitchen 環境易於管理，您可以接著編輯該 JSON 檔案，使其只具有您配方所需的屬性。本章中的範例根據[Chef 11 Linux 堆疊入門](gettingstarted.md) 中的堆疊，此簡單 PHP 應用程式伺服器堆疊具有一個負載平衡器、多部 PHP 應用程式伺服器和一個 MySQL 資料庫伺服器。

**建立堆疊組態和部署 JSON**

1. 如[Chef 11 Linux 堆疊入門](gettingstarted.md) 中所述，建立 MyStack (包括部署 SimplePHPApp)。如果您願意，可以省略在 中呼叫 的第二個 PHP App Server 執行個體[步驟 4：橫向擴展 MyStack](gettingstarted-scale.md)；範例不會使用這些屬性。

1. 如果您尚未這麼做，則請啟動 `php-app1` 執行個體，然後[使用 SSH 登入](workinginstances-ssh.md)。

1. 在終端機視窗中，執行下列 [agent cli](agent.md) 命令：

   ```
   sudo opsworks-agent-cli get_json
   ```

   此命令會將執行個體的最新堆疊組態和部署屬性以 JSON 格式列印到終端機視窗。

1. 將 JSON 複製至 `.json` 檔案，並將它儲存至工作站上的方便位置。詳細資訊取決於 SSH 用戶端。例如，如果您在 Windows 上使用 PuTTY，則可以執行 `Copy All to Clipboard` 命令，以將終端機視窗中的所有文字都複製至 Windows 剪貼簿。您接著可以將內容貼入 `.json` 檔案，並編輯檔案以移除多餘的文字。

1. 視需要編輯 MyStack JSON。堆疊組態和部署屬性有很多，而且技術指南通常只會使用其中的一小部分。為了讓環境檔案易於管理，您可以編輯 JSON，讓它保留原始結構，但只包含您技術指南實際使用的屬性。

   此範例使用大量編輯過的 MyStack JSON 版本，其中僅包含兩個 `['opsworks']['stack']` 屬性：`['id]` 和 `['name']`。建立編輯過的 MyStack JSON 版本，看起來與下列類似：

   ```
   {
     "opsworks": {
       "stack": {
         "name": "MyStack",
         "id": "42dfd151-6766-4f1c-9940-ba79e5220b58",
       },
     },
   }
   ```

若要讓此 JSON 進入執行個體的節點物件，您需要將它新增至 Test Kitchen 環境。

**將堆疊組態和部署屬性新增至 Test Kitchen 環境**

1. 使用下列內容建立名為 `test.json` 的環境檔案，並將它儲存至技術指南的 `environments` 資料夾。

   ```
   {
     "default_attributes": {
       "opsworks" : {
         "stack" : {
           "name" : "MyStack",
           "id" : "42dfd151-6766-4f1c-9940-ba79e5220b58"
         }
       }
     },
     "chef_type" : "environment",
     "json_class" : "Chef::Environment"
   }
   ```

   環境檔案具有下列元素：
   + `default_attributes` – JSON 格式的預設屬性。

     這些屬性會新增至具有 `default` 屬性類型的節點物件，這是所有堆疊組態和部署 JSON 屬性所使用的類型。此範例使用先前顯示且編輯過的堆疊組態和部署 JSON 版本。
   + `chef_type` – 將此元素設定為 `environment`。
   + `json_class` – 將此元素設定為 `Chef::Environment`。

1. 編輯 `.kitchen.yml` 來定義 Test Kitchen 環境，如下所示。

   ```
   ---
   driver:
     name: vagrant
   
   provisioner:
     name: chef_solo
     environments_path: ./environments
   
   platforms:
     - name: ubuntu-12.04
   
   suites:
     - name: printjson 
       provisioner:
         solo_rb:
           environment: test
       run_list:
         - recipe[printjson::default]
       attributes:
   ```

   您可以將下列元素新增至 `kitchen init` 所建立的預設 `.kitchen.yml`，來定義環境。  
**provisioner**  
新增下列元素。  
   + `name` – 將此元素設定為 `chef_solo`。

     若要更緊密地複寫 OpsWorks Stacks 環境，您可以使用 [Chef 用戶端本機模式](https://docs.chef.io/ctl_chef_client.html)，而不是 Chef 獨佔。本機模式是一個 Chef 用戶端選項，使用在執行個體上本機執行的輕量版 Chef 伺服器 (Chef Zero)，而非遠端伺服器。這可讓您的配方使用 Chef 伺服器功能，例如未連線至遠端伺服器的搜尋或資料包。
   + `environments_path` – 技術指南子目錄，其中包含環境檔案，在此範例中`./environments`為 。  
**suites:provisioner**  
新增 `solo_rb` 元素，但其 `environment` 元素設定為環境檔案名稱並去除 .json 副檔名。此範例將 `environment` 設定為 `test`。

1. 使用下列內容建立名為 `default.rb` 的配方檔案，並將它儲存至技術指南的 `recipes` 目錄。

   ```
   log "Stack name: #{node['opsworks']['stack']['name']}"
   log "Stack id: #{node['opsworks']['stack']['id']}"
   ```

   此配方只會記錄您新增至環境的兩個堆疊組態和部署值。雖然配方是在 Virtual Box 本機執行，但您可以使用與配方在 Stacks OpsWorks 執行個體上執行時相同的節點語法來參考這些屬性。

1. 執行 `kitchen converge`。您應該會看到與下列類似的日誌輸出。

   ```
   ...
   Converging 2 resources       
   Recipe: printjson::default       
     * log[Stack name: MyStack] action write[2014-07-01T23:14:09+00:00] INFO: Processing log[Stack name: MyStack] action write (printjson::default line 1)       
   [2014-07-01T23:14:09+00:00] INFO: Stack name: MyStack       
                
     * log[Stack id: 42dfd151-6766-4f1c-9940-ba79e5220b58] action write[2014-07-01T23:14:09+00:00] INFO: Processing log[Stack id: 42dfd151-6766-4f1c-9940-ba79e5220b58] action write (printjson::default line 2)       
   [2014-07-01T23:14:09+00:00] INFO: Stack id: 42dfd151-6766-4f1c-9940-ba79e5220b58       
   ...
   ```