本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
在 Linux 实例上使用外部说明书:Berkshelf
重要
该 AWS OpsWorks Stacks 服务于 2024 年 5 月 26 日终止,新客户和现有客户均已禁用。我们强烈建议客户尽快将其工作负载迁移到其他解决方案。如果您对迁移有疑问,请通过 re AWS : Post 或通过 Pre
注意
Berkshelf 仅适用于 Chef 11.10 Linux 堆栈。
在开始实施说明书之前,请查看 Chef 社区说明书
要在实例上使用外部说明书,您需要通过某种方式来安装说明书和管理任何依赖项。首选方法是实施支持名为 Berkshelf 的依存关系管理器的说明书。Berkshelf 适用于亚马逊EC2实例,包括 AWS OpsWorks Stacks 实例,但它也专为与 Test Kitchen 和 Vagrant 配合使用而设计。但是,Vagrant上的用法与 AWS OpsWorks Stacks的用法略有不同,因此本主题包括两个平台的示例。有关如何使用 Berkshelf 的更多信息,请参阅 Berkshelf
将 Berkshelf 用于 Test Kitchen 和 Vagrant
此示例演示如何使用 Berkshelf 安装入门社区说明书并执行其配方,这将在实例的主目录中安装简短文本文件。
安装 Berkshelf 并初始化说明书
-
在工作站上,按照如下所示安装 Berkshelf gem。
gem install berkshelf
根据您的工作站,可能需要使用此命令
sudo
,或者您也可以使用 Ruby 环境管理器,例如RVM。要验证 Berkshelf 是否已安装成功,请运行 berks --version
。 -
此主题的说明书名为 external_cookbook。您可使用 Berkshelf 创建已初始化的说明书而不是之前的主题采用的手动方法。为此,请导航到
opsworks_cookbooks
目录并运行以下命令。berks cookbook external_cookbook
此命令将创建
external_cookbook
目录和多个标准 Chef 和 Test Kitchen 子目录,包括recipes
和test
。此命令还将创建大量标准文件的默认版本,包括:-
metadata.rb
-
Vagrant、Test Kitchen 和 Berkshelf 的配置文件
-
default.rb
目录中的空recipes
配方
注意
您无需运行
kitchen init
;berks cookbook
命令将处理这些任务。 -
-
运行
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 保持一致,此示例使用了第一种方法。
安装入门说明书
-
编辑默认 Berksfile 以将
metadata
声明替换为cookbook
的getting-started
声明。内容应与以下内容类似。source "https://supermarket.chef.io" cookbook 'getting-started'
-
运行
berks install
以从社区说明书存储库中将入门说明书下载到您的工作站的 Berkshelf 目录 (通常为~/.berkshelf
)。此目录通常称为 Berkshelf。在 Berkshelf 的cookbooks
目录中查找,您应看到入门说明书的目录,其名称类似于getting-started-0.4.0
。 -
将
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:
-
运行
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。 -
运行
kitchen destroy
以关闭实例。下一个示例使用 AWS OpsWorks 堆栈实例。
将 Berkshelf 与堆栈一起使用 AWS OpsWorks
AWS OpsWorks Stacks 可以选择支持 Berkshelf for Chef 11.10 堆栈。要将 Berkshelf 用于您的堆栈,您必须执行下列操作。
-
为堆栈启用 Berkshelf。
AWS OpsWorks 然后,堆栈会处理在堆栈实例上安装 Berkshelf 的细节。
-
将 Berksfile 添加到您的说明书存储库的根目录。
Berksfile 应包含所有依赖说明书的
source
和cookbook
声明。
当 AWS OpsWorks Stacks 在实例上安装您的自定义食谱存储库时,它会使用 Berkshelf 来安装存储库的 Berksfile 中声明的依赖食谱。有关更多信息,请参阅 使用 Berkshelf。
此示例说明如何使用 Berkshelf 在 Stacks 实例上安装入门社区食谱。 AWS OpsWorks 它还将安装某个版本的 createfile 自定义说明书,这将在指定目录中创建一个文件。有关 createfile 工作原理的更多信息,请参阅从说明书安装文件。
注意
如果这是你第一次在 Stac AWS OpsWorks ks 堆栈上安装自定义食谱,你应该先看一下这个例子。在 Linux 实例上运行配方
首先创建堆栈,如以下内容所汇总。有关更多信息,请参阅 创建新堆栈。
创建堆栈
-
打开 AWS OpsWorks Stacks 控制台
,然后单击 Add Stack (添加堆栈)。 -
指定以下设置,接受其他设置的默认值,然后单击 Add Stack。
-
姓名 — BerksTest
-
默认SSH密钥 — Amazon EC2 密钥对
如果您需要创建 Amazon EC2 密钥对,请参阅亚马逊EC2密钥对。请注意,key pair 必须与实例属于同一AWS区域。本示例使用了默认的美国西部(俄勒冈州)区域。
-
-
单击 Add a layer 并将采用以下设置的自定义层添加到堆栈。
-
姓名 — BerksTest
-
短名称 - berkstest
在此示例中,您实际上可使用任何层类型。但是,此示例不需要其他层安装的任何程序包,因此自定义层是最简单的方法。
-
-
使用默认设置向 BerksTest 图层@@ 添加全天候实例,但暂时不要启动。
使用 AWS OpsWorks Stacks,食谱必须位于具有标准目录结构的远程存储库中。然后,您将下载信息提供给 AWS OpsWorks Stacks,堆栈会在启动时自动将存储库下载到堆栈的每个实例。为简单起见,本示例的存储库是一个公共的 Amazon S3 档案,但是 AWS OpsWorks Stacks 还支持HTTP档案、Git 存储库和 Subversion 存储库。有关更多信息,请参阅 说明书存储库。
发送到 Amazon S3 存储桶的内容可能包含客户内容。有关删除敏感数据的更多信息,请参阅如何清空 S3 存储桶?或如何删除 S3 存储桶?。
创建说明书存储库
-
在您的
opsworks_cookbooks
目录中,创建名为berkstest_cookbooks
的目录。如果您愿意,可在任何方便位置创建此目录,因为您会将它上传到存储库。 -
将名为 Berksfile 的文件添加到具有下列内容的
berkstest_cookbooks
。source "https://supermarket.chef.io" cookbook 'getting-started'
此文件将声明入门说明书依赖项,并指示 Berkshelf 从社区说明书站点下载此依赖项。
-
将
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
目录复制到此目录。
-
-
创建
.zip
档案berkstest_cookbooks
,将档案上传到 Amazon S3 存储桶,公开该档案,然后记录该档案URL。
您现在可以安装说明书并运行配方。
安装说明书并运行配方
-
编辑堆栈以启用自定义说明书,然后指定以下设置。
-
存储库类型 -Http 存档
-
存储库 URL-您之前录制URL的食谱档案
-
管理 Berkshelf)- 是
前两个设置为 AWS OpsWorks Stacks 提供了将食谱存储库下载到您的实例所需的信息。最后一个设置启用 Berkshelf 支持,这会将入门说明书下载到实例。接受其他设置的默认值,然后单击 Save 更新堆栈配置。
-
-
编辑 BerksTest 图层,将以下配方添加到该图层的设置生命周期事件中。
-
getting-started::default
-
createfile::default
-
-
启动实例。Setup 事件在实例完成启动后发生。 AWS OpsWorks 然后,Stacks 安装食谱存储库,使用 Berkshelf 下载入门食谱,然后运行该层的设置和部署食谱,包括和。
getting-started::default
createfile::default
-
实例联机后,SSH使用登录。您应该看到以下内容
-
/srv/www/shared
应包含example_data.json
。 -
/root
应包含chef-getting-started.txt
。AWS OpsWorks Stacks 以 root 用户身份运行配方,因此入门会将文件安装在
/root
目录中,而不是您的主目录中。
-