

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

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

**重要**  
该 AWS OpsWorks Stacks 服务于 2024 年 5 月 26 日终止，新客户和现有客户均已禁用。我们强烈建议客户尽快将其工作负载迁移到其他解决方案。如果您对迁移有疑问，请通过 re [AWS : Post 或通过 Pre](https://repost.aws/) mium Su [AWS pp](https://aws.amazon.com/support) ort 与 AWS 支持 团队联系。

Configure 配方被分配给层的 Configure [生命周期](workingcookbook-events.md)事件，每当实例进入在线状态或退出在线状态时，堆栈的所有实例上都会发生该事件。您可以使用 Configure 配方来调整实例的配置，以根据需要响应更改。当您实施 Configure 配方时，请记住，堆栈配置更改可能涉及与此层无关的实例。该配方必须能够作出相应的响应，但在某些情况下，可能不需要执行任何操作。

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

`tomcat::configure` 配方用于执行层的 Configure 生命周期事件。

```
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 资源，如下一部分中所述。运行此配方以响应 configure 事件使层可以在数据库层发生变化后更新 Web 应用程序上下文配置文件。

1. `tomcat::container_config` Setup 配方再次运行，以捕获容器配置中的任何更改。

在本示例中，`include` 的 `tomcat::container_config` 被改为注释了。如果您希望使用自定义 JSON 来修改 Tomcat 设置，您可以删除注释。之后，Configure 生命周期事件运行 `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 cookbook 允许应用程序使用 [J DataSource](http://docs.oracle.com/javase/tutorial/jdbc/basics/sqldatasources.html) 2EE 对象访问 MySQL 数据库服务器，该服务器可以在单独的实例上运行。借助 Tomcat，您可以通过为每个应用程序创建和安装 Web 应用程序上下文配置文件来启用连接。此文件定义应用程序与 JDBC 资源 (应用程序将使用该资源与数据库通信) 之间的关系。有关更多信息，请参阅 [The Context Container](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 食谱属性外，此配方还使用了 Stack OpsWorks s 在 Configure 事件中安装的[堆栈配置和部署属性](workingcookbook-json.md)。 OpsWorks Stacks 服务向每个实例的节点对象添加属性，这些属性包含配方通常通过使用数据袋或搜索获得的信息，并将属性安装到每个实例上。这些属性包含关于堆栈配置、部署的应用程序和用户希望包含的任何自定义数据的详细信息。配方可以通过使用标准 Chef 节点语法获取堆栈配置和部署属性的数据。有关更多信息，请参阅 [堆栈配置和部署属性](workingcookbook-json.md)。对于 Chef 11.10 堆栈，您还可以使用 Chef 搜索来获取堆栈配置和部署数据。有关更多信息，请参阅 [使用 Chef 搜索](workingcookbook-chef11-10.md#workingcookbook-chef11-10-search)。

`deploy`属性是指`[:deploy]`命名空间，其中包含与部署相关的属性，这些属性通过控制台或 API 定义，或者由 OpsWorks Stacks 服务生成。`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` 被设置为应用程序的短名称。
+ template 资源可重新启动 Tomcat 服务以加载并激活更改。

`webapp_context.xml.erb` 模板包含一个 `Context` 元素，该元素包含一个具有其自己的一组属性的 `Resource` 元素。

这些 `Resource` 属性描述上下文配置的特征：
+ **name** - JDBC 资源名称，该名称被设置为 `tomcat::context` 中定义的 `resource_name` 值。

  例如，资源名称设置为 jdbc/mydb。
+ **auth** 和 **type** 这些是 JDBC `DataSource` 连接的标准设置。
+ **maxActive**、**maxIdle** 和 **maxWait** -活动和空闲连接的最大数量，以及恢复连接的最长等待时间。
+ **username** 和 **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**-`DataSource`工厂，这是 MySQL 数据库所必需的。

有关此配置文件的更多信息，请参阅 Tomcat wiki 的 “[使用](http://wiki.apache.org/tomcat/UsingDataSources)” DataSources 主题。