

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

# 配方
<a name="workingcookbook-installingcustom-components-recipes"></a>

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

配方是一種 Ruby 應用程式，可定義系統的組態。配方可以安裝套件、透過範本建立組態檔案、執行 shell 命令、建立檔案和目錄等。您通常會讓 OpsWorks Stacks 在執行個體上發生[生命週期事件](workingcookbook-events.md)時自動執行配方，但您也可以使用[執行配方堆疊命令隨時明確執行配方](workingcookbook-executing.md)。如需詳細資訊，請參閱[關於配方](http://docs.chef.io/recipes.html)。

配方主要是由一系列的「*資源*」構成，每組資源都代表系統方面的理想狀態。每個資源都包含一組屬性，可定義理想的狀態，並指定要採取的動作。Chef 會將每個資源與適當的「*提供者*」建立關聯，而提供者可以執行動作。如需詳細資訊，請參閱[資源和提供者參考](https://docs.chef.io/resource.html)。

`package` 資源可協助您管理 Linux 執行個體上的軟體套件。下列範例會安裝 Apache 套件。

```
...
package 'apache2' do
  case node[:platform]
  when 'centos','redhat','fedora','amazon'
    package_name 'httpd'
  when 'debian','ubuntu'
    package_name 'apache2'
  end
  action :install
end
...
```

Chef 會針對平台使用適當的套件提供者。資源屬性通常只會指派一個值，但您可以使用 Ruby 邏輯操作來執行條件式指派。此範例使用 `case` 運算子，其會使用 `node[:platform]` 來識別執行個體的作業系統，並依此設定 `package_name` 屬性。您可以使用標準的 Chef 節點語法將屬性插入配方，Chef 即會以相關聯的值進行取代。您可以在節點物件中使用任何屬性，而不只限於技術指南的屬性。

在判斷適當的套件名稱之後，程式碼區段會以 `install` 動做為結尾，由該動作安裝套件。此資源的其他動作包括 `upgrade` 和 `remove`。如需詳細資訊，請參閱[套件](https://docs.chef.io/chef/resources.html#id150)。

下列方法通常很實用：將複雜的安裝和設定任務拆解為一或多個子任務，再以個別配方形式實作每個子任務，然後讓您的主要配方在適當的時間執行這些任務。下列範例所示的這行程式碼即遵循上述範例：

```
include_recipe 'apache2::service'
```

若要讓配方執行子配方，請使用 `include_recipe` 關鍵字，後接配方名稱。配方是使用標準的 Chef `CookbookName::RecipeName` 語法來識別，其中 `RecipeName` 會省略 `.rb` 副檔名。

**注意**  
`include_recipe` 陳述式會有效地執行主要配方中該時間點的配方。然而，實際情況是，Chef 會將每個 `include_recipe` 陳述式取代為指定的配方程式碼，之後才執行主要配方。

`directory` 資源代表目錄，例如用來包含套件檔案的目錄。下列 `default.rb` 資源會建立 Linux 日誌目錄。

```
directory node[:apache][:log_dir] do
    mode 0755
    action :create
end
```

日誌目錄定義於其中一個技術指南的屬性檔案中。資源會將目錄的模式指定為 0755，並使用 `create` 動作來建立目錄。如需詳細資訊，請參閱[目錄](https://docs.chef.io/chef/resources.html#directory)。您也可以搭配使用此資源和 Windows 執行個體。

`execute` 資源代表命令，如 shell 命令或指令碼。下列範例會產生 module.load 檔案。

```
execute 'generate-module-list' do
  if node[:kernel][:machine] == 'x86_64'
    libdir = 'lib64'
  else
    libdir = 'lib'
  end
  command "/usr/local/bin/apache2_module_conf_generate.pl /usr/#{libdir}/httpd/modules /etc/httpd/mods-available"
  action :run
end
```

資源首先會先判定 CPU 類型。`[:kernel][:machine]` 是 Chef 自動產生的另一個屬性，用來代表各種系統屬性，在此案例中為 CPU 類型。接著，它會指定命令 (Perl 指令碼) 並使用 `run` 動作來執行指令碼，以產生 module.load 檔案。如需詳細資訊，請參閱 [execute](https://docs.chef.io/chef/resources.html#execute)。

`template` 資源代表檔案，通常是組態檔案，該檔案會從其中一個技術指南的範本檔案產生。下列範例會透過 `apache2.conf.erb` 範本 (如[範本](workingcookbook-installingcustom-components-templates.md)中所述) 建立一個 `httpd.conf` 組態檔案。

```
template 'apache2.conf' do
  case node[:platform]
  when 'centos','redhat','fedora','amazon'
    path "#{node[:apache][:dir]}/conf/httpd.conf"
  when 'debian','ubuntu'
    path "#{node[:apache][:dir]}/apache2.conf"
  end
  source 'apache2.conf.erb'
  owner 'root'
  group 'root'
  mode 0644
  notifies :restart, resources(:service => 'apache2')
end
```

資源會根據執行個體的作業系統來判斷產生的檔案名稱和位置。接著，它會指定 `apache2.conf.erb` 為範本，以用來產生檔案，並設定檔案的擁有者、群組和模式。它會執行 `notify` 動作來通知 `service` 資源 (其代表要重新啟動伺服器的 Apache 伺服器)。如需詳細資訊，請參閱[範本](https://docs.chef.io/chef/resources.html#template)。