

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

# 示例 1：安装软件包
<a name="cookbooks-101-basics-packages"></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 支持 团队联系。

软件包安装是配方的较常见用法之一，可能非常简单，具体取决于软件包。例如，以下配方会在 Linux 系统上安装 Git。

```
package 'git' do
  action :install
end
```

[`package` 资源](https://docs.chef.io/chef/resources.html#package)会处理软件包安装。对于本示例，您不需要指定任何属性。资源名称为 `package_name` 属性的默认值，可标识软件包。`install` 操作会指导提供程序安装软件包。您可以通过跳过 `install` 来简化代码；它是 `package` 资源的默认操作。当您运行配方时，Chef 会利用相应的提供程序来安装软件包。在将用于示例的 Ubuntu 系统上，提供程序会通过调用 `apt-get` 来安装 Git。

**注意**  
在 Windows 系统上安装软件的过程稍有不同。有关更多信息，请参阅 [安装 Windows 软件](cookbooks-101-opsworks-install-software.md)。

要使用 Test Kitchen 在 Vagrant 中运行此配方，首先需要设置说明书，并初始化和配置 Test Kitchen。以下内容针对的是 Linux 系统，但 Windows 和 Macintosh 系统的过程与此过程基本类似。首先打开终端窗口；本章中的所有示例均使用命令行工具。

**准备说明书**

1. 在您的主目录中，创建一个名为 `opsworks_cookbooks` 的子目录，其中将包含本章的所有说明书。然后，为该说明书创建一个名为 `installpkg` 的子目录，并导航到该子目录。

1. 在 `installpkg` 中，创建一个名为 `metadata.rb` 的文件，其中包含以下代码。

   ```
   name "installpkg"
   version "0.1.0"
   ```

   为简单起见，本章中的示例仅指定说明书名称和版本，但是 `metadata.rb` 可以包含各种说明书元数据。有关更多信息，请参阅[关于说明书元数据](http://docs.chef.io/cookbook_repo.html#about-cookbook-metadata)。
**注意**  
确保在初始化 Test Kitchen 之前创建 `metadata.rb`；它会使用相应数据创建默认配置文件。

1. 在 `installpkg` 中，运行 `kitchen init`，它会初始化 Test Kitchen 并安装默认的 Vagrant 驱动程序。

1. `kitchen init` 命令在 `installpkg` 中创建名为 `.kitchen.yml` 的 YAML 配置文件。在您常用的文本编辑器中打开 文件。`.kitchen.yml` 文件中包含 `platforms` 部分，该部分指定在哪些系统上运行配方。Test Kitchen 创建一个实例，并在每个平台上运行指定的配方。
**注意**  
默认情况下，Test Kitchen 每次在一个平台上运行配方。如果您将 `-p` 参数添加到创建实例的任何命令中，则 Test Kitchen 将在每个平台上并行运行配方。

   对于此示例，一个平台已足够，因此请编辑 `.kitchen.yml` 以删除 `centos-6.4` 平台。您的 `.kitchen.yml` 文件现在应如下所示：

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

   Test Kitchen 仅运行处于 `.kitchen.yml` 运行列表中的那些配方。您可以使用`[cookbook_name::recipe_name]`格式来识别食谱，其中*recipe\$1name*省略了`.rb`扩展名。最初，`.kitchen.yml` 运行列表中包含说明书的默认配方 `installpkg::default`。那是您要实施的配方，因此您不必修改运行列表。

1. 创建 `installpkg` 的子目录，该子目录名为 `recipes`。

   如果说明书中包含配方 (大部分均包含)，则这些配方一定位于 `recipes` 子目录中。

现在，您可以将配方添加到说明书中，并使用 Test Kitchen 在实例上运行它。

**运行配方**

1. 创建一个名为 `default.rb` 的文件 (其中包含本节开头的 Git 安装示例代码)，并将该文件保存到 `recipes` 子目录中。

1. 在 `installpkg` 目录中，运行 `kitchen converge`。该命令会在 Vagrant 中启动一个新的 Ubuntu 实例，将您的说明书复制到实例中，并开始运行 Chef，以执行 `.kitchen.yml` 运行列表中的配方。

1. 要验证配方是否已成功，请运行 `kitchen login`，这样可打开指向实例的 SSH 连接。然后运行 `git --version`，以验证是否已成功安装 Git。要返回到您的工作站，请运行 `exit`。

1. 完成后，运行 `kitchen destroy` 以关闭实例。下一个示例使用不同的说明书。

此示例是一个很好的入门方式，但它特别简单。其他软件包安装起来可能更复杂；您可能需要执行以下任意或所有操作：
+ 创建和配置一个用户。
+ 创建针对数据、日志等的一个或多个目录。
+ 安装一个或多个配置文件。
+ 为不同的操作系统指定不同的软件包名称或属性值。
+ 启动一项服务，然后根据需要重新启动它。

以下示例描述了如何解决这些问题，并介绍了其他一些有用的操作。