

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

# Stacks OpsWorks 中的技術指南入門
<a name="gettingstarted-cookbooks"></a>

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

生產層級 OpsWorks 的 Stacks 堆疊通常需要一些自訂，這通常表示實作自訂的 Chef 技術指南。「技術指南」**為包含組態資訊 (其中包含稱為「配方」**的指示) 的套件檔案。「配方」**為一組一或多個以 Ruby 語言語法撰寫的指示，指定要使用的資源以及套用那些資源的順序。Chef 中所使用的「資源」**為組態政策的陳述式。本演練提供實作 Stacks Chef OpsWorks 技術指南的基本簡介。若要進一步了解 Chef、技術指南、配方及資源，請參閱[後續步驟](gettingstarted-cookbooks-next-steps.md)中的連結。

本演練主要說明如何建立您自己的技術指南。您也可以使用社群提供的技術指南，這可在 [Chef Supermarket](https://supermarket.chef.io) 這類網站上取得。為協助您開始使用社群技術指南，後續的演練將包含使用來自 Chef Supermarket 的社群技術指南說明。

在您開始本演練前，請完成幾個設定步驟。若您已完成本章中的其他演練 (例如[入門：範例](gettingstarted-intro.md))，您即完成本演練的事前準備，可直接跳到[開始本演練](gettingstarted-cookbooks-create-cookbook.md)。否則，請務必完成[事前準備](gettingstarted-intro-prerequisites.md)，然後再返回本演練。

**Topics**
+ [

# 步驟 1：建立技術指南
](gettingstarted-cookbooks-create-cookbook.md)
+ [

# 步驟 2：建立堆疊及其元件
](gettingstarted-cookbooks-create-stack.md)
+ [

# 步驟 3：執行及測試配方
](gettingstarted-cookbooks-test-recipe.md)
+ [

# 步驟 4：更新技術指南以安裝套件
](gettingstarted-cookbooks-install-package.md)
+ [

# 步驟 5：更新執行個體上的技術指南及執行配方
](gettingstarted-cookbooks-copy-cookbook.md)
+ [

# 步驟 6：更新技術指南以新增使用者
](gettingstarted-cookbooks-add-user.md)
+ [

# 步驟 7：更新技術指南以建立目錄
](gettingstarted-cookbooks-create-directory.md)
+ [

# 步驟 8：更新技術指南以建立及複製檔案
](gettingstarted-cookbooks-create-file.md)
+ [

# 步驟 9：更新技術指南以執行命令
](gettingstarted-cookbooks-run-command.md)
+ [

# 步驟 10：更新技術指南以執行指令碼
](gettingstarted-cookbooks-run-script.md)
+ [

# 步驟 11：更新技術指南以管理服務
](gettingstarted-cookbooks-manage-service.md)
+ [

# 步驟 12：更新技術指南以使用自訂 JSON
](gettingstarted-cookbooks-custom-json.md)
+ [

# 步驟 13：更新技術指南以使用資料包
](gettingstarted-cookbooks-data-bags.md)
+ [

# 步驟 14：更新技術指南以使用反覆運算
](gettingstarted-cookbooks-iteration.md)
+ [

# 步驟 15：更新技術指南以使用條件式邏輯
](gettingstarted-cookbooks-conditional-logic.md)
+ [

# 步驟 16：更新技術指南以使用社群技術指南
](gettingstarted-cookbooks-community-cookbooks.md)
+ [

# 步驟 17：(選用) 清除
](gettingstarted-cookbooks-clean-up.md)
+ [

# 後續步驟
](gettingstarted-cookbooks-next-steps.md)

# 步驟 1：建立技術指南
<a name="gettingstarted-cookbooks-create-cookbook"></a>

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

從建立技術指南開始。此技術指南對開始作用不大，但它會作為本演練其餘部分的基礎。

**注意**  
此步驟示範如何手動建立技術指南。您可以透過使用 Chef 開發套件 ([Chef DK](https://docs.chef.io/#chef-dk-title)) 在您的本機工作站上執行 [https://docs.chef.io/ctl_chef.html#chef-generate-cookbook](https://docs.chef.io/ctl_chef.html#chef-generate-cookbook) 命令，來更快速的建立技術指南。但是，此命令會建立數個您在本演練中不需要的資料夾及檔案。

**建立技術指南**

1. 在您的本機工作站上，建立名為 `opsworks_cookbook_demo` 的目錄。您可以使用不同的名稱，但請務必在本演練的後續部分一律將 `opsworks_cookbook_demo` 取代為您選擇的名稱。

1. 在 `opsworks_cookbook_demo` 目錄中，使用文字編輯器建立一個名為 `metadata.rb` 的檔案。新增以下程式碼來指定技術指南的名稱。如需 `metadata.rb` 的詳細資訊，請參閱 Chef 網站上的 [metadata.rb](https://docs.chef.io/config_rb_metadata.html)。

   ```
   name "opsworks_cookbook_demo"
   ```

1. 在 `opsworks_cookbook_demo` 目錄中，建立名為 `recipes` 的子目錄。此子目錄包含所有您為本演練的技術指南建立的配方。

1. 在 `recipes` 目錄中，建立名為 `default.rb` 的檔案。此檔案包含具有與檔案名稱相同的配方，但不帶有副檔名：`default`。將下列單行程式碼新增至 `default.rb` 檔案。此程式碼為一個單行配方，會在配方執行時於日誌中顯示簡易訊息：

   ```
   Chef::Log.info("********** Hello, World! **********")
   ```

1. 在終端機或命令提示中，使用 **tar** 命令建立名為 `opsworks_cookbook_demo.tar.gz` 的檔案，其中包含 `opsworks_cookbook_demo` 目錄及其內容。例如：

   ```
   tar -czvf opsworks_cookbook_demo.tar.gz opsworks_cookbook_demo/
   ```

   您可以使用不同的檔案名稱，但請務必在本演練的後續部分一律將 `opsworks_cookbook_demo.tar.gz` 取代為您選擇的名稱。
**注意**  
當您在 Windows 上建立 `tar` 檔案時，最上層目錄必須為技術指南的父系目錄。此演練已在 Linux 上使用 `tar`套件提供的**tar**命令進行測試，並在 Windows 上使用 [Git Bash](https://git-for-windows.github.io/) 提供的**tar**命令進行測試。使用其他命令或程式建立壓縮 TAR (.tar.gz) 檔案可能無法正常運作。

1. 建立 S3 儲存貯體，或使用現有的儲存貯體。如需詳細資訊，請參閱[建立儲存貯體](https://docs.aws.amazon.com/AmazonS3/latest/userguide/CreatingABucket.html)。

1. 將 `opsworks_cookbook_demo.tar.gz` 檔案上傳至 S3 儲存貯體。如需詳細資訊，請參閱[將物件新增至儲存貯體](https://docs.aws.amazon.com/AmazonS3/latest/userguide/PuttingAnObjectInABucket.html)。

您現在已有您可以在本演練中使用的技術指南。

在[下一個步驟](gettingstarted-cookbooks-create-stack.md)中，您會建立 Stacks OpsWorks 堆疊，以供稍後用來上傳技術指南和執行技術指南的配方。

# 步驟 2：建立堆疊及其元件
<a name="gettingstarted-cookbooks-create-stack"></a>

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

建立 OpsWorks Stacks 堆疊及其元件，其中包含 layer 和執行個體。在後續步驟中，您會將您的技術指南上傳至執行個體，並在該執行個體上執行技術指南的配方。

**建立堆疊**

1. 登入 Stacks OpsWorks 主控台，網址為 https：//[https://console.aws.amazon.com/opsworks](https://console.aws.amazon.com/opsworks)。

1. 執行下列其中一個作業 (若適用的話)：
   + 如果顯示**歡迎使用 OpsWorks Stacks** 頁面，請選擇**新增您的第一個堆疊**或**新增您的第一個 Stacks OpsWorks 堆疊** （這兩個選項都執行相同的動作）。即會顯示 **Add stack (新增堆疊)** 頁面。
   + 若顯示 **OpsWorks Dashboard (OpsWorks 儀表板)** 頁面，請選擇 **Add stack (新增堆疊)**。即會顯示 **Add Stack (新增堆疊)** 頁面。

1. 選擇 **Chef 12 stack (Chef 12 堆疊)**。

1. 在 **Stack name (堆疊名稱)** 方塊中，輸入堆疊的名稱 (例如 **MyCookbooksDemoStack**)。您可以輸入不同的名稱，但請務必在本演練的後續部分一律將 `MyCookbooksDemoStack` 取代為您選擇的名稱。

1. 針對**區域**，選擇**美國西部 （奧勒岡）**。

1. 針對 **VPC**，執行下列其中一項作業：
   + 若 VPC 可用，請選擇它。如需詳細資訊，請參閱[在 VPC 中執行堆疊](workingstacks-vpc.md)。
   + 否則，請選擇 **No VPC (無 VPC)**。

1. 針對 **Use custom Chef cookbooks (使用自訂 Chef 技術指南)**，選擇 **Yes (是)**。

1. 針對 **Repository type (儲存庫類型)**，選擇 **S3 Archive (S3 封存)**。
**注意**  
在[入門：Linux](gettingstarted-linux.md) 演練中，您選擇了 **Http Archive (Http 封存)**。請務必在此改為選擇 **S3 Archive (S3 封存)**。

1. 針對 **Repository URL (儲存庫 URL)**，輸入指向您 S3 中 `opsworks_cookbook_demo.tar.gz` 檔案的路徑。若要取得路徑，請在 S3 主控台中，選取 `opsworks_cookbook_demo.tar.gz` 檔案。在 **Properties (屬性)** 窗格中，複製 **Link (連結)** 欄位的值。(其內容大致如下：`https://s3.amazonaws.com/amzn-s3-demo-bucket/opsworks_cookbook_demo.tar.gz`。)

1. 如果您的 S3 儲存貯體是私有的，這是預設的，則對於**存取金鑰 ID** 和**私密存取金鑰**，輸入您在此演練中使用的 IAM 使用者的存取金鑰 ID 和私密存取金鑰。如需詳細資訊，請參閱[編輯物件許可](https://docs.aws.amazon.com/AmazonS3/latest/userguide/EditingPermissionsonanObject.html)及[與其他人分享物件](https://docs.aws.amazon.com/AmazonS3/latest/userguide/ShareObjectPreSignedURL.html)。

1. 保留下列項目的預設值：
   + **Default Availability Zone (預設可用區域)** (**us-west-2a**)
   + **預設作業系統** (**Linux** 和 **Amazon Linux 2016.09**)
   + **Default SSH key (預設 SSH 金鑰)** (**Do not use a default SSH key (不使用預設 SSH 金鑰)**)
   + **Stack color (堆疊色彩)** (深藍色)

1. 選擇 **Advanced (進階)**。

1. 針對 **IAM role (IAM 角色)**，執行以下其中一項作業：
   + 若 **aws-opsworks-service-role** 可用，請選擇它。
   + 若 **aws-opsworks-service-role** 不可用，請選擇 **New IAM role (新 IAM 角色)**。

1. 針對**預設 IAM 執行個體描述檔**，執行下列其中一項：
   + 若 **aws-opsworks-ec2-role** 可用，請選擇它。
   + 如果無法使用 **aws-opsworks-ec2-role**，請選擇**新的 IAM 執行個體描述**檔。

1. 保留下列項目的預設值：
   + **Default root device type (預設根設備類型)** (**EBS backed (EBS 後端)**)
   + **Hostname theme (主機名稱主題)** (**Layer Dependent (依存於 Layer)**)
   + **OpsWorks Agent version (OpsWorks 代理程式版本)** (最新版本)
   + **Custom Chef JSON (自訂 Chef JSON)** (空白)
   + **Security (安全)**、**Use OpsWorks security groups (使用 OpsWorks 安全群組)** (**Yes (是)**)

1. 選擇**新增堆疊**。 OpsWorks 堆疊會建立堆疊，並顯示 **MyCookbooksDemoStack** 頁面。

**建立 layer**

1. 在服務導覽窗格中，選擇 **Layers (Layer)**。即會顯示 **Layers (Layer)** 頁面。

1. 選擇 **Add a layer (新增 layer)**。

1. 在 **OpsWorks** 標籤上，針對 **Name (名稱)**，輸入 **MyCookbooksDemoLayer**。您可以輸入不同的名稱，但請務必在本演練的後續部分一律將 `MyCookbooksDemoLayer` 取代為您選擇的名稱。

1. 針對 **Short name (簡短名稱)**，輸入 **cookbooks-demo**。您可以輸入不同的名稱，但請務必在本演練的後續部分一律將 `cookbooks-demo` 取代為您選擇的名稱。

1. 選擇**新增 layer**. OpsWorks Stacks 新增 layer 並顯示 **Layers** 頁面。

**建立及啟動執行個體**

1. 在服務導覽窗格中，選擇 **Instances (執行個體)**。即會顯示 **Instances (執行個體)** 頁面。

1. 選擇 **新增執行個體**。

1. 在 **New (新增)** 標籤上，選擇 **Advanced (進階)**。

1. 保留下列項目的預設值：
   + **Hostname (主機名稱)** (**cookbooks-demo1**)
   + **Size (大小)** (**c3.large**)
   + **Subnet (子網路)** (*IP 地址* **us-west-2a**)
   + **Scaling type (擴展類型)** (**24/7 (全年無休)**)
   + **SSH key (SSH 金鑰)** (**Do not use a default SSH key (不使用預設 SSH 金鑰)**)
   + **作業系統** (**Amazon Linux 2016.09**)
   + **OpsWorks Agent version (OpsWorks 代理程式版本)** (**Inherit from stack (繼承自堆疊)**)
   + **Tenancy (租用)** (**Default - Rely on VPC settings (預設 – 依存 VPC 設定)**)
   + **Root device type (根設備類型)** (**EBS backed (EBS 後端)**)
   + **Volume type (磁碟區類型)** (**General Purpose (SSD) (一般用途 (SSD))**)
   + **Volume size (磁碟區大小)** (**8**)

1. 選擇 **Add instance (新增執行個體)**。

1. 針對 **MyCookbooksDemoLayer** 之 **cookbooks-demo1** 的 **Actions (動作)**，選擇 **start (啟動)**。在 **Status (狀態)** 變更為 **online (線上)** 前請不要繼續。此程序可能需要花費數分鐘，敬請耐心等待。

您現在已擁有一個堆疊、一個 layer，及一個執行個體，技術指南已自動從您的 S3 儲存貯體複製到其中。在[下一個步驟](gettingstarted-cookbooks-test-recipe.md)中，您會執行及測試執行個體上技術指南中的預設配方。

# 步驟 3：執行及測試配方
<a name="gettingstarted-cookbooks-test-recipe"></a>

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

從 Stacks OpsWorks 複製到執行個體的技術指南中執行並測試`default`配方。您可能還記得，此為在配方執行時於日誌中顯示簡易訊息的單行配方。

**執行配方**

1. 在服務導覽窗格中，選擇 **Stack (堆疊)**。即會顯示 **MyCookbooksDemoStack** 頁面。

1. 選擇 **Run Command (執行命令)**。即會顯示 **Run Command (執行命令)** 頁面。

1. 針對 **Command (命令)**，選擇 **Execute Recipes (執行配方)**。

1. 針對 **Recipes to execute (要執行的配方)**，輸入 **opsworks\$1cookbook\$1demo::default**。

   **opsworks\$1cookbook\$1demo** 為在 `metadata.rb` 檔案中定義的技術指南名稱。**default** 為要執行的配方名稱，即技術指南的 `recipes` 子目錄中 `default.rb` 檔案的名稱，不帶副檔名。

1. 保留下列預設值：
   + **Comment (註解)** (空白)
   + **Advanced (進階)**、**Custom Chef JSON (自訂 Chef JSON)** (空白)
   + **Instances (執行個體)** (已核取 **Select all (全選)**，已核取 **MyCookbooksDemoLayer**，已核取 **cookbooks-demo1**)

1. 選擇 **Execute Recipes (執行配方)**。即會顯示 **Running command execute\$1recipes (執行 execute\$1recipes 命令)** 頁面。在 **Status (狀態)** 變更為 **successful (成功)** 前請不要繼續。此程序可能需要花費幾分鐘，敬請耐心等待。

**檢查配方的結果**

1. 在 **Running command execute\$1recipes (執行 execute\$1recipes 命令)** 頁面顯示時，針對 **cookbooks-demo1** 的 **Log (日誌)**，選擇 **show (顯示)**。即會顯示 **execute\$1recipes** 日誌頁面。

1. 向下捲動日誌，尋找與下列內容相似的項目：

   ```
   [2015-11-13T19:14:39+00:00] INFO: ********** Hello, World! **********
   ```

您已成功執行您的第一個配方！在[下一個步驟](gettingstarted-cookbooks-install-package.md)中，您會透過新增在執行個體上安裝套件的配方，來更新您的技術指南。

# 步驟 4：更新技術指南以安裝套件
<a name="gettingstarted-cookbooks-install-package"></a>

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

透過新增在執行個體上安裝包含熱門文字編輯器 GNU Emacs 套件的配方，來更新您的技術指南。

雖然您可以輕鬆登入執行個體並安裝套件一次，但撰寫配方可讓您從 OpsWorks Stacks 執行配方一次，同時在堆疊中的多個執行個體上安裝多個套件。

**更新技術指南以安裝套件**

1. 回到您的本機工作站，在 `opsworks_cookbook_demo` 目錄中的 `recipes` 子目錄中，建立名為 `install_package.rb` 的檔案，其中包含下列程式碼：

   ```
   package "Install Emacs" do
     package_name "emacs"
   end
   ```

   此配方會在執行個體上安裝 `emacs` 套件。(如需詳細資訊，請前往 [package](https://docs.chef.io/resource_package.html)。)
**注意**  
您可以給予配方任何您希望的檔案名稱。每當您想要 Stacks OpsWorks 執行配方時，請務必指定正確的配方名稱。

1. 在終端機或命令提示中，使用 **tar** 命令建立 `opsworks_cookbook_demo.tar.gz` 檔案的新版本，其中包含 `opsworks_cookbook_demo` 目錄及其更新後的內容。

1. 將更新後的 `opsworks_cookbook_demo.tar.gz` 檔案上傳至 S3 儲存貯體。

這個新配方會在您每次更新執行個體上的技術指南，並且從更新後的技術指南中執行新的配方時執行。下一個步驟說明如何執行此作業。

在您完成[下一個步驟](gettingstarted-cookbooks-copy-cookbook.md)之後，您將能登入執行個體，並從命令提示輸入 **emacs** 以啟動 GNU Emacs。(如需詳細資訊，請參閱[連線至您的 Linux 執行個體](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/AccessingInstances.html)。) 若要離開 GNU Emacs，請按下 **Ctrl\$1X**、**Ctrl\$1C**。

**重要**  
若要登入執行個體，您必須先向 OpsWorks Stacks 提供公有 SSH 金鑰的相關資訊 （您可以使用 ssh-keygen 或 PuTTYgen 等工具建立），然後您必須在`MyCookbooksDemoStack`堆疊上設定許可，讓使用者能夠登入執行個體。如需說明，請參閱 [註冊使用者的公有 SSH 金鑰](security-settingsshkey.md) 與 [使用 SSH 登入](workinginstances-ssh.md)。

# 步驟 5：更新執行個體上的技術指南及執行配方
<a name="gettingstarted-cookbooks-copy-cookbook"></a>

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

更新執行個體上的技術指南，以及從執行個體上已更新的技術指南執行配方。在本演練的後續部分中，每次您新增配方藉以更新技術指南時，都會重複此一步驟。

**更新執行個體上的技術指南**

1. 在服務導覽窗格中，選擇 **Stack (堆疊)**。即會顯示 **MyCookbooksDemoStack** 頁面。

1. 選擇 **Run Command (執行命令)**。即會顯示 **Run Command (執行命令)** 頁面。

1. 針對 **Command (命令)**，選擇 **Update Custom Cookbooks (更新自訂技術指南)**。

1. 保留下列預設值：
   + **Comment (註解)** (空白)
   + **Advanced (進階)**、**Custom Chef JSON (自訂 Chef JSON)** (空白)
   + **Advanced (進階)**、**Instances (執行個體)** (已核取 **Select all (全選)**，已核取 **MyCookbooksDemoLayer**，已核取 **cookbooks-demo1**)。

1. 選擇 **Update Custom Cookbooks (更新自訂技術指南)**。即會顯示 **Running command update\$1custom\$1cookbooks (執行 update\$1custom\$1cookbooks 命令)** 頁面。在 **Status (狀態)** 變更為 **successful (成功)** 前請不要繼續。此程序可能需要花費數分鐘，敬請耐心等待。

**執行配方**

1. 在服務導覽窗格中，選擇 **Stack (堆疊)**。即會顯示 **MyCookbooksDemoStack** 頁面。

1. 選擇 **Run Command (執行命令)**。即會顯示 **Run Command (執行命令)** 頁面。

1. 針對 **Command (命令)**，選擇 **Execute Recipes (執行配方)**。

1. 針對 **Recipes to execute (要執行的配方)**，輸入要執行的配方名稱。您第一次執行此作業時，配方會命名為 **opsworks\$1cookbook\$1demo::install\$1package**。
**注意**  
當您在稍後重複此程序時，請輸入技術指南的名稱 (**opsworks\$1cookbook\$1demo**)，其後跟隨兩個冒號 (**::**)，其後再跟隨配方的名稱 (不帶有 `.rb` 副檔名的配方檔案名稱)。

1. 保留下列預設值：
   + **Comment (註解)** (空白)
   + **Advanced (進階)**、**Custom Chef JSON (自訂 Chef JSON)** (空白)
   + **Instances (執行個體)**、已核取 **Select all (全選)**，已核取 **MyCookbooksDemoLayer**，已核取 **cookbooks-demo1**

1. 選擇 **Execute Recipes (執行配方)**。即會顯示 **Running command execute\$1recipes (執行 execute\$1recipes 命令)** 頁面。在 **Status (狀態)** 變更為 **successful (成功)** 前請不要繼續。此程序可能需要花費幾分鐘，敬請耐心等待。

**注意**  
您不需要手動執行配方。您可以將配方指派給 layer 的生命週期事件，例如設定和設定事件，而 OpsWorks Stacks 會在事件發生時自動執行這些配方。如需詳細資訊，請參閱[OpsWorks Stacks 生命週期事件](workingcookbook-events.md)。

在[下一個步驟](gettingstarted-cookbooks-add-user.md)中，您會更新技術指南，將使用者新增至執行個體。

# 步驟 6：更新技術指南以新增使用者
<a name="gettingstarted-cookbooks-add-user"></a>

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

透過新增將本機使用者新增至執行個體，並設定使用者的主目錄與殼層的配方，來更新您的技術指南。這與執行 Linux **adduser** 或 **useradd** 命令，或 Windows **net user** 命令相似。您可以將本機使用者新增至執行個體，例如：當您希望控制執行個體檔案與目錄的存取時。

您也可以在不使用技術指南的情況下管理使用者。如需詳細資訊，請參閱[管理使用者](opsworks-security-users-manage.md)。

**更新執行個體上的技術指南及執行新的配方**

1. 在您的本機工作站上，於 `opsworks_cookbook_demo` 目錄中的 `recipes` 子目錄內，建立名為 `add_user.rb` 的檔案，其中包含下列程式碼 (如需詳細資訊，請前往 [user](https://docs.chef.io/resource_user.html))：

   ```
   user "Add a user" do
     home "/home/jdoe"
     shell "/bin/bash"
     username "jdoe"  
   end
   ```

1. 在終端機或命令提示中，使用 **tar** 命令建立 `opsworks_cookbook_demo.tar.gz` 檔案的新版本，其中包含 `opsworks_cookbook_demo` 目錄及其更新後的內容。

1. 將更新後的 `opsworks_cookbook_demo.tar.gz` 檔案上傳至 S3 儲存貯體。

1. 遵循[步驟 5：更新執行個體上的技術指南及執行配方](gettingstarted-cookbooks-copy-cookbook.md)中的程序，更新執行個體上的技術指南及執行配方。在「執行配方」程序中，針對 **Recipes to execute (要執行的配方)**，輸入 **opsworks\$1cookbook\$1demo::add\$1user**。

**測試配方**

1. 登入執行個體 (若您尚未登入的話)。

1. 從命令提示中，執行下列命令以確認新的使用者已新增：

   ```
   grep jdoe /etc/passwd
   ```

   即會顯示與下列內容相似的使用者相關資訊，包含像是使用者名稱、ID 號碼、群組 ID 號碼、主目錄、殼層等詳細資訊：

   ```
   jdoe:x:501:502::/home/jdoe:/bin/bash
   ```

在[下一個步驟](gettingstarted-cookbooks-create-directory.md)中，您會更新技術指南，在執行個體上建立目錄。

# 步驟 7：更新技術指南以建立目錄
<a name="gettingstarted-cookbooks-create-directory"></a>

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

透過新增會將目錄新增至執行個體的配方，來更新您的技術指南。這與執行 Linux **mkdir** 命令，或 Windows **md** 或 **mkdir** 命令相似。

**更新執行個體上的技術指南及執行新的配方**

1. 在您的本機工作站上，在 `opsworks_cookbook_demo` 目錄中的 `recipes` 子目錄中，建立名為 `create_directory.rb` 的檔案，其中包含下列程式碼。如需詳細資訊，請前往 [directory](https://docs.chef.io/resource_directory.html)：

   ```
   directory "Create a directory" do
     group "root"
     mode "0755"
     owner "ec2-user"
     path "/tmp/create-directory-demo"  
   end
   ```

1. 在終端機或命令提示中，使用 **tar** 命令建立 `opsworks_cookbook_demo.tar.gz` 檔案的新版本，其中包含 `opsworks_cookbook_demo` 目錄及其更新後的內容。

1. 將更新後的 `opsworks_cookbook_demo.tar.gz` 檔案上傳至 S3 儲存貯體。

1. 遵循[步驟 5：更新執行個體上的技術指南及執行配方](gettingstarted-cookbooks-copy-cookbook.md)中的程序，更新執行個體上的技術指南及執行配方。在「執行配方」程序中，針對 **Recipes to execute (要執行的配方)**，輸入 **opsworks\$1cookbook\$1demo::create\$1directory**。

**測試配方**

1. 登入執行個體 (若您尚未登入的話)。

1. 從命令提示中，執行下列命令以確認新的目錄已新增：

   ```
   ls -la /tmp/create-directory-demo
   ```

   即會顯示新建立目錄的相關資訊，包含像是許可、擁有者名稱和群組名稱等資訊：

   ```
   drwxr-xr-x 2 ec2-user root 4096 Nov 18 00:35 .
   drwxrwxrwt 6 root     root 4096 Nov 24 18:17 ..
   ```

在[下一個步驟](gettingstarted-cookbooks-create-file.md)中，您會更新技術指南，在執行個體上建立檔案。

# 步驟 8：更新技術指南以建立及複製檔案
<a name="gettingstarted-cookbooks-create-file"></a>

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

透過新增會將兩個檔案新增至執行個體的配方，來更新您的技術指南。配方中的第一個資源會完全使用配方程式碼來建立檔案。這與執行 Linux **cat**、**echo** 或 **touch** 命令，或 Windows **echo** 或 **fsutil** 命令相似。此技術對少量、小型或簡單的檔案相當有用。配方中的第二個資源會將技術指南中的檔案複製到執行個體上的另一個目錄。這與執行 Linux **cp** 命令或 Windows **copy** 命令相似。此技術對於大量、大型或複雜的檔案相當有用。

在您開始此步驟前，請先完成[步驟 7：更新技術指南以建立目錄](gettingstarted-cookbooks-create-directory.md)以確保檔案的父系目錄已存在。

**更新執行個體上的技術指南及執行新的配方**

1. 在您的本機工作站上，於 `opsworks_cookbook_demo` 目錄中，建立名為 `files` 的子目錄。

1. 在 `files` 子目錄中，建立名為 `hello.txt` 的檔案，其中包含下列文字：**Hello, World\$1**

1. 在 `opsworks_cookbook_demo` 目錄的 `recipes` 子目錄中，建立名為 `create_files.rb` 的檔案，其中包含下列程式碼。如需詳細資訊，請前往 [file](https://docs.chef.io/resource_file.html) 和 [cookbook\$1file](https://docs.chef.io/resource_cookbook_file.html)。

   ```
   file "Create a file" do
     content "<html>This is a placeholder for the home page.</html>"
     group "root"
     mode "0755"
     owner "ec2-user"
     path "/tmp/create-directory-demo/index.html"
   end
   
   cookbook_file "Copy a file" do  
     group "root"
     mode "0755"
     owner "ec2-user"
     path "/tmp/create-directory-demo/hello.txt"
     source "hello.txt"  
   end
   ```

   `file` 資源會在指定的路徑中建立檔案。`cookbook_file` 資源會從您在技術指南中建立的 `files` 目錄 (Chef 預期會找到名為 `files` 的標準命名目錄，並從中複製檔案)，將檔案複製到執行個體上的另一個目錄。

1. 在終端機或命令提示中，使用 **tar** 命令建立 `opsworks_cookbook_demo.tar.gz` 檔案的新版本，其中包含 `opsworks_cookbook_demo` 目錄及其更新後的內容。

1. 將更新後的 `opsworks_cookbook_demo.tar.gz` 檔案上傳至 S3 儲存貯體。

1. 遵循[步驟 5：更新執行個體上的技術指南及執行配方](gettingstarted-cookbooks-copy-cookbook.md)中的程序，更新執行個體上的技術指南及執行配方。在「執行配方」程序中，針對 **Recipes to execute (要執行的配方)**，輸入 **opsworks\$1cookbook\$1demo::create\$1files**。

**測試配方**

1. 登入執行個體 (若您尚未登入的話)。

1. 從命令提示中，逐項執行下列命令以確認新的檔案已新增：

   ```
   sudo cat /tmp/create-directory-demo/index.html
   
   sudo cat /tmp/create-directory-demo/hello.txt
   ```

   即會顯示檔案的內容：

   ```
   <html>This is a placeholder for the home page.</html>
   
   Hello, World!
   ```

在[下一個步驟](gettingstarted-cookbooks-run-command.md)中，您會更新技術指南，在執行個體上執行命令。

# 步驟 9：更新技術指南以執行命令
<a name="gettingstarted-cookbooks-run-command"></a>

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

透過新增會執行在執行個體上建立 SSH 金鑰之命令的配方，來更新您的技術指南。

**更新執行個體上的技術指南及執行新的配方**

1. 在您的本機工作站上，在 `opsworks_cookbook_demo` 目錄中的 `recipes` 子目錄中，建立名為 `run_command.rb` 的檔案，其中包含下列程式碼。如需詳細資訊，請前往 [execute](https://docs.chef.io/resource_execute.html)。

   ```
   execute "Create an SSH key" do
     command "ssh-keygen -f /tmp/my-key -N fLyC3jbY"
   end
   ```

1. 在終端機或命令提示中，使用 **tar** 命令建立 `opsworks_cookbook_demo.tar.gz` 檔案的新版本，其中包含 `opsworks_cookbook_demo` 目錄及其更新後的內容。

1. 將更新後的 `opsworks_cookbook_demo.tar.gz` 檔案上傳至 S3 儲存貯體。

1. 遵循[步驟 5：更新執行個體上的技術指南及執行配方](gettingstarted-cookbooks-copy-cookbook.md)中的程序，更新執行個體上的技術指南及執行配方。在「執行配方」程序中，針對 **Recipes to execute (要執行的配方)**，輸入 **opsworks\$1cookbook\$1demo::run\$1command**。

**測試配方**

1. 登入執行個體 (若您尚未登入的話)。

1. 從命令提示中，逐項執行下列命令以確認 SSH 金鑰已建立：

   ```
   sudo cat /tmp/my-key
   
   sudo cat /tmp/my-key.pub
   ```

   即會顯示 SSH 私有和公有金鑰的內容：

   ```
   -----BEGIN RSA PRIVATE KEY-----
   Proc-Type: 4,ENCRYPTED
   DEK-Info: AES-128-CBC,DEF7A09C...541583FA
   A5p9dCuo...wp0YYH1c
   -----END RSA PRIVATE KEY-----
   
   ssh-rsa AAAAB3N...KaNogZkT root@cookbooks-demo1
   ```

在[下一個步驟](gettingstarted-cookbooks-run-script.md)中，您會更新技術指南，在執行個體上執行指令碼。

# 步驟 10：更新技術指南以執行指令碼
<a name="gettingstarted-cookbooks-run-script"></a>

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

透過新增會在執行個體上執行指令碼的配方，來更新您的技術指南。此配方會建立目錄，然後在該目錄中建立檔案。撰寫配方執行包含多個命令的指令碼，會比一次執行一個命令輕鬆許多。

**更新執行個體上的技術指南及執行新的配方**

1. 在您的本機工作站上，在 `opsworks_cookbook_demo` 目錄中的 `recipes` 子目錄中，建立名為 `run_script.rb` 的檔案，其中包含下列程式碼。如需詳細資訊，請前往 [script](https://docs.chef.io/resource_script.html)。

   ```
   script "Run a script" do
     interpreter "bash"
     code <<-EOH
       mkdir -m 777 /tmp/run-script-demo
       touch /tmp/run-script-demo/helloworld.txt
       echo "Hello, World!" > /tmp/run-script-demo/helloworld.txt
     EOH
   end
   ```

1. 在終端機或命令提示中，使用 **tar** 命令建立 `opsworks_cookbook_demo.tar.gz` 檔案的新版本，其中包含 `opsworks_cookbook_demo` 目錄及其更新後的內容。

1. 將更新後的 `opsworks_cookbook_demo.tar.gz` 檔案上傳至 S3 儲存貯體。

1. 遵循[步驟 5：更新執行個體上的技術指南及執行配方](gettingstarted-cookbooks-copy-cookbook.md)中的程序，更新執行個體上的技術指南及執行配方。在「執行配方」程序中，針對 **Recipes to execute (要執行的配方)**，輸入 **opsworks\$1cookbook\$1demo::run\$1script**。

**測試配方**

1. 登入執行個體 (若您尚未登入的話)。

1. 從命令提示中，執行下列命令以確認新的檔案已新增：

   ```
   sudo cat /tmp/run-script-demo/helloworld.txt
   ```

   即會顯示檔案的內容：

   ```
   Hello, World!
   ```

在[下一個步驟](gettingstarted-cookbooks-manage-service.md)中，您會更新技術指南，在執行個體上管理服務。

# 步驟 11：更新技術指南以管理服務
<a name="gettingstarted-cookbooks-manage-service"></a>

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

透過新增會在執行個體上管理服務的配方，來更新您的技術指南。這和執行 Linux **service** 命令，或 Windows **net stop**、**net start** 和其他類似命令相似。此配方會停止執行個體上的 **crond** 服務。

**更新執行個體上的技術指南及執行新的配方**

1. 在您的本機工作站上，在 `opsworks_cookbook_demo` 目錄中的 `recipes` 子目錄中，建立名為 `manage_service.rb` 的檔案，其中包含下列程式碼。如需詳細資訊，請前往 [service](https://docs.chef.io/resource_service.html)。

   ```
   service "Manage a service" do
     action :stop
     service_name "crond"  
   end
   ```

1. 在終端機或命令提示中，使用 **tar** 命令建立 `opsworks_cookbook_demo.tar.gz` 檔案的新版本，其中包含 `opsworks_cookbook_demo` 目錄及其更新後的內容。

1. 將更新後的 `opsworks_cookbook_demo.tar.gz` 檔案上傳至 S3 儲存貯體。

1. 遵循[步驟 5：更新執行個體上的技術指南及執行配方](gettingstarted-cookbooks-copy-cookbook.md)中的程序，更新執行個體上的技術指南及執行配方。在「執行配方」程序中，針對 **Recipes to execute (要執行的配方)**，輸入 **opsworks\$1cookbook\$1demo::manage\$1service**。

**測試配方**

1. 登入執行個體 (若您尚未登入的話)。

1. 從命令提示中，執行下列命令以確認 **crond** 服務已停止：

   ```
   service crond status
   ```

   即會顯示下列資訊：

   ```
   crond is stopped
   ```

1. 若要重新啟動 **crond** 服務，請執行下列命令：

   ```
   sudo service crond start
   ```

   即會顯示下列資訊：

   ```
   Starting crond:  [  OK  ]
   ```

1.  若要確認 **crond** 服務已啟動，請再次執行下列命令：

   ```
   service crond status
   ```

   即會顯示與下列內容相似的資訊：

   ```
   crond (pid  3917) is running...
   ```

在[下一個步驟](gettingstarted-cookbooks-custom-json.md)中，您會更新技術指南，在執行個體上參考以自訂 JSON 存放的資訊。

# 步驟 12：更新技術指南以使用自訂 JSON
<a name="gettingstarted-cookbooks-custom-json"></a>

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

透過新增會參考存放於執行個體上之自訂 JSON 的配方，來更新您的技術指南。

您可以在您建立、更新、複製堆疊，或在您執行部署或堆疊命令時以自訂 JSON 格式指定資訊。舉例來說，這在您要讓一小部分不會變動的資料供您執行個體上的配方使用 (而非從資料庫取得資料) 時會非常有用。如需詳細資訊，請參閱[使用自訂 JSON](workingstacks-json.md)。

針對本演練，您會使用自訂 JSON 提供一些關於客戶發票的虛擬資訊。自訂 JSON 會在此步驟的稍後進行說明。

**更新執行個體上的技術指南及執行新的配方**

1. 在您的本機工作站上，在 `recipes` 目錄中的 `opsworks_cookbook_demo` 子目錄中，建立名為 `custom_json.rb` 的檔案，其中包含下列配方程式碼：

   ```
   Chef::Log.info("********** For customer '#{node['customer-id']}' invoice '#{node['invoice-number']}' **********")
   Chef::Log.info("********** Invoice line number 1 is a '#{node['line-items']['line-1']}' **********")
   Chef::Log.info("********** Invoice line number 2 is a '#{node['line-items']['line-2']}' **********")
   Chef::Log.info("********** Invoice line number 3 is a '#{node['line-items']['line-3']}' **********")
   ```

   此配方會在日誌中顯示關於自訂 JSON 內值的訊息。

1. 在終端機或命令提示中，使用 **tar** 命令建立 `opsworks_cookbook_demo.tar.gz` 檔案的新版本，其中包含 `opsworks_cookbook_demo` 目錄及其更新後的內容。

1. 將更新後的 `opsworks_cookbook_demo.tar.gz` 檔案上傳至 S3 儲存貯體。

1. 遵循[步驟 5：更新執行個體上的技術指南及執行配方](gettingstarted-cookbooks-copy-cookbook.md)中的程序，更新執行個體上的技術指南及執行配方。在「執行配方」程序中，針對 **Recipes to execute (要執行的配方)**，輸入 **opsworks\$1cookbook\$1demo::custom\$1json**。針對 **Advanced (進階)**、**Custom Chef JSON (自訂 Chef JSON)**，輸入下列自訂 JSON：

   ```
   {
     "customer-id": "0123",
     "invoice-number": "9876",
     "line-items": {
       "line-1": "tractor",
       "line-2": "passenger car",
       "line-3": "trailer"
     }
   }
   ```

**測試配方**

1. 在先前程序中的 **Running command execute\$1recipes (執行 execute\$1recipes 命令)** 頁面顯示時，針對 **cookbooks-demo1** 的 **Log (日誌)**，選擇 **show (顯示)**。即會顯示 **execute\$1recipes** 日誌頁面。

1. 向下捲動日誌，尋找看起來與下列內容相似的項目：

   ```
   [2015-11-14T14:18:30+00:00] INFO: ********** For customer '0123' invoice '9876' **********
   [2015-11-14T14:18:30+00:00] INFO: ********** Invoice line number 1 is a 'tractor' **********
   [2015-11-14T14:18:30+00:00] INFO: ********** Invoice line number 2 is a 'passenger car' **********
   [2015-11-14T14:18:30+00:00] INFO: ********** Invoice line number 3 is a 'trailer' **********
   ```

   這些項目會顯示在 **Advanced (進階)**、**Custom Chef JSON (自訂 Chef JSON)** 方塊中輸入之自訂 JSON 的資訊。

在[下一個步驟](gettingstarted-cookbooks-data-bags.md)中，您將更新技術指南，從資料包取得資訊，這是 Stacks OpsWorks 在每個執行個體上存放的堆疊設定集合。

# 步驟 13：更新技術指南以使用資料包
<a name="gettingstarted-cookbooks-data-bags"></a>

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

新增參考 Stacks OpsWorks 存放在執行個體上一組資料包的堆疊設定的配方，以更新您的技術指南。此配方會在日誌中顯示存放於執行個體上之特定堆疊設定的相關訊息。如需更多資訊，請參閱[OpsWorks Stacks 資料包參考](data-bags.md)。

**更新執行個體上的技術指南及執行新的配方**

1. 在您的本機工作站上，在 `recipes` 目錄中的 `opsworks_cookbook_demo` 子目錄中，建立名為 `data_bags.rb` 的檔案，其中包含下列程式碼：

   ```
   instance = search("aws_opsworks_instance").first
   layer = search("aws_opsworks_layer").first
   stack = search("aws_opsworks_stack").first
   
   Chef::Log.info("********** This instance's instance ID is '#{instance['instance_id']}' **********")
   Chef::Log.info("********** This instance's public IP address is '#{instance['public_ip']}' **********")
   Chef::Log.info("********** This instance belongs to the layer '#{layer['name']}' **********")
   Chef::Log.info("********** This instance belongs to the stack '#{stack['name']}' **********")
   Chef::Log.info("********** This stack gets its cookbooks from '#{stack['custom_cookbooks_source']['url']}' **********")
   ```

   此配方會在日誌中顯示存放於執行個體上之特定堆疊設定的相關訊息。

1. 在終端機或命令提示中，使用 **tar** 命令建立 `opsworks_cookbook_demo.tar.gz` 檔案的新版本，其中包含 `opsworks_cookbook_demo` 目錄及其更新後的內容。

1. 將更新後的 `opsworks_cookbook_demo.tar.gz` 檔案上傳至 S3 儲存貯體。

1. 遵循[步驟 5：更新執行個體上的技術指南及執行配方](gettingstarted-cookbooks-copy-cookbook.md)中的程序，更新執行個體上的技術指南及執行配方。在「執行配方」程序中，針對 **Recipes to execute (要執行的配方)**，輸入 **opsworks\$1cookbook\$1demo::data\$1bags**。

**測試配方**

1. 在先前程序中的 **Running command execute\$1recipes (執行 execute\$1recipes 命令)** 頁面顯示時，針對 **cookbooks-demo1** 的 **Log (日誌)**，選擇 **show (顯示)**。即會顯示 **execute\$1recipes** 日誌頁面。

1. 向下捲動日誌，尋找看起來與下列內容相似的項目：

   ```
   [2015-11-14T14:39:06+00:00] INFO: ********** This instance's instance ID is 'f80fa119-81ab-4c3c-883d-6028e52c89EX' **********
   [2015-11-14T14:39:06+00:00] INFO: ********** This instance's public IP address is '192.0.2.0' **********
   [2015-11-14T14:39:06+00:00] INFO: ********** This instance belongs to the layer 'MyCookbooksDemoLayer' **********
   [2015-11-14T14:39:06+00:00] INFO: ********** This instance belongs to the stack 'MyCookbooksDemoStack' **********
   [2015-11-14T14:39:06+00:00] INFO: ********** This stack gets its cookbooks from 'https://s3.amazonaws.com/amzn-s3-demo-bucket/opsworks_cookbook_demo.tar.gz' **********
   ```

   此配方會顯示存放於執行個體上之特定堆疊設定的相關訊息。

在[下一個步驟](gettingstarted-cookbooks-iteration.md)中，您會更新技術指南，以多次執行配方程式碼。

# 步驟 14：更新技術指南以使用反覆運算
<a name="gettingstarted-cookbooks-iteration"></a>

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

透過新增使用「反覆運算」**(一種重複配方程式碼多次的技術) 的配方，來更新您的技術指南。此配方會在日誌中顯示包含多個內容之資料包項目的訊息。

**更新執行個體上的技術指南及執行新的配方**

1. 在您的本機工作站上，在 `recipes` 目錄中的 `opsworks_cookbook_demo` 子目錄中，建立名為 `iteration_demo.rb` 的檔案，其中包含下列程式碼：

   ```
   stack = search("aws_opsworks_stack").first
   Chef::Log.info("********** Content of 'custom_cookbooks_source' **********")
   
   stack["custom_cookbooks_source"].each do |content|
     Chef::Log.info("********** '#{content}' **********")
   end
   ```
**注意**  
相較於撰寫下列不使用反覆運算的配方程式碼，撰寫前述配方程式碼更簡短、彈性更佳，也較不容易發生錯誤：  

   ```
   stack = search("aws_opsworks_stack").first
   Chef::Log.info("********** Content of 'custom_cookbooks_source' **********")
   
   Chef::Log::info("********** '[\"type\", \"#{stack['custom_cookbooks_source']['type']}\"]' **********")
   Chef::Log::info("********** '[\"url\", \"#{stack['custom_cookbooks_source']['url']}\"]' **********")
   Chef::Log::info("********** '[\"username\", \"#{stack['custom_cookbooks_source']['username']}\"]' **********")
   Chef::Log::info("********** '[\"password\", \"#{stack['custom_cookbooks_source']['password']}\"]' **********")
   Chef::Log::info("********** '[\"ssh_key\", \"#{stack['custom_cookbooks_source']['ssh_key']}\"]' **********")
   Chef::Log::info("********** '[\"revision\", \"#{stack['custom_cookbooks_source']['revision']}\"]' **********")
   ```

1. 在終端機或命令提示中，使用 **tar** 命令建立 `opsworks_cookbook_demo.tar.gz` 檔案的新版本，其中包含 `opsworks_cookbook_demo` 目錄及其更新後的內容。

1. 將更新後的 `opsworks_cookbook_demo.tar.gz` 檔案上傳至 S3 儲存貯體。

1. 遵循[步驟 5：更新執行個體上的技術指南及執行配方](gettingstarted-cookbooks-copy-cookbook.md)中的程序，更新執行個體上的技術指南及執行配方。在「執行配方」程序中，針對 **Recipes to execute (要執行的配方)**，輸入 **opsworks\$1cookbook\$1demo::iteration\$1demo**。

**測試配方**

1. 在先前程序中的 **Running command execute\$1recipes (執行 execute\$1recipes 命令)** 頁面顯示時，針對 **cookbooks-demo1** 的 **Log (日誌)**，選擇 **show (顯示)**。即會顯示 **execute\$1recipes** 日誌頁面。

1. 向下捲動日誌，尋找看起來與下列內容相似的項目：

   ```
   [2015-11-16T19:56:56+00:00] INFO: ********** Content of 'custom_cookbooks_source' **********
   [2015-11-16T19:56:56+00:00] INFO: ********** '["type", "s3"]' **********
   [2015-11-16T19:56:56+00:00] INFO: ********** '["url", "https://s3.amazonaws.com/amzn-s3-demo-bucket/opsworks_cookbook_demo.tar.gz"]' **********
   [2015-11-16T19:56:56+00:00] INFO: ********** '["username", "secret-key-value"]' **********
   [2015-11-16T19:56:56+00:00] INFO: ********** '["password", "secret-access-key-value"]' **********
   [2015-11-16T19:56:56+00:00] INFO: ********** '["ssh_key", nil]' **********
   [2015-11-16T19:56:56+00:00] INFO: ********** '["revision", nil]' **********
   ```

   此配方會在日誌中顯示包含多個內容之資料包項目的訊息。資料包項目位於 `aws_opsworks_stack` 資料包中。資料包項目包含名為 `custom_cookbooks_source` 的內容。此內容的內部為六個名為 `type`、`url`、`username`、`password`、`ssh_key` 和 `revision` 的內容。此處也會顯示他們的值。

在[下一個步驟](gettingstarted-cookbooks-conditional-logic.md)中，您會更新技術指南，僅於滿足特定條件時執行配方程式碼。

# 步驟 15：更新技術指南以使用條件式邏輯
<a name="gettingstarted-cookbooks-conditional-logic"></a>

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

現在，透過新增使用「條件式邏輯」**(一種只在條件滿足時才執行程式碼的技術) 的配方，來更新您的技術指南。如需詳細資訊，請前往 [if Statements](https://docs.chef.io/dsl_recipe.html#if-statements) 和 [case Statements](https://docs.chef.io/dsl_recipe.html#case-statements)。

此配方會根據資料包的內容執行兩項作業：在日誌中顯示訊息，識別執行執行個體的作業系統，並且只在作業系統為 Linux 時，透過使用特定 Linux 版本的正確套件管理員來安裝套件。此套件名為 tree。該套件為可將目錄清單視覺化的簡易應用程式。

**更新執行個體上的技術指南及執行新的配方**

1. 在您的本機工作站上，於 `opsworks_cookbook_demo directory` 中的 `recipes` 子目錄中，建立名為 `conditional_logic.rb` 的檔案，其中包含下列程式碼：

   ```
   instance = search("aws_opsworks_instance").first
   os = instance["os"]
   
   if os == "Red Hat Enterprise Linux 7"
     Chef::Log.info("********** Operating system is Red Hat Enterprise Linux. **********")
   elsif os == "Ubuntu 14.04 LTS" || os == "Ubuntu 16.04 LTS" || os == "Ubuntu 18.04 LTS"
     Chef::Log.info("********** Operating system is Ubuntu. **********") 
   elsif os == "Microsoft Windows Server 2012 R2 Base"
     Chef::Log.info("********** Operating system is Windows. **********")
   elsif os == "Amazon Linux 2015.03" || os == "Amazon Linux 2015.09" || os == "Amazon Linux 2016.03" || os == "Amazon Linux 2016.09" || os == "Amazon Linux 2017.03" || os == "Amazon Linux 2017.09" || os == "Amazon Linux 2018.03" || os == "Amazon Linux 2"
     Chef::Log.info("********** Operating system is Amazon Linux. **********")
   elsif os == "CentOS Linux 7"
     Chef::Log.info("********** Operating system is CentOS 7. **********")
   else
     Chef::Log.info("********** Cannot determine operating system. **********")
   end
   
   case os
   when "Ubuntu 14.04 LTS", "Ubuntu 16.04 LTS", "Ubuntu 18.04 LTS"
     apt_package "Install a package with apt-get" do
       package_name "tree"
     end
   when "Amazon Linux 2015.03", "Amazon Linux 2015.09", "Amazon Linux 2016.03", "Amazon Linux 2016.09", "Amazon Linux 2017.03", "Amazon Linux 2017.09", "Amazon Linux 2018.03", "Amazon Linux 2", "Red Hat Enterprise Linux 7", "CentOS Linux 7"
     yum_package "Install a package with yum" do
       package_name "tree"
     end
   else
     Chef::Log.info("********** Cannot determine operating system type, or operating system is not Linux. Package not installed. **********")
   end
   ```

1. 在終端機或命令提示中，使用 **tar** 命令建立 `opsworks_cookbook_demo.tar.gz` 檔案的新版本，其中包含 `opsworks_cookbook_demo` 目錄及其更新後的內容。

1. 將更新後的 `opsworks_cookbook_demo.tar.gz` 檔案上傳至 S3 儲存貯體。

1. 遵循[步驟 5：更新執行個體上的技術指南及執行配方](gettingstarted-cookbooks-copy-cookbook.md)中的程序，更新執行個體上的技術指南及執行配方。在「執行配方」程序中，針對 **Recipes to execute (要執行的配方)**，輸入 **opsworks\$1cookbook\$1demo::conditional\$1logic**。

**測試配方**

1. 在先前程序中的 **Running command execute\$1recipes (執行 execute\$1recipes 命令)** 頁面顯示時，針對 **cookbooks-demo1** 的 **Log (日誌)**，選擇 **show (顯示)**。即會顯示 **execute\$1recipes** 日誌頁面。

1. 向下捲動日誌，尋找與下列內容相似的項目：

   ```
   [2015-11-16T19:59:05+00:00] INFO: ********** Operating system is Amazon Linux. **********
   ```

   由於執行個體的作業系統是 Amazon Linux 2016.09，因此日誌中只會顯示上述項目 （配方程式碼中五個可能項目中的項目）。

1. 若作業系統為 Linux，配方會安裝 tree 套件。若要查看目錄內容的視覺化，請從希望查看的目錄，或使用該目錄的路徑 (例如 `tree /var/chef/runs`)，在命令提示中輸入 **tree**。

在[下一個步驟](gettingstarted-cookbooks-community-cookbooks.md)中，您會更新技術指南，使用由 Chef 社群提供之外部技術指南的功能。

# 步驟 16：更新技術指南以使用社群技術指南
<a name="gettingstarted-cookbooks-community-cookbooks"></a>

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

最後，更新技術指南以使用 Chef 社群提供之外部技術指南中的功能。您在本演練中會使用的外部技術指南可從 [Chef Supermarket](https://supermarket.chef.io/) 取得。該網站為存取外部 Chef 技術指南的熱門位置。此外部技術指南提供自訂資源，可讓您下載及安裝應用程式，與您在[步驟 4：更新技術指南以安裝套件](gettingstarted-cookbooks-install-package.md)中執行的作業相似。而除了套件外，此資源還可安裝 Web 應用程式和其他應用程式類型。

當技術指南依存於另一個技術指南時，您必須指定其對其他技術指南的依存性。若要宣告及管理技術指南依存性，我們建議您使用名為 Berkshelf 的工具。如需如何在本機工作站上安裝 Berkshelf 的詳細資訊，請參閱 Chef 網站上的[關於 Berkshelf](https://docs.chef.io/berkshelf.html)。

在您安裝 Berkshelf 之後，遵循這些程序以宣告技術指南的依存性，然後建立呼叫外部技術指南中資源的配方。

**宣告技術指南依存性**

1. 在您的本機工作站上，於 `opsworks_cookbook_demo` 目錄中，在 `metadata.rb` 檔案的結尾新增此行：

   ```
   depends "application", "5.0.0"
   ```

   這會宣告其依存於名為 `application`，版本 5.0.0 的技術指南。

1. 從 `opsworks_cookbook_demo` 目錄的根，執行下列命令。命令結尾的句號是有意的。

   ```
   berks init .
   ```

   Berkshelf 會建立您在稍後針對更進階的案例可使用的資料夾及檔案。我們在本演練中所需要的檔案為名為 `Berksfile` 的檔案。

1. 在 `Berksfile` 檔案的結尾新增此行：

   ```
   cookbook "application", "5.0.0"
   ```

   這會通知 Berkshelf 您希望使用 [應用程式技術指南，版本 5.0.0](https://supermarket.chef.io/cookbooks/application/versions/5.0.0)。Berkshelf 可從 Chef Supermarket 下載。

1. 在終端機或命令提示中，從 `opsworks_cookbook_demo` 目錄的根執行下列命令：

   ```
   berks install
   ```

   Berkshelf 會為您的技術指南和應用程式技術指南建立依存性清單。Berkshelf 會在下一個程序中使用此依存性清單。

**更新執行個體上的技術指南及執行新的配方**

1. 在 `recipes` 目錄中的 `opsworks_cookbook_demo` 子目錄內，建立名為 `dependencies_demo.rb` 的檔案，其中包含下列程式碼：

   ```
   application "Install NetHack" do
     package "nethack.x86_64"
   end
   ```

   此配方會依存應用程式技術指南的應用程式資源，以在執行個體上安裝熱門的文字式冒險遊戲 NetHack。(您當然可以將其取代為任何其他的套件名稱，只要執行個體上的套件管理員可取得該套件即可。)

1. 從 `opsworks_cookbook_demo` 目錄的根，執行下列命令：

   ```
   berks package
   ```

   Berkshelf 使用先前程序中的依存性清單，來建立名為 `cookbooks-timestamp.tar.gz` 的檔案，其中包含 `opsworks_cookbook_demo` 目錄及其更新後的內容，包含技術指南的依存技術指南。將此檔案重新命名為 `opsworks_cookbook_demo.tar.gz`。

1. 將更新並重新命名後的 `opsworks_cookbook_demo.tar.gz` 檔案上傳至 S3 儲存貯體。

1. 遵循[步驟 5：更新執行個體上的技術指南及執行配方](gettingstarted-cookbooks-copy-cookbook.md)中的程序，更新執行個體上的技術指南及執行配方。在「執行配方」程序中，針對 **Recipes to execute (要執行的配方)**，輸入 **opsworks\$1cookbook\$1demo::dependencies\$1demo**。

1. 在您執行配方之後，應該可以登入執行個體，然後在命令提示輸入 **nethack** 來開始遊玩。(如需遊戲的詳細資訊，請參閱 [NetHack](https://en.wikipedia.org/wiki/NetHack) 和 [NetHack Guidebook](http://www.nethack.org/v343/Guidebook.html)。) 

在[下一個步驟](gettingstarted-cookbooks-clean-up.md)中，您可以清除用於本演練 AWS 的資源。此步驟為選用。當您繼續進一步了解 Stacks OpsWorks 時，建議您繼續使用這些 AWS 資源。不過，保留這些 AWS 資源可能會對 AWS 您的帳戶產生持續費用。如果您想要將這些 AWS 資源保留以供日後使用，您現在已完成本演練，您可以直接跳到 [後續步驟](gettingstarted-cookbooks-next-steps.md)。

# 步驟 17：(選用) 清除
<a name="gettingstarted-cookbooks-clean-up"></a>

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

為了避免 AWS 您的帳戶產生額外費用，您可以刪除 AWS 用於此演練的資源。這些 AWS 資源包括 S3 儲存貯體、 Stacks OpsWorks 堆疊和堆疊的元件。(如需詳細資訊，請參閱 [AWS OpsWorks 定價](https://aws.amazon.com/opsworks/pricing/)。) 不過，當您繼續進一步了解 OpsWorks Stacks 時，建議您繼續使用這些 AWS 資源。如果您想要讓這些 AWS 資源保持可用，您現在已完成本演練，您可以跳至 [後續步驟](gettingstarted-cookbooks-next-steps.md)。

存放在您為此逐步解說建立的資源裡的內容，可包含個人識別資訊。如果您不希望再將此資訊存放在 AWS，請遵循本主題的步驟。

**刪除 S3 儲存貯體**
+ 請參閱[刪除 Amazon S3 儲存貯體](https://docs.aws.amazon.com/gettingstarted/latest/swh/getting-started-cleanup-s3.html)。

**刪除堆疊的執行個體**

1. 在 OpsWorks Stacks 主控台的服務導覽窗格中，選擇**執行個體**。即會顯示 **Instances (執行個體)** 頁面。

1. 針對 **MyCookbooksDemoLayer** 之 **cookbooks-demo1** 的 **Actions (動作)**，選擇 **stop (停止)**。在您看見確認訊息時，選擇 **Stop (停止)**。

1. 下列變更會在數分鐘內發生。請不要在下列所有項目皆完成之前繼續。
   + **Status (狀態)** 從 **online (線上)** 變更為 **stopping (停止中)**，最後變更為 **stopped (已停止)**。
   + **online (線上)** 從 **1** 變更為 **0**。
   + **shutting down (關機中)** 從 **0** 變更為 **1**，最後變回 **0**。
   + **stopped (已停止)** 最後從 **0** 變更為 **1**。

1. 針對 **Actions (動作)**，選擇 **delete (刪除)**。當您看到確認訊息時，請選擇 **Delete**。 OpsWorks Stacks 會刪除執行個體並顯示**無執行個體**。

**刪除堆疊**

1. 在服務導覽窗格中，選擇 **Stack (堆疊)**。即會顯示 **MyCookbooksDemoStack** 頁面。

1. 選擇 **Delete Stack (刪除堆疊)**。當您看到確認訊息時，請選擇**刪除**。 OpsWorks 堆疊會刪除堆疊並顯示**儀表板**頁面。

您也可以選擇性地刪除您用於本演練的 IAM 使用者和 Amazon EC2 金鑰對，如果您不想重複使用這些金鑰對來存取其他 AWS 服務和 EC2 執行個體。如需說明，請參閱[刪除 IAM 使用者](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_users_manage.html#id_users_deleting)、[Amazon EC2 金鑰對和 Linux 執行個體](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-key-pairs.html#delete-key-pair)。

您現已完成本演練。如需詳細資訊，請參閱[後續步驟](gettingstarted-cookbooks-next-steps.md)。

# 後續步驟
<a name="gettingstarted-cookbooks-next-steps"></a>

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

現在您已完成本演練，您可以透過檢閱下列資源，進一步了解 OpsWorks Stacks 對 Chef 技術指南的支援：
+ [技術指南和配方](workingcookbook.md) – 說明 Stacks OpsWorks 目前支援的 Chef 和 Ruby 版本。也示範如何在執行個體上安裝及更新自訂技術指南，以及如何在執行個體上執行配方。
+ [Learn Chef](https://learn.chef.io/) – 提供 Chef 教學的連結、Chef 技能程式庫、完整的 Chef 文件，以及 Chef 培訓課程。
+ [關於 Chef](https://docs.chef.io/) – 提供完整的 Chef 文件。特定參考主題包含：
  + [About Cookbooks](https://docs.chef.io/cookbooks.html) – 說明關鍵技術指南元件，例如屬性、配方、檔案、中繼資料和範本。
  + [About Recipes](https://docs.chef.io/recipes.html) – 說明配方的基礎，例如如何使用資料包、包含其他配方，以及在配方中使用 Ruby 程式碼。
  + [Resources](https://docs.chef.io/resources.html#resources) – 說明如何使用所有內建 Chef 資源，例如 `apt_package`、`cookbook_file`、`directory`、`execute`、`file` 和 `package`。
  + [About the Recipe DSL](https://docs.chef.io/dsl_recipe.html) – 說明如何使用陳述式撰寫 Chef 配方的程式碼，例如 `if`、`case`、`data_bag`、`data_bag_item` 及 `search`。
+ [About Templates](https://docs.chef.io/templates.html) – 說明如何使用內嵌式 Ruby (ERB) 範本動態產生靜態文字檔案，例如組態檔案。
+ [學習軌道](https://learn.chef.io/tracks) – 說明如何使用 Chef 管理執行個體、管理基本 Web 應用程式、開發和測試基礎設施程式碼、使用 Chef 分析等。
+ [http://shop.oreilly.com/product/0636920032397.do](http://shop.oreilly.com/product/0636920032397.do) – Chef 簡介。由 O'Reilly Media 出版。
+ [Learning Chef code examples](https://github.com/learningchef/learningchef-code) – 提供程式碼範例，搭配由 O'Reilly Media 出版的《Learning Chef》**書籍。