

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

# 在 Stacks Linux OpsWorks 執行個體上執行配方
<a name="cookbooks-101-opsworks-opsworks-instance"></a>

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

Test Kitchen 和 Vagrant 提供簡單且有效率的方式來實作技術指南，但為了驗證技術指南的配方在生產環境中正確執行，您必須在 OpsWorks Stacks 執行個體上執行它們。本主題說明如何在 OpsWorks Stacks Linux 執行個體上安裝自訂技術指南，以及執行簡單配方。本主題也提供一些有效修復配方錯誤的秘訣。

如需如何在 Windows 執行個體上執行配方的描述，請參閱[在 Windows 執行個體上執行配方](cookbooks-101-opsworks-opsworks-windows.md)。

**Topics**
+ [建立和執行配方](#opsworks-opsworks-instance-create)
+ [自動執行配方](#cookbooks-101-opsworks-opsworks-instance-events)
+ [故障診斷和修復手冊](#cookbooks-101-opsworks-opsworks-instance-bugs)

## 建立和執行配方
<a name="opsworks-opsworks-instance-create"></a>

首先，您需要建立堆疊。以下簡短地彙總如何針對此範例建立堆疊。如需詳細資訊，請參閱[建立新的堆疊](workingstacks-creating.md)。

**建立 堆疊**

1. 開啟 [OpsWorks Stacks 主控台](https://console.aws.amazon.com/opsworks/)，然後按一下 **Add Stack (新增堆疊)**。

1. 指定下列設定，並接受其他設定的預設值，然後按一下 **Add Stack (新增堆疊)**。
   + **名稱** – OpsTest
   + **預設 SSH 金鑰** – Amazon EC2 金鑰對

   如果您需要建立 Amazon EC2 金鑰對，請參閱 [Amazon EC2 金鑰對](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-key-pairs.html)。請注意，金鑰對必須屬於與執行個體相同的 AWS 區域。此範例使用預設的美國西部 （奧勒岡） 區域。

1. 按一下 **Add a layer (新增 layer)**，並[新增自訂 layer](workinglayers-custom.md) 至具有下列設定的堆疊。
   + **名稱** – OpsTest
   + **簡短名稱**：opstest

   任何 layer 類型都會實際作用於 Linux 堆疊，但此範例不需要其他 layer 類型所安裝的任何套件，因此自訂 layer 是最簡單的方法。

1. [新增全年無休執行個體](workinginstances-add.md) (具有預設設定) 至 layer，以及[啟動它](workinginstances-starting.md)。

當執行個體啟動時，您通常需要幾分鐘的時間來建立技術指南。此範例將使用[條件式邏輯](cookbooks-101-basics-ruby.md#cookbooks-101-basics-ruby-conditional)中稍微修改過的配方版本，這會建立其名稱取決於平台的資料目錄。

**設定技術指南**

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

1. 使用下列內容建立 `metadata.rb` 檔案，並將它儲存至 `opstest`。

   ```
   name "opstest"
   version "0.1.0"
   ```

1. 在 `recipes` 內建立 `opstest` 目錄。

1. 使用下列配方建立 `default.rb` 檔案，並將它儲存至 `recipes` 目錄。

   ```
   Chef::Log.info("******Creating a data directory.******")
   
   data_dir = value_for_platform(
     "centos" => { "default" => "/srv/www/shared" },
     "ubuntu" => { "default" => "/srv/www/data" },
     "default" => "/srv/www/config"
   )
   
   directory data_dir do
     mode 0755
     owner 'root'
     group 'root'
     recursive true
     action :create
   end
   ```

   請注意，配方會記錄訊息，但做法是呼叫 `Chef::Log.info`。您在此範例中未使用 Test Kitchen，因此 `log`方法不太有用。 會將訊息`Chef::Log.info`放入 Chef 日誌中，您可以在 Chef 執行完成後讀取該日誌。 OpsWorks Stacks 提供檢視這些日誌的簡單方法，如下所述。
**注意**  
Chef 日誌通常包含許多例行作業和相對無趣的資訊。括住訊息文字的 '\$1' 字元可讓您更輕鬆地找到它們。

1. 建立 `opsworks_cookbooks` 的 `.zip` 存檔。若要在 OpsWorks Stacks 執行個體上安裝技術指南，您必須將其存放在儲存庫中，並提供 Stacks OpsWorks 將技術指南下載至執行個體所需的資訊。您可以將技術指南存放至任何數個支援的儲存庫類型中。此範例會將包含技術指南的封存檔案存放在 Amazon S3 儲存貯體中。如需技術指南儲存庫的詳細資訊，請參閱[技術指南儲存庫](workingcookbook-installingcustom-repo.md)。
**注意**  
為求簡化，此範例只會封存整個 `opsworks_cookbooks` 目錄。不過，這表示 Stacks OpsWorks 會將 中的所有技術指南下載`opsworks_cookbooks`到執行個體，即使您只使用其中一個技術指南。若只要安裝範例技術指南，請建立另一個父目錄，並將 `opstest` 移至該目錄。然後，建立父目錄的 `.zip` 封存，並使用它，而非 `opsworks_cookbooks.zip`。  
傳遞至 Amazon S3 儲存貯體的內容可能包含客戶內容。如需移除敏感資料的詳細資訊，請參閱[如何清空 S3 儲存貯體？](https://docs.aws.amazon.com/AmazonS3/latest/userguide/empty-bucket.html)或[如何刪除 S3 儲存貯體？](https://docs.aws.amazon.com/AmazonS3/latest/userguide/delete-bucket.html)。

1. [將封存上傳至 Amazon S3 儲存貯體](https://docs.aws.amazon.com/AmazonS3/latest/UG/UploadingObjectsintoAmazonS3.html)，[將封存設為公](https://docs.aws.amazon.com/AmazonS3/latest/UG/EditingPermissionsonanObject.html)有，並記錄封存的 URL。

您現在可以安裝技術指南，並執行配方。

**執行配方**

1. [編輯堆疊以啟用自訂技術指南](workingcookbook-installingcustom-enable.md)，然後指定下列設定。
   + **儲存庫類型** – **S3 封存**
   + **儲存庫 URL** – 您先前記錄的技術指南封存 URL

   針對其他設定使用預設值，然後按一下 **Save (儲存)** 以更新堆疊組態。

1. [執行更新自訂技術指南堆疊命令](workingstacks-commands.md)，以在堆疊執行個體上安裝最新版的自訂技術指南。如果存在舊版的技術指南，則此命令會予以覆寫。

1. 使用配方執行**執行執行配方**堆疊命令**以執行設定為 的配方****opstest::default**。此命令會啟動 Chef 執行，內含包含 `opstest::default` 的回合清單。

成功執行配方之後，您就可以驗證配方。

**驗證 opstest**

1. 第一步是檢查 [Chef 日誌](troubleshoot-debug-log.md)。按一下 **** opstest1 執行個體**日誌**欄中的顯示以顯示日誌。向下捲動，您會在接近底端看到您的日誌訊息。

   ```
   ...
   [2014-07-31T17:01:45+00:00] INFO: Storing updated cookbooks/opsworks_cleanup/attributes/customize.rb in the cache.
   [2014-07-31T17:01:45+00:00] INFO: Storing updated cookbooks/opsworks_cleanup/metadata.rb in the cache.
   [2014-07-31T17:01:46+00:00] INFO: ******Creating a data directory.******
   [2014-07-31T17:01:46+00:00] INFO: Processing template[/etc/hosts] action create (opsworks_stack_state_sync::hosts line 3)
   ...
   ```

1. [使用 SSH 登入執行個體](workinginstances-ssh.md)，並列出 `/srv/www/` 的內容。

如果您已遵循所有步驟，則會看到 `/srv/www/config`，而不是您預期的 `/srv/www/shared` 目錄。下節提供一些快速修復這類錯誤的指導方針。

## 自動執行配方
<a name="cookbooks-101-opsworks-opsworks-instance-events"></a>

**Execute Recipes (執行配方)** 命令是一種輕鬆測試自訂配方的方法，這是在其中大部分範例中使用它的原因。不過，實際上，您通常會在執行個體生命週期中的標準點執行配方，例如在執行個體完成開機後或部署應用程式時。 OpsWorks Stacks 透過支援每一層的一組[生命週期事件](workingcookbook-events.md)，簡化執行個體上執行的配方：設定、設定、部署、取消部署和關機。您可以將配方指派給適當的生命週期事件，讓 OpsWorks Stacks 在 layer 的執行個體上自動執行配方。

您通常會在執行個體完成開機時立即建立目錄，這對應至安裝事件。以下顯示如何使用您稍早在範例中建立的相同堆疊，在安裝時執行範例配方。您可以針對其他事件使用相同的程序。

**在安裝時自動執行配方**

1. 選擇導覽窗格中的 **Layers (Layer)**，然後選擇 OpsTest layer 之 **Recipes (配方)** 連結旁的鉛筆圖示。

1. 將 **opstest::default** 新增至 layer 的 **Setup (安裝)** 配方，並按一下 **\$1** 將它新增至 layer，然後選擇 **Save (儲存)** 儲存組態。

1. 選擇 **Instances (執行個體)**，並將另一個執行個體新增至 layer，然後啟動它。

   執行個體應該命名為 `opstest2`。開機完成後， OpsWorks Stacks 會執行 `opstest::default`。

1. 在 `opstest2` 執行個體上線之後，請驗證 `/srv/www/shared` 已存在。

**注意**  
如果您已將配方指派給安裝、設定或部署事件，則也會手動執行它們，方法是使用[堆疊命令](workingstacks-commands.md) (安裝和設定) 或[部署命令](workingapps-deploying.md) (部署) 來觸發事件。請注意，如果您有多個指派給事件的配方，則這些命令會執行所有配方。

## 故障診斷和修復手冊
<a name="cookbooks-101-opsworks-opsworks-instance-bugs"></a>

如果您未取得預期的結果，或您的配方甚至未成功執行，則故障診斷通常會從檢查 Chef 日誌開始。它包含執行的詳細描述，而且包括您配方中的任何內嵌日誌訊息。如果您的配方失敗，則日誌特別有用。發生該情況時，Chef 會記錄錯誤 (包括堆疊追蹤)。

如果配方成功 (如此範例所示)，則 Chef 日誌通常不怎麼有幫助。在這種情況下，只要仔細查看配方 (特別是前幾行)，就可以找出問題所在：

```
Chef::Log.info("******Creating a data directory.******")

data_dir = value_for_platform(
  "centos" => { "default" => "/srv/www/shared" },
  "ubuntu" => { "default" => "/srv/www/data" },
  "default" => "/srv/www/config"
)
...
```

當您在 Vagrant 上測試配方時，CentOS 是 Amazon Linux 的適用備用方法，但現在您將在實際 Amazon Linux 執行個體上執行。Amazon Linux 的平台值是 `amazon`，但未包含在 `value_for_platform` 呼叫中，因此配方會建立 `/srv/www/config`。如需故障診斷的詳細資訊，請參閱[偵錯和故障診斷指南](troubleshoot.md)。

現在您已找到問題，您需要更新配方並驗證修復。您可以返回原始來源檔案、更新 `default.rb`、上傳新的封存至 Amazon S3，以此類推。不過，該程序可能有點繁瑣且耗時。下列更快速的方式特別適用於簡單配方錯誤 (例如範例中的配方錯誤)：編輯執行個體上的配方。

**編輯執行個體上的配方**

1. 使用 SSH 登入執行個體，然後執行 `sudo su` 以提升您的權限。您需要有 root 權限才能存取技術指南目錄。

1. OpsWorks Stacks 會將您的技術指南存放在 中`/opt/aws/opsworks/current/site-cookbooks`，因此請導覽至 `/opt/aws/opsworks/current/site-cookbooks/opstest/recipes`。
**注意**  
OpsWorks Stacks 也會將技術指南的副本存放在 中`/opt/aws/opsworks/current/merged-cookbooks`。請不要編輯該技術指南。當您執行配方時， OpsWorks Stacks 會將技術指南從 複製到 `.../site-cookbooks` `.../merged-cookbooks`，因此您在 中所做的任何變更`.../merged-cookbooks`都會遭到覆寫。

1. 在執行個體上使用文字編輯器來編輯 `default.rb`，並將 `centos` 取代為 `amazon`。您的配方現在看起來應該與下列類似。

   ```
   Chef::Log.info("******Creating a data directory.******")
   
   data_dir = value_for_platform(
     "amazon" => { "default" => "/srv/www/shared" },
     "ubuntu" => { "default" => "/srv/www/data" },
     "default" => "/srv/www/config"
   )
   ...
   ```

若要驗證修復，請重新執行 **Execute Recipe (執行配方)** 堆疊命令來執行配方。執行個體現在應該會有一個 `/srv/www/shared` 目錄。如果您需要進一步變更配方，則可以經常執行 **Execute Recipe (執行配方)**；每次執行命令時，並不需要停止並重新啟動執行個體。對配方正確運作感到滿意後，請不要忘記更新您來源技術指南中的程式碼。

**注意**  
如果您已將配方指派給生命週期事件，讓 OpsWorks Stacks 自動執行它，您一律可以使用**執行配方**來重新執行配方。您也可以使用 Stacks OpsWorks 主控台手動觸發適當的事件，以任意次數重新執行配方，而無需重新啟動執行個體。不過，此方式會執行事件的所有配方。提醒如下：  
使用[堆疊命令](workingstacks-commands.md)來觸發安裝或設定事件。
使用[部署命令](workingapps-deploying.md)來觸發部署或解除部署事件。