

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

# 設定配方
<a name="create-custom-configure"></a>

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

設定配方會指派給 layer 的設定[生命週期](workingcookbook-events.md)事件，該事件會在執行個體進入或離開線上狀態時，在所有堆疊的執行個體上發生。您可使用設定配方調整執行個體的組態，以適當回應變更。當您實作設定配方時，請記得堆疊組態變更可能會涉及與這一 layer 無關的執行個體。配方必須要能適當地進行回應，在某些案例中，可能不會進行任何行為。

## tomcat::configure
<a name="create-custom-configure-configure"></a>

`tomcat::configure` 配方用於 layer 的設定生命週期事件。

```
include_recipe 'tomcat::context'
# Optional: Trigger a Tomcat restart in case of a configure event, if relevant
# settings in custom JSON have changed (e.g. java_opts/JAVA_OPTS):
#include_recipe 'tomcat::container_config'
```

`tomcat::configure` 配方基本上就是執行兩個依存配方的中繼配方。

1. `tomcat::context` 配方會建立 web 應用程式內容組態檔案。

   此檔案會設定應用程式用來與 MySQL 執行個體通訊的 JDBC 資源，如下一節所討論。執行此配方以回應設定事件，可讓 layer 在資料庫 layer 變更時更新 web 應用程式內容組態檔案。

1. `tomcat::container_config` 安裝配方會再次執行，以擷取任何容器組態中的變更。

`include` 的 `tomcat::container_config` 在此範例中已標示為註解。若您希望使用自訂的 JSON 修改 Tomcat 設定，您可以移除註解。設定生命週期事件接著會執行 `tomcat::container_config` 更新 Tomcat 的相關組態檔案 (如 [tomcat::container\$1config](create-custom-setup.md#create-custom-setup-config) 所述) 並重新啟動 Tomcat 服務。

## tomcat::context
<a name="create-custom-configure-context"></a>

Tomcat 技術指南可透過使用 [J2EE DataSource](http://docs.oracle.com/javase/tutorial/jdbc/basics/sqldatasources.html) 物件，讓應用程式存取可能在分離的執行個體上執行的 MySQL 資料庫伺服器。透過 Tomcat，您可以藉由建立和安裝每個應用程式的 web 應用程式內容組態檔案，來啟用連線。此檔案定義應用程式和應用程式用來與資料庫通訊之 JDBC 資源間的關聯。如需詳細資訊，請參閱[內容容器](http://tomcat.apache.org/tomcat-7.0-doc/config/context.html)。

`tomcat::context` 配方的主要用途是建立此組態檔案。

```
include_recipe 'tomcat::service'

node[:deploy].each do |application, deploy|
  context_name = deploy[:document_root].blank? ? application : deploy[:document_root]

  template "context file for #{application} (context name: #{context_name})" do
    path ::File.join(node['tomcat']['catalina_base_dir'], 'Catalina', 'localhost', "#{context_name}.xml")
    source 'webapp_context.xml.erb'
    owner node['tomcat']['user']
    group node['tomcat']['group']
    mode 0640
    backup false
    only_if { node['datasources'][context_name] }
    variables(:resource_name => node['datasources'][context_name], :webapp_name => application)
    notifies :restart, resources(:service => 'tomcat')
  end
end
```

除了 Tomcat 技術指南屬性之外，此配方還使用 OpsWorks Stacks 隨設定事件一起安裝的[堆疊組態和部署屬性](workingcookbook-json.md)。Stacks OpsWorks 服務會將屬性新增至每個執行個體的節點物件，其中包含配方通常會使用資料包或搜尋取得的資訊，並在每個執行個體上安裝屬性。屬性包含堆疊組態、部署應用程式和任何使用者希望包含之自訂資料的詳細資訊。配方可透過使用標準 Chef 節點語法，從堆疊組態和部署屬性取得資料。如需詳細資訊，請參閱[堆疊組態及部署屬性](workingcookbook-json.md)。透過 Chef 11.10 堆疊，您也可以使用 Chef 搜尋取得堆疊組態和部署資料。如需詳細資訊，請參閱[使用 Chef 搜尋](workingcookbook-chef11-10.md#workingcookbook-chef11-10-search)。

`deploy` 屬性是指`[:deploy]`命名空間，其中包含透過主控台或 API 定義的部署相關屬性，或由 Stacks OpsWorks 服務產生的屬性。`deploy` 屬性包含每個部署應用程式的屬性，以應用程式的短名命名。每個應用程式屬性都包含一組描述應用程式的屬性，例如文件根 (`[:deploy][:appname][:document_root]`)。

`context` 配方首先會透過呼叫 [tomcat::service](create-custom-setup.md#create-custom-setup-service)，確認已為此 Chef 執行定義服務。它接著會定義 `context_name` 變數，代表組態檔案的名稱 (排除 `.xml` 副檔名)。若您使用預設文件根，`context_name` 會設為應用程式的短名。否則，它會設為指定的文件根。[建立堆疊和執行應用程式](create-custom-stack.md)中討論的範例會將文件根設為 `"ROOT"`，因此內容為 ROOT，組態檔案則名為 `ROOT.xml`。

大量的配方都會穿過每個應用程式的部署應用程式清單，使用 `webapp_context.xml.erb` 範本建立內容組態檔案。範例只會部署一個應用程式，但 `deploy` 屬性的定義仍會要求您將其視為應用程式清單處理。

`webapp_context.xml.erb` 範本並非作業系統限定，因此它會位於 `templates` 目錄的 `default` 子目錄中。

配方會建立組態檔案如下：
+ 當使用預設屬性值時，組態檔案名稱會設為 `context_name.xml`，並安裝在 `/etc/tomcat6/Catalina/localhost/` 目錄中。

  堆疊組態屬性的 `['datasources']` 節點包含一或多個屬性，每一種都會將一個內容名稱映射到關聯應用程式用來與資料庫通訊的 JDBC 資料來源。節點和其內容都會在您建立堆疊時，使用自訂 JSON 定義，如稍後的[建立堆疊和執行應用程式](create-custom-stack.md)所述。範例具有將 ROOT 內容名稱與名為 jdbc/mydb 的 JDBC 資源建立關聯的單一屬性。
+ 使用預設屬性值，檔案的使用者和群組都會設為由 Tomcat 套件定義的值：`tomcat` (Amazon Linux) 或 `tomcat6` (Ubuntu)。
+ `template` 資源只會在 `['datasources']` 節點存在且包含 `context_name` 屬性值建立組態檔案。
+ `template` 資源會定義兩個變數：`resource_name` 和 `webapp_name`。

  `resource_name` 已設為與 `context_name` 關聯的資源名稱，`webapp_name` 則已設為應用程式的短名。
+ 範本資源會重新啟動 Tomcat 服務，載入及啟用變更。

`webapp_context.xml.erb` 範本由包含具有自己屬性組之 `Context` 元素的 `Resource` 元素組成。

`Resource` 屬性會描述內容組態的特性：
+ **name** – JDBC 資源名稱，設定為 中定義的`resource_name`值`tomcat::context`。

  例如，資源名稱已設為 jdbc/mydb。
+ **驗證**和**類型** – 這些是 JDBC `DataSource`連線的標準設定。
+ **maxActive**、**maxIdle** 和 **maxWait** – 作用中和閒置連線的數量上限，以及傳回連線的等待時間上限。
+ **username**， and **password** – 從`deploy`屬性取得的資料庫使用者名稱和根密碼。
+ **driverClassName** – JDBC 驅動程式的類別名稱，設定為 MySQL 驅動程式。
+ **url** – 連線 URL。

  前綴取決於資料庫。其應設為 `jdbc:mysql` (MySQL)、`jdbc:postgresql` (Postgres) 和 `jdbc:sqlserver` (SQL Server)。範例將 URL 設為 `jdbc:mysql://host_IP_Address:3306:simplejsp`，其中 *simplejsp* 為應用程式的短名。
+ **factory** – MySQL 資料庫需要的 `DataSource` factory。

如需此組態檔案的詳細資訊，請參閱 Tomcat 維基的 [Using DataSources](http://wiki.apache.org/tomcat/UsingDataSources) 主題。