

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

# 步骤 2.3：实施自定义说明书
<a name="gettingstarted-windows-cookbook"></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 支持 团队联系。

尽管堆栈基本上是实例的容器，但您不能直接将实例添加到堆栈。您可添加一个或多个层 (每个层代表一组相关实例)，然后将实例添加到层。

层基本上是一个蓝图， OpsWorks Stacks 使用它来创建一组具有相同配置的 Amazon EC2 实例。实例从基本版的操作系统开始，实例的层在实例上执行各种任务来实施此蓝图，这些任务可能包括：
+ 创建目录和文件
+ 管理用户
+ 安装和配置软件
+ 启动或停止服务器
+ 部署应用程序代码和相关文件。

层通过运行 [简称“配方”](https://docs.chef.io/recipes.html) 在实例上执行任务。配方是使用 Chef 的域专用语言 (DSL) 描述实例的最终状态的 Ruby 应用程序。在 OpsWorks Stacks 中，每个配方通常会分配给该层的[生命周期事件](workingcookbook-events.md)之一：设置、配置、部署、取消部署和关闭。当实例发生生命周期事件时， OpsWorks Stacks 会运行该事件的配方来执行相应的任务。例如，Setup 事件发生在实例完成启动之后。 OpsWorks 然后，Stacks 会运行安装配方，这些配方通常会执行诸如安装和配置服务器软件以及启动相关服务之类的任务。

OpsWorks Stacks 为每个图层提供了一组用于执行标准任务的内置配方。您可扩展层的功能，方式为实现自定义配方来执行其他任务并将配方分配给层的生命周期事件。Windows 堆栈支持[自定义层](workinglayers-custom.md)，这些层具有一组仅执行几项基本任务的最少量的配方。要向您的 Windows 实例添加功能，您必须实现自定义配方来安装软件、部署应用程序等。本主题介绍如何创建一个简单的自定义层来支持 IIS 实例。

**Topics**
+ [说明书和配方的快速简介](#gettingstarted-windows-layer-recipes)
+ [实施配方以安装和启动 IIS](#gettingstarted-windows-layer-recipe-iis)
+ [启用自定义说明书](#gettingstarted-windows-layer-enable-cookbook)

## 说明书和配方的快速简介
<a name="gettingstarted-windows-layer-recipes"></a>

配方定义实例预期状态的一个或多个方面：应包含哪些目录，应安装哪些软件程序包、应部署哪些应用程序等。配方包装在*说明书* 中，说明书通常包含一个或多个相关配方以及关联文件 (例如，用于创建配置文件的模板)。

本主题对配方做了最基本的介绍，足以为您演示如何实施说明书以支持简单的自定义 IIS 层。有关说明书的更具体的介绍，请参阅[说明书和诀窍](workingcookbook.md)。有关实施说明书的详细指导性介绍 (包括一些 Windows 特定的主题)，请参阅[说明书 101](cookbooks-101.md)。

从技术上说，Chef 配方是 Ruby 应用程序，但大部分 (而非所有) 代码位于 Chef DSL 中。DSL 主要由一组*资源* 组成，可用于声明地指定实例状态的一个方面。例如，[`directory` 资源](https://docs.chef.io/chef/resources.html#directory)定义要添加到系统的目录。以下示例定义一个拥有完整控制权的 `C:\data` 目录，此目录属于指定用户并且不会从父目录继承权限。

```
directory 'C:\data' do
  rights :full_control, 'WORKGROUP\username'
  inherits false
  action :create
end
```

当 Chef 运行配方时，它通过将数据传递给关联的*提供程序* (一个处理修改实例状态的详细信息的 Ruby 对象) 来执行每项资源。在此示例中，提供程序使用指定配置创建一个新目录。

自定义 IIS 层的自定义说明书必须执行下列任务：
+ 安装 IIS 功能并启动此服务。

  通常，您在设置期间、实例完成启动后立即执行此任务。
+ 将应用程序部署到实例 (此示例中为一个简单的 HTML 页面)。

  您通常在设置期间执行此任务。但是，应用程序通常需要定期更新，因此您还需要在实例处于联机状态时部署更新。

您可让单个配方执行所有这些任务。但是，首选方法是将单独的配方用于设置和部署任务。这样一来，无需运行设置代码，也可随时部署应用程序更新。下面介绍了如何设置说明书以支持自定义 IIS 层。后续主题将演示如何实施配方。

**开始使用**

1. 在您的工作站上的方便位置创建一个名为 `iis-cookbook` 的目录。

1. 将包含以下内容的 `metadata.rb` 文件添加到 `iis-cookbook`。

   ```
   name "iis-cookbook"
   version "0.1.0"
   ```

   此示例使用最小 `metadata.rb`。有关如何使用此文件的更多信息，请参阅 [metadata.rb](https://docs.chef.io/config_rb_metadata.html)。

1. 将 `recipes` 目录添加 `iis-cookbook` 中。

   此目录必须命名为 `recipes`，它包含说明书的配方。

通常，说明书可以包含各种其他目录。例如，如果配方使用模板创建配置文件，则此模板通常位于 `templates\default` 目录中。此示例的说明书完全由配方构成，因此无需其他目录。此外，此示例使用单个说明书，但您可使用所需数量的说明书；对于复杂项目，通常使用多个说明书更可取。例如，对于设置和部署任务，您可具有单独的说明书。有关更多说明书示例，请参阅[说明书和诀窍](workingcookbook.md)。

## 实施配方以安装和启动 IIS
<a name="gettingstarted-windows-layer-recipe-iis"></a>

 IIS 是一项 Windows *功能*，它是可安装在 Windows Server 上的可选系统组件之一。您可让配方通过以下任一方式安装 IIS：
+ 使用 [https://docs.chef.io/chef/resources.html#powershell-script](https://docs.chef.io/chef/resources.html#powershell-script) 资源运行 [https://docs.microsoft.com/en-us/powershell/module/servermanager/install-windowsfeature?view=winserver2012-ps](https://docs.microsoft.com/en-us/powershell/module/servermanager/install-windowsfeature?view=winserver2012-ps) cmdlet。
+ 使用 Chef [windows 说明书](https://github.com/opscode-cookbooks/windows) `windows_feature` 资源。

  `windows` 说明书包含一组资源，该资源的提供程序使用[部署映像服务和管理](https://technet.microsoft.com/en-us/library/dd744256%28v=ws.10%29.aspx) (DISM) 在 Windows 实例上执行各种任务（包括功能安装）。

**注意**  
`powershell_script` 位于 Windows 配方的最有用资源之间。通过运行 PowerShell 脚本或 cmdlet，您可以使用它在实例上执行各种任务。它尤其适用于不受 Chef 资源支持的任务。

此示例运行 PowerShell 脚本来安装和启动 Web 服务器 (IIS)。下文将介绍 `windows` 说明书。有关如何使用 `windows_feature` 安装 IIS 的示例，请参阅[安装 Windows 功能：IIS](cookbooks-101-opsworks-install-software-feature.md)。

将包含下列内容的名为 `install.rb` 的配方添加到说明书的 `recipes` 目录。

```
powershell_script 'Install IIS' do
  code 'Install-WindowsFeature Web-Server'
  not_if "(Get-WindowsFeature -Name Web-Server).Installed"
end

service 'w3svc' do
  action [:start, :enable]
end
```

此配方包含两种资源。

**powershell\$1script**  
`powershell_script`运行指定的 PowerShell脚本或 cmdlet。此示例具有下列属性设置：  
+ `code`— 要运行的 PowerShell cmdlet。

  此示例运行一个用于安装 Web Server (IIS) 的 `Install-WindowsFeature` cmdlet。通常，`code` 属性可以包含任意数量的行，因此您可运行所需数量的 cmdlet。
+ `not-if`：一个[https://docs.chef.io/chef/resources.html#guards](https://docs.chef.io/chef/resources.html#guards)，可确保配方仅在 IIS 未安装时安装它。

  您通常希望配方是*幂等* 的，因此它们不会浪费时间执行同一任务多次。
每项资源均有一个操作，它指定提供程序要采取的操作。此示例没有明确的操作，因此提供程序采用默认`:run`操作，即运行指定的 PowerShell 脚本。有关更多信息，请参阅 [运行 Windows PowerShell 脚本](cookbooks-101-opsworks-opsworks-powershell.md)。

**service**  
一个 [https://docs.chef.io/chef/resources.html#service](https://docs.chef.io/chef/resources.html#service) 管理一项服务 (在此示例中为 Web Server IIS 服务 (W3SVC))。此示例使用默认属性并指定 `:start` 和 `:enable` 这两项操作来启动和启用 IIS。

**注意**  
如果您要安装使用程序包安装程序的软件 (如 MSI)，可使用 `windows_package` 资源。有关更多信息，请参阅 [安装程序包](cookbooks-101-opsworks-install-software-package.md)。

## 启用自定义说明书
<a name="gettingstarted-windows-layer-enable-cookbook"></a>

OpsWorks Stacks 在每个实例上运行来自本地缓存的配方。要运行您的自定义配方，您必须执行以下操作：
+ 将说明书存储在远程存储库中。

  OpsWorks Stacks 将食谱从此存储库下载到每个实例的本地缓存中。
+ 编辑堆栈以启用自定义说明书。

  默认情况下，禁用自定义说明书，因此您必须为堆栈启用自定义说明书并提供存储库 URL 和相关信息。

OpsWorks Stacks 支持自定义食谱的 S3 存档和 Git 存储库；此示例使用 S3 存档。有关更多信息，请参阅 [说明书存储库](workingcookbook-installingcustom-repo.md)。

**使用 S3 存档**

1. 创建 `iis-cookbook` 目录的 `.zip` 存档。

   OpsWorks 堆栈还支持 Windows 堆栈的`.tgz`（gzip 压缩的 tar）存档。

1. 将存档上传到美国西部（北加利福尼亚）区域中的 S3 存储桶并公开此文件。您还可使用私有 S3 存档，但公用存档对此示例来说已够用，并且使用起来更简单一些。

   1. 登录 AWS 管理控制台 并打开 Amazon S3 控制台，网址为[https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/)。

   1. 如果您在 `us-west-1` 中还没有存储桶，请选择**创建存储桶**，在美国西部（北加利福尼亚）区域中创建存储桶。

   1. 在存储桶列表中，选择要将文件上传到的存储桶的名称，然后选择 **Upload (上传)**。

   1. 选择 **Add Files**。

   1. 选择要上传的存档文件，然后选择 **Open (打开)**。

   1. 在 **Upload - Select Files and Folders (上传 - 选择文件和文件夹)** 对话框的底部，选择 **Set Details (设置详细信息)**。

   1. 在 **Set Details** 对话框的底部，选择 **Set Permissions**。

   1. 在 **Set Permissions** 对话框中，选择 **Make everything public**。

   1. 在 **Set Permissions (设置权限)** 对话框的底部，选择 **Start Upload (开始上传)**。上传完成后，`iis-cookbook.zip` 文件显示在您的存储桶中。

   1. 选择存储桶，然后选择该存储桶的 **Properties (属性)** 选项卡。在 **Link (链接)** 旁边，记录存档文件的 URL 以供将来使用。

   更多有关将文件上传到 Amazon S3 存储桶的信息，请参阅*Amazon S3 控制台用户指南*中的[如何将文件和文件夹上传到 S3 存储桶？](https://docs.aws.amazon.com/AmazonS3/latest/UG/UploadingObjectsintoAmazonS3.html)。

**重要**  
此时，该演练只需您花一点点时间； OpsWorks Stacks 服务本身是免费的。但是，您必须为使用的任何 AWS 资源 (如 Amazon S3 存储) 付费。一旦您上传存档，就会开始产生费用。有关更多信息，请参阅 [AWS 定价](https://aws.amazon.com/pricing/)。

**为堆栈启用自定义说明书**

1. 在 OpsWorks 堆**栈控制台中，选择导航窗格中的堆栈**，然后选择右上角的**堆栈设置**。

1. 在 **Settings** 页的右上角，选择 **Edit**。

1. 在 **Settings** 页面上，将 **Use custom Chef cookbooks** 设置为 **Yes**，然后输入以下信息：
   + 存储库类型：**S3 存档**。
   + 存储库 URL：您之前记录的说明书存档文件的 S3 URL。

1. 选择 **Save (保存)** 以更新堆栈配置。

OpsWorks Stacks 会在所有新实例上安装您的自定义食谱。请注意， OpsWorks Stacks 不会自动在联机实例上安装或更新自定义说明书。您可手动执行此操作，如下文所述。