在 Linux 实例上使用外部说明书:Berkshelf - AWS OpsWorks

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

在 Linux 实例上使用外部说明书:Berkshelf

重要

AWS OpsWorks Stacks 不再接受新客户。在 2024 年 5 月 26 日之前,现有客户将能够正常使用 OpsWorks 控制台、API、CLI 和 CloudFormation 资源,届时它们将停产。为准备此过渡,我们建议您尽快将堆栈过渡到AWS Systems Manager。有关更多信息,请参阅 AWS OpsWorks Stacks 生命周期终止常见问题解答将 AWS OpsWorks Stacks 应用程序迁移到 AWS Systems Manager Application Manager

注意

Berkshelf 仅适用于 Chef 11.10 Linux 堆栈。

在开始实施说明书之前,请查看 Chef 社区说明书,此类说明书包含 Chef 社区成员针对多种用途创建的说明书。许多说明书无需修改便可用于 AWS OpsWorks Stacks,因此您可在一些任务中利用它们,而不是自行实现所有代码。

要在实例上使用外部说明书,您需要通过某种方式来安装说明书和管理任何依赖项。首选方法是实施支持名为 Berkshelf 的依存关系管理器的说明书。Berkshelf 在 Amazon EC2 实例(包括 AWS OpsWorks Stacks 实例)上运行,而且设计为用于 Test Kitchen 和 Vagrant。但是,针对 Vagrant 的用法与针对 AWS OpsWorks Stacks 的用法略为不同,因此本主题包含适用于这两个平台的示例。有关如何使用 Berkshelf 的更多信息,请参阅 Berkshelf

将 Berkshelf 用于 Test Kitchen 和 Vagrant

此示例演示如何使用 Berkshelf 安装入门社区说明书并执行其配方,这将在实例的主目录中安装简短文本文件。

安装 Berkshelf 并初始化说明书
  1. 在工作站上,按照如下所示安装 Berkshelf gem。

    gem install berkshelf

    根据您的工作站,此命令可能需要 sudo,或者您也可以使用 Ruby 环境管理器 (如 RVM)。要验证 Berkshelf 是否已安装成功,请运行 berks --version

  2. 此主题的说明书名为 external_cookbook。您可使用 Berkshelf 创建已初始化的说明书而不是之前的主题采用的手动方法。为此,请导航到 opsworks_cookbooks 目录并运行以下命令。

    berks cookbook external_cookbook

    此命令将创建 external_cookbook 目录和多个标准 Chef 和 Test Kitchen 子目录,包括 recipestest。此命令还将创建大量标准文件的默认版本,包括:

    • metadata.rb

    • Vagrant、Test Kitchen 和 Berkshelf 的配置文件

    • default.rb 目录中的空 recipes 配方

    注意

    您无需运行 kitchen initberks cookbook 命令将处理这些任务。

  3. 运行 kitchen converge。新创建的说明书此时不执行任何相关操作,而是执行聚合操作。

注意

您还可使用 berks init 初始化现有说明书以使用 Berkshelf。

要使用 Berkshelf 管理说明书的外部依赖项,说明书的根目录必须包含 Berksfile (它是一个指定 Berkshelf 应如何管理依赖项的配置文件)。如果您使用 berks cookbook 创建 external_cookbook 说明书,则将使用下列内容创建一个 Berksfile

source "https://supermarket.chef.io" metadata

此文件具有以下声明:

  • source-说明书源的 URL。

    一个 Berksfile 可以包含任意数量的 source 声明,每个声明指定依赖说明书的默认源。如果您没有显式指定说明书的源,则 Berkshelf 将在默认存储库中查找同名说明书。默认 Berksfile 包含一个指定社区说明书存储库的 source 属性。该存储库包含入门说明书,因此您可将此行保持不变。

  • metadata-指示 Berkshelf 包含说明书的 metadata.rb 文件中声明的说明书依赖项。

    您也可通过包含 cookbook 属性来在 Berksfile 中声明依赖说明书,如下文所述。

可通过两种方法声明说明书依赖项:

  • 在 Berksfile 中包括 cookbook 声明。

    这是 AWS OpsWorks Stacks 使用的方法。例如,要指定此示例中使用的入门说明书,请在 Berksfile 中包含 cookbook "getting-started"。随后,Berkshelf 将在默认存储库中查找带此名称的说明书。您也可以使用 cookbook 显式指定说明书源,甚至指定特定版本。有关更多信息,请参阅 Berkshelf

  • 在 Berksfile 中包含 metadata 声明并在 metadata.rb 中声明依赖项。

    此声明指示 Berkshelf 包含 metadata.rb 中声明的说明书依赖项。例如,要声明入门依赖项,请将 depends 'getting-started' 声明添加到说明书的 metadata.rb 文件。

此示例使用第一种方法以便与 AWS OpsWorks Stacks 保持一致。

安装入门说明书
  1. 编辑默认 Berksfile 以将 metadata 声明替换为 cookbookgetting-started 声明。内容应与以下内容类似。

    source "https://supermarket.chef.io" cookbook 'getting-started'
  2. 运行 berks install 以从社区说明书存储库中将入门说明书下载到您的工作站的 Berkshelf 目录 (通常为 ~/.berkshelf)。此目录通常称为 Berkshelf。在 Berkshelf 的 cookbooks 目录中查找,您应看到入门说明书的目录,其名称类似于 getting-started-0.4.0

  3. external_cookbook::default 运行列表中的 .kitchen.yml 替换为 getting-started::default。此示例不运行来自 external_cookbook 的任何配方,它只是一种使用入门说明书的方式。现在 .kitchen.yml 文件应该呈现以下状态。

    --- driver: name: vagrant provisioner: name: chef_solo platforms: - name: ubuntu-12.04 suites: - name: default run_list: - recipe[getting-started::default] attributes:
  4. 运行 kitchen converge,然后使用 kitchen login 登录实例。登录目录应包含名为 chef-getting-started.txt 的文件,其中部分内容与以下内容类似:

    Welcome to Chef! This is Chef version 11.12.8. Running on ubuntu. Version 12.04.

    Test Kitchen 将在实例的 /tmp/kitchen/cookbooks 目录中安装说明书。如果您列出该目录的内容,则将看到两个说明书:external_cookbook 和 getting-started。

  5. 运行 kitchen destroy 以关闭实例。下一个示例使用 AWS OpsWorks Stacks 实例。

将 Berkshelf 用于 AWS OpsWorks Stacks

(可选) AWS OpsWorks Stacks 支持适用于 Chef 11.10 堆栈的 Berkshelf。要将 Berkshelf 用于您的堆栈,您必须执行下列操作。

  • 为堆栈启用 Berkshelf。

    随后,AWS OpsWorks Stacks 将处理在堆栈的实例上安装 Berkshelf 的详细信息。

  • 将 Berksfile 添加到您的说明书存储库的根目录。

    Berksfile 应包含所有依赖说明书的 sourcecookbook 声明。

当 AWS OpsWorks Stacks 将您的自定义说明书存储库安装在您的实例上时,它将使用 Berkshelf 安装在存储库的 Berksfile 中声明的依赖说明书。有关更多信息,请参阅 使用 Berkshelf

此示例演示如何使用 Berkshelf 在 AWS OpsWorks Stacks 实例上安装入门社区说明书。它还将安装某个版本的 createfile 自定义说明书,这将在指定目录中创建一个文件。有关 createfile 工作原理的更多信息,请参阅从说明书安装文件

注意

如果这是您首次在 AWS OpsWorks Stacks 堆栈上安装自定义说明书,应先完成在 Linux 实例上运行配方示例。

首先创建堆栈,如以下内容所汇总。有关更多信息,请参阅 创建新堆栈

创建堆栈
  1. 打开 AWS OpsWorks Stacks 控制台,然后单击 Add Stack (添加堆栈)

  2. 指定以下设置,接受其他设置的默认值,然后单击 Add Stack

    • 姓名 — BerksTest

    • 默认 SSH 密钥 - Amazon EC2 密钥对

    如果您需要创建 Amazon EC2 密钥对,请参阅 Amazon EC2 密钥对。请注意,该密钥对必须属于与实例相同的 Amazon Web Services Region。本示例使用了默认的美国西部(俄勒冈州)区域。

  3. 单击 Add a layer 并将采用以下设置的自定义层添加到堆栈。

    • 姓名 — BerksTest

    • 短名称 - berkstest

    在此示例中,您实际上可使用任何层类型。但是,此示例不需要其他层安装的任何程序包,因此自定义层是最简单的方法。

  4. 使用默认设置向 BerksTest 图层@@ 添加全天候实例,但暂时不要启动。

使用 AWS OpsWorks Stacks,说明书必须位于具有标准目录结构的远程存储库中。随后,您可将下载信息提供给 AWS OpsWorks Stacks,这会在启动时自动将存储库下载到每个堆栈实例。为简便起见,此示例的存储库是一个公有 Amazon S3 存档,但 Stacks 还支持 HTTP 存档、Git 存储库和 Subversion 存储库。有关更多信息,请参阅 说明书存储库

发送到 Amazon S3 存储桶的内容可能包含客户内容。有关删除敏感数据的更多信息,请参阅如何清空 S3 存储桶?如何删除 S3 存储桶?

创建说明书存储库
  1. 在您的 opsworks_cookbooks 目录中,创建名为 berkstest_cookbooks 的目录。如果您愿意,可在任何方便位置创建此目录,因为您会将它上传到存储库。

  2. 将名为 Berksfile 的文件添加到具有下列内容的 berkstest_cookbooks

    source "https://supermarket.chef.io" cookbook 'getting-started'

    此文件将声明入门说明书依赖项,并指示 Berkshelf 从社区说明书站点下载此依赖项。

  3. createfile 目录添加到包含以下内容的 berkstest_cookbooks 中。

    • 包含下列内容的 metadata.rb 文件。

      name "createfile" version "0.1.0"
    • 一个 files/default 目录,其中包含具有以下内容的 example_data.json 文件。

      { "my_name" : "myname", "your_name" : "yourname", "a_number" : 42, "a_boolean" : true }

      该文件的名称和内容是任意的。配方会将此文件复制到指定位置。

    • 一个 recipes 目录,其中包含具有以下配方代码的 default.rb 文件。

      directory "/srv/www/shared" do mode 0755 owner 'root' group 'root' recursive true action :create end cookbook_file "/srv/www/shared/example_data.json" do source "example_data.json" mode 0644 action :create_if_missing end

      此配方创建 /srv/www/shared 并将 example_data.json 从说明书的 files 目录复制到此目录。

  4. berkstest_cookbooks 创建 .zip 存档,将存档上传到 Amazon S3 存储桶公开存档并记录存档的 URL。

您现在可以安装说明书并运行配方。

安装说明书并运行配方
  1. 编辑堆栈以启用自定义说明书,然后指定以下设置。

    • 存储库类型 -Http 存档

    • 存储库 URL -您之前记录的说明书存档 URL

    • 管理 Berkshelf)- 是

    前两个设置为 AWS OpsWorks Stacks 提供将说明书存储库下载到实例所需的信息。最后一个设置启用 Berkshelf 支持,这会将入门说明书下载到实例。接受其他设置的默认值,然后单击 Save 更新堆栈配置。

  2. 编辑 BerksTest 图层,将以下配方添加到该图层的设置生命周期事件中。

    • getting-started::default

    • createfile::default

  3. 启动实例。设置事件在实例完成启动后发生。AWS OpsWorks随后,Stacks 将安装说明书存储库,使用 Berkshelf 下载入门说明书,然后运行层的设置和部署配方(包括 getting-started::defaultcreatefile::default)。

  4. 在实例处于联机状态后,使用 SSH 登录。您应该看到以下内容

    • /srv/www/shared 应包含 example_data.json

    • /root 应包含 chef-getting-started.txt

      AWS OpsWorks Stacks 会将配方作为根目录运行,因此入门说明书会将文件安装在 /root 目录而不是您的主目录中。