

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

# 在 Linux 執行個體上使用外部技術指南：Berkshelf
<a name="cookbooks-101-opsworks-berkshelf"></a>

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

**注意**  
Berkshelf 僅適用於 Chef 11.10 Linux 堆疊。

在您開始實作技術指南之前，請參閱 [Chef 社群技術指南](https://github.com/opscode-cookbooks)，其中包含 Chef 社群成員基於各種用途所建立的技術指南。其中許多技術指南可以與 OpsWorks Stacks 搭配使用，無需修改，因此您可能可以針對某些任務利用它們，而不是自行實作所有程式碼。

若要在執行個體上使用外部技術指南，您需要安裝它並管理任何相依性的方法。偏好的方式是實作技術指南，而技術指南支援名為 Berkshelf 的相依性管理員。Berkshelf 適用於 Amazon EC2 執行個體，包括 OpsWorks Stacks 執行個體，但也旨在與 Test Kitchen 和 Vagrant 搭配使用。不過，Vagrant 上的用量與 Stacks OpsWorks 略有不同，因此本主題包含兩個平台的範例。如需如何使用 Berkshelf 的詳細資訊，請參閱 [Berkshelf](http://berkshelf.com/)。

**Topics**
+ [搭配使用 Berkshelf 與 Test Kitchen 和 Vagrant](#cookbooks-101-opsworks-berkshelf-vagrant)
+ [搭配 Stacks OpsWorks 使用 Berkshelf](#opsworks-berkshelf-opsworks)

## 搭配使用 Berkshelf 與 Test Kitchen 和 Vagrant
<a name="cookbooks-101-opsworks-berkshelf-vagrant"></a>

 此範例顯示如何使用 Berkshelf 來安裝 getting-started 社群技術指南並執行其配方，以在執行個體的主目錄中安裝簡短文字檔。

**安裝 Berkshelf 並初始化技術指南**

1. 在您的工作站上，安裝 Berkshelf Gem，如下所示。

   ```
   gem install berkshelf
   ```

   視您的工作站而定，此命令可能需要 `sudo`，或者您也可以使用 Ruby 環境管理員，例如 [RVM](https://rvm.io/)。若要驗證是否已成功安裝 Berkshelf，請執行 `berks --version`。

1. 本主題的技術指南命名為 external\$1cookbook。您可以使用 Berkshelf 建立初始化的技術指南，而非先前主題所採用的手動方式。若要這麼做，請導覽至 `opsworks_cookbooks` 目錄，並執行下列命令。

   ```
   berks cookbook external_cookbook
   ```

   此命令會建立 `external_cookbook` 目錄以及數種標準 Chef 和 Test Kitchen 子目錄 (包括 `recipes` 和 `test`)。此命令也會建立數種標準檔案的預設版本，包括下列項目：
   + `metadata.rb`
   + Vagrant、Test Kitchen 和 Berkshelf 的組態檔
   + `default.rb` 目錄中的空 `recipes` 配方
**注意**  
您不需要執行 `kitchen init`；`berks cookbook` 命令會處理這些任務。

1. 執行 `kitchen converge`。新建立的技術指南目前不會執行任何有趣的動作，但會收歛。

**注意**  
您也可以使用 `berks init`，初始化現有技術指南來使用 Berkshelf。

若要使用 Berkshelf 管理技術指南的外部相依性，技術指南的根目錄必須包含 `Berksfile`，而此組態檔指定 Berkshelf 應該如何管理相依性。當您使用 `berks cookbook` 建立 `external_cookbook` 技術指南時，會建立具有下列內容的 `Berksfile`。

```
source "https://supermarket.chef.io"
metadata
```

此檔案的宣告如下：
+ `source` – 技術指南來源的 URL。

  Berksfile 可以有任意數目的 `source` 宣告，而且每個宣告都指定相依技術指南的預設來源。如果您未明確指定技術指南的來源，則 Berkshelf 會查看同名技術指南的預設儲存庫。預設 Berksfile 包括可指定社群技術指南儲存庫的單一 `source` 屬性。該儲存庫包含 getting-started 技術指南，因此您可以將該列保持不變。
+ `metadata` – 指示 Berkshelf 包含技術指南檔案中宣告的技術指南相依性`metadata.rb`。

  您也可以包括 `cookbook` 屬性以在 Berksfile 中宣告相依技術指南，稍後將會予以討論。

有兩種方法可以宣告技術指南相依性：
+ 在 Berksfile 中包括 `cookbook` 宣告。

  這是 Stacks OpsWorks 使用的方法。例如，若要指定此範例中所使用的 getting-started 技術指南，請在 Berksfile 中包括 `cookbook "getting-started"`。Berkshelf 接著會查看預設儲存庫中是否有該名稱的技術指南。您也可以使用 `cookbook` 明確指定技術指南來源，甚至指定特定版本。如需詳細資訊，請參閱 [Berkshelf](http://berkshelf.com/)。
+ 在 Berksfile 中包括 `metadata` 宣告，並在 `metadata.rb` 中宣告相依性。

  此宣告指示 Berkshelf 包括 `metadata.rb` 中所宣告的技術指南相依性。例如，若要宣告 getting-started 相依性，請將 `depends 'getting-started'` 宣告新增至技術指南的 `metadata.rb` 檔案。

此範例使用第一個方法，以與 Stacks OpsWorks 保持一致。

**安裝 getting-started 技術指南**

1. 編輯預設 Berksfile，以將 `metadata` 宣告取代為 `cookbook` 的 `getting-started` 宣告。內容應該與下列類似。

   ```
   source "https://supermarket.chef.io"
   
   cookbook 'getting-started'
   ```

1. 執行 `berks install`，以將 getting-started 技術指南從社群技術指南儲存庫下載至您工作站的 Berkshelf 目錄 (通常為 `~/.berkshelf`)。此目錄通常只會稱為 *Berkshelf*。查看 Berkshelf 的 `cookbooks` 目錄，而您應該會看到 getting-started 技術指南的目錄，而其命名類似 `getting-started-0.4.0`。

1. 將 `external_cookbook::default` 回合清單中的 `.kitchen.yml` 取代為 `getting-started::default`。此範例不會從 external\$1cookbook 執行任何配方；它基本上就只是使用 getting-started 技術指南的方式。`.kitchen.yml` 檔案現在應該與下列類似。

   ```
   ---
   driver:
     name: vagrant
   
   provisioner:
     name: chef_solo
   
   platforms:
     - name: ubuntu-12.04
   
   suites:
     - name: default
       run_list:
         - recipe[getting-started::default]
       attributes:
   ```

1. 執行 `kitchen converge`，然後使用 `kitchen login` 登入執行個體。登入目錄應該包含名為 `chef-getting-started.txt` 且具有下列類似內容的檔案：

   ```
   Welcome to Chef!
   
   This is Chef version 11.12.8.
   Running on ubuntu.
   Version 12.04.
   ```

   Test Kitchen 會在執行個體的 `/tmp/kitchen/cookbooks` 目錄中安裝技術指南。如果您列出該目錄的內容，則會看到兩個技術指南：external\$1cookbook 和 getting-started。

1. 執行 `kitchen destroy` 關機執行個體。下一個範例使用 OpsWorks Stacks 執行個體。

## 搭配 Stacks OpsWorks 使用 Berkshelf
<a name="opsworks-berkshelf-opsworks"></a>

OpsWorks Stacks 選擇性地支援 Berkshelf for Chef 11.10 堆疊。若要搭配使用 Berkshelf 與您的堆疊，您必須執行下列動作。
+ 啟用堆疊的 Berkshelf。

  OpsWorks Stacks 接著會處理在堆疊執行個體上安裝 Berkshelf 的詳細資訊。
+ 將 Berksfile 新增至技術指南儲存庫的根目錄。

  Berksfile 應該包含所有相依技術指南的 `source` 和 `cookbook` 宣告。

當 OpsWorks Stacks 在執行個體上安裝您的自訂技術指南儲存庫時，它會使用 Berkshelf 來安裝儲存庫 Berksfile 中宣告的相依技術指南。如需詳細資訊，請參閱[使用 Berkshelf](workingcookbook-chef11-10.md#workingcookbook-chef11-10-berkshelf)。

此範例示範如何使用 Berkshelf 在 Stacks OpsWorks 執行個體上安裝入門社群技術指南。它也會安裝用來建立 createfile 自訂技術指南的版本，以在指定的目錄中建立檔案。如需 createfile 運作方式的詳細資訊，請參閱[從技術指南安裝檔案](cookbooks-101-basics-files.md#cookbooks-101-basics-files-cookbook_file)。

**注意**  
如果這是您第一次在 Stacks OpsWorks 堆疊上安裝自訂技術指南，您應該先瀏覽[在 Linux 執行個體上執行配方](cookbooks-101-opsworks-opsworks-instance.md)範例。

從建立堆疊開始，彙總如下。如需詳細資訊，請參閱[建立新的堆疊](workingstacks-creating.md)。

**建立堆疊**

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

1. 指定下列設定，並接受其他設定的預設值，然後按一下 **Add Stack (新增堆疊)**。
   + **名稱** – BerksTest
   + **預設 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) 至具有下列設定的堆疊。
   + **名稱** – BerksTest
   + **簡短名稱** – berkstest

   您可以針對此範例實際使用任何 layer 類型。不過，此範例不需要其他 layer 所安裝的任何套件，因此自訂 layer 是最簡單的方法。

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

使用 OpsWorks Stacks，技術指南必須位於具有標準目錄結構的遠端儲存庫中。然後，您將下載資訊提供給 OpsWorks Stacks，其會在啟動時自動將儲存庫下載到每個堆疊的執行個體。為了簡化，此範例的儲存庫是公有 Amazon S3 封存，但 OpsWorks Stacks 也支援 HTTP 封存、Git 儲存庫和 Subversion 儲存庫。如需詳細資訊，請參閱[技術指南儲存庫](workingcookbook-installingcustom-repo.md)。

傳遞至 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. 在 `opsworks_cookbooks` 目錄中，建立名為 `berkstest_cookbooks` 的目錄。如果您想要，則可以在您方便找到的任何位置建立此目錄，因為您會將它上傳至儲存庫。

1. 使用下列內容，將名為 Berksfile 的檔案新增至 `berkstest_cookbooks`。

   ```
   source "https://supermarket.chef.io"
   
   cookbook 'getting-started'
   ```

   此檔案宣告 getting-started 技術指南相依性，並指示 Berkshelf 從社群技術指南網站下載它。

1. 將 `createfile` 目錄新增至包含下列內容的 `berkstest_cookbooks`。
   + 具有下列內容的 `metadata.rb` 檔案。

     ```
     name "createfile"
     version "0.1.0"
     ```
   + 包含具有下列內容之 `files/default` 檔案的 `example_data.json` 目錄。

     ```
     {
       "my_name" : "myname",
       "your_name" : "yourname",
       "a_number" : 42,
       "a_boolean" : true
     }
     ```

     檔案的名稱和內容為任意的。配方只需要將檔案複製至指定的位置。
   + 包含具有下列配方程式碼之 `recipes` 檔案的 `default.rb` 目錄。

     ```
     directory "/srv/www/shared" do
       mode 0755
       owner 'root'
       group 'root'
       recursive true
       action :create
     end
     
     cookbook_file "/srv/www/shared/example_data.json" do
       source "example_data.json"
       mode 0644
       action :create_if_missing
     end
     ```

     此配方會建立 `/srv/www/shared`，並將 `example_data.json` 從技術指南的 `files` 目錄複製至該目錄。

1. 建立 的`.zip`封存`berkstest_cookbooks`、[上傳封存至 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)，然後指定下列設定。
   + **儲存庫類型** – **Http Archive**
   + **儲存庫 URL** – 您先前記錄的技術指南封存 URL
   + **管理 Berkshelf** – **是**

   前兩個設定提供 OpsWorks Stacks 將技術指南儲存庫下載到您的執行個體所需的資訊。最後一個設定會啟用 Berkshelf 支援，以將 getting-started 技術指南下載至執行個體。接受其他設定的預設值，然後按一下 **Save (儲存)** 以更新堆疊組態。

1. 編輯 BerksTest layer，以[將下列配方新增至 layer 的安裝生命週期事件](workingcookbook-assigningcustom.md)。
   + `getting-started::default`
   + `createfile::default`

1. [啟動](workinginstances-starting.md)實例。設定事件會在執行個體完成開機後發生。 OpsWorks Stacks 接著會安裝技術指南儲存庫、使用 Berkshelf 下載入門技術指南，以及執行 layer 的設定和部署配方，包括 `getting-started::default`和 `createfile::default`。

1. 執行個體上線之後，請[使用 SSH 登入](workinginstances-ssh.md)。您應該會看到下列事項：
   + `/srv/www/shared` 應該包含 `example_data.json`。
   + `/root` 應該包含 `chef-getting-started.txt`。

     OpsWorks Stacks 會以根目錄執行配方，因此入門會將 檔案安裝在 `/root`目錄中，而不是您的主目錄中。