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

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

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

重要

该 AWS OpsWorks Stacks 服务于 2024 年 5 月 26 日终止,新客户和现有客户均已禁用。我们强烈建议客户尽快将其工作负载迁移到其他解决方案。如果您对迁移有疑问,请通过 re AWS : Post 或通过 Pre mium Su AWS pp ort 与 AWS Support 团队联系。

注意

Berkshelf 仅适用于 Chef 11.10 Linux 堆栈。

在开始实施说明书之前,请查看 Chef 社区说明书,此类说明书包含 Chef 社区成员针对多种用途创建的说明书。这些食谱中有许多无需修改即可与 AWS OpsWorks Stacks 一起使用,因此您可以利用它们来完成某些任务,而不必自己实现所有代码。

要在实例上使用外部说明书,您需要通过某种方式来安装说明书和管理任何依赖项。首选方法是实施支持名为 Berkshelf 的依存关系管理器的说明书。Berkshelf 适用于亚马逊 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 堆栈实例。

将 Berkshelf 与堆栈一起使用 AWS OpsWorks

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

  • 为堆栈启用 Berkshelf。

    AWS OpsWorks 然后,堆栈会处理在堆栈实例上安装 Berkshelf 的细节。

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

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

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

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

注意

如果这是你第一次在 Stac AWS OpsWorks ks 堆栈上安装自定义食谱,你应该先看一下这个例子。在 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 档案,但是 AWS OpsWorks 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. 启动实例。Setup 事件在实例完成启动后发生。 AWS OpsWorks 然后,Stacks 安装食谱存储库,使用 Berkshelf 下载入门食谱,然后运行该层的设置和部署食谱,包括和。getting-started::default createfile::default

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

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

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

      AWS OpsWorks Stacks 以 root 用户身份运行配方,因此入门会将文件安装在/root目录中,而不是您的主目录中。