本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
为 Chef 11.10 堆栈实施配方
重要
该 AWS OpsWorks Stacks 服务于 2024 年 5 月 26 日终止,新客户和现有客户均已禁用。我们强烈建议客户尽快将其工作负载迁移到其他解决方案。如果您对迁移有疑问,请通过 re AWS : Post 或通过 Pre
相对于 Chef 11.4 堆栈,Chef 11.10 堆栈提供以下优势:
-
Chef 运行使用 Ruby 2.0.0,所以您的配方可以使用新的 Ruby 语法。
-
配方可以使用 Chef 搜索和数据包。
Chef 11.10 堆栈可以使用许多社区说明书,而无需修改。
-
您可以使用 Berkshelf 管理说明书。
Berkshelf 提供了一个更灵活的方法来管理您的自定义说明书,以及在堆栈中使用社区说明书。
-
说明书必须在
metadata.rb
中宣布依赖项。如果您的说明书依赖另一个说明书,则您必须在您说明书的
metadata.rb
文件中包括该依赖项。例如,如果您的说明书包括含有类似于include_recipe anothercookbook::somerecipe
的语句的配方,则您说明书的metadata.rb
文件必须包括以下行:depends "anothercookbook"
。 -
AWS OpsWorks 只有当堆栈包含 “我的SQL层” 时,Stacks 才会在堆栈的实例上安装 “我的SQL客户端”。
-
AWS OpsWorks 只有当堆栈包含 Ganglia 层时,Stacks 才会在堆栈的实例上安装 Ganglia 客户端。
-
如果部署运行
bundle install
,并且安装失败,则部署也会失败。
重要
请勿为自定义或社区说明书重复使用内置说明书名称。与内置说明书具有相同名称的自定义说明书可能会失败。有关 Chef 11.10、11.4 和 0.9 堆栈中可用的内置食谱的完整列表,请参阅 opsworks-cookbooks 存储库。 GitHub
在 Chef 0.9 和 11.4 堆栈上成功运行的带有非ASCII角色的食谱在 Chef 11.10 堆栈上可能会失败。原因在于,Chef 11.10 堆栈为 Chef 运行使用 Ruby 2.0.0,这在编码上要比 Ruby 1.8.7 严格得多。为了确保此类食谱在Chef 11.10堆栈上成功运行,每个使用非ASCII字符的文件顶部都应有一个注释,以提供有关编码的提示。例如,对于 UTF -8 编码,注释将是。#
encoding: UTF-8
有关 Ruby 2.0.0 编码的更多信息,请参阅 Encoding
说明书安装和优先顺序
Chef 11.10 AWS OpsWorks 堆栈的安装 Stacks 食谱的过程与早期的 Chef 版本略有不同。对于 Chef 11.10 堆栈,在 AWS OpsWorks Stacks 安装内置、自定义和 Berkshelf 食谱后,它会按以下顺序将它们合并到公共目录中:
-
内置说明书。
-
Berkshelf 说明书 (如果有)。
-
自定义说明书 (如果有)。
当 AWS OpsWorks Stacks 执行此合并时,它会复制目录的全部内容,包括配方。如果有重复项,则将依照以下规则处理:
-
Berkshelf 说明书的内容优先于内置说明书。
-
自定义说明书的内容优先于 Berkshelf 说明书。
为了说明此过程的原理,请想一想以下场景,其中所有这三个说明书目标都包括名为 mycookbook
的说明书:
-
内置说明书:
mycookbook
包括一个名为someattributes.rb
的属性文件、一个名为sometemplate.erb
的模板文件以及一个名为somerecipe.rb
的配方。 -
Berkshelf 说明书:
mycookbook
包括sometemplate.erb
和somerecipe.rb
。 -
自定义说明书:
mycookbook
包括somerecipe.rb
。
合并的说明书包含以下内容:
-
内置说明书中的
someattributes.rb
。 -
Berkshelf 说明书中的
sometemplate.erb
。 -
自定义说明书的
somerecipe.rb
。
重要
您不应当通过将整个内置说明书复制到您的存储库,然后修改该说明书的部分内容来自定义您的 Chef 11.10 堆栈。这样做会覆盖整个内置说明书,包括配方。如果 AWS OpsWorks Stacks 更新了该食谱,则除非您手动更新私有副本,否则您的堆栈将无法从这些更新中受益。有关如何自定义堆栈的更多信息,请参阅自定义堆栈 AWS OpsWorks。
使用 Chef 搜索
您可以在您的配方中使用 Chef search
方法
-
实例的堆栈配置和部署属性。
-
实例的内置和自定义说明书的属性文件中的属性。
-
Ohai 收集的系统数据。
堆栈配置和部署属性包含配方通常通过搜索获得的大部分信息,包括堆栈中每个在线实例的主机名和 IP 地址等数据。 AWS OpsWorks 堆栈会为每个生命周期事件更新这些属性,从而确保它们准确反映当前堆栈状态。这意味着,您可以经常在您的堆栈中使用与搜索相关的社区配方,而无需修改。搜索方法仍返回适当的数据;但这些数据来自堆栈配置和部署属性,而不是服务器。
AWS OpsWorks Stacks 搜索的主要局限性在于,它只能处理本地节点对象中的数据,尤其是堆栈配置和部署属性。因此,可能无法通过搜索获得以下类型的数据:
-
其他实例上本地定义的属性。
如果配方在本地定义了属性,则该信息不会报告给 AWS OpsWorks Stacks 服务,因此您无法使用搜索从其他实例访问该数据。
-
自定义
deploy
属性。您可以在部署应用程序JSON时指定自定义,相应的属性将安装在该部署的堆栈实例上。但是,如果您仅部署到所选的实例上,则将仅在这些实例上安装属性。在所有其他实例上,对这些自定义JSON属性的查询都将失败。此外,自定义属性JSON仅包含在该特定部署的堆栈配置和部署中。只有当下一个生命周期事件安装了一组新的堆栈配置和部署属性后,才能访问这些属性。请注意,如果您JSON为堆栈指定自定义,则每个生命周期事件的属性都会安装在每个实例上,并且始终可以通过搜索进行访问。
-
其他实例中的 Ohai 数据。
Chef 的 Ohai 工具
获取实例上的各种系统数据,然后将这些数据添加到节点对象中。这些数据存储在本地,并且不会反馈给 AWS OpsWorks Stacks 服务,因此搜索无法从其他实例中访问 Ohai 数据。但是,堆栈配置和部署属性中可能包含其中一些数据。 -
离线实例。
堆栈配置和部署属性仅包含联机实例的数据。
以下配方摘录显示了如何使用搜索来获取PHP图层实例的私有 IP 地址。
appserver = search(:node, "role:php-app").first Chef::Log.info("The private IP is '#{appserver[:private_ip]}'")
注意
当 AWS OpsWorks Stacks 向节点对象添加堆栈配置和部署属性时,它实际上会创建两组图层属性,每组属性都具有相同的数据。一个集合位于layers
命名空间中,这就是 AWS OpsWorks Stacks 存储数据的方式。另一组属性位于 role
命名空间中,用于定义 Chef 服务器存储等效数据的方式。role
命名空间的目的是允许为 Chef 服务器实现的搜索代码在 AWS OpsWorks Stacks 实例上运行。如果您正在专门为 AWS OpsWorks Stacks 编写代码,则可以在前面的示例role:php-app
中使用layers:php-app
或并search
返回相同的结果。
使用数据包
您可以在您的配方中使用 Chef data_bag_item
方法node.chef_environment
务必返回_default
。
您可以使用 custom JSON 向属性添加一个或多个属性来创建数据袋。[:opsworks][:data_bags]
以下示例显示了在 custom 中创建数据袋的一般格式JSON。
注意
您不能通过将数据包添加到您的说明书存储库中来创建数据包。您必须使用自定义JSON。
{ "opsworks": { "data_bags": { "bag_name1": { "item_name1: { "key1" : “value1”, "key2" : “value2”, ... } }, "bag_name2": { "item_name1": { "key1" : “value1”, "key2" : “value2”, ... } }, ... } } }
您通常JSON为堆栈指定 cu stom,它会在每个后续生命周期事件的每个实例上安装自定义属性。您也可以在部署应用程序JSON时指定自定义,但这些属性仅针对该部署安装,并且可能仅安装到一组选定的实例中。有关更多信息,请参阅 部署应用程序。
以下自定义JSON示例创建名为的数据包myapp
。它包含一个项目 mysql
以及两个密钥值对。
{ "opsworks": { "data_bags": { "myapp": { "mysql": { "username": "default-user", "password": "default-pass" } } } } }
要使用您的配方中的数据,您可以调用 data_bag_item
并向其传递数据包和值名称,如以下摘录所示。
mything = data_bag_item("myapp", "mysql") Chef::Log.info("The username is '#{mything['username']}' ")
要修改数据包中的数据,只需修改自定义JSON,它就会安装在堆栈的实例上,以备下一个生命周期事件使用。
使用 Berkshelf
对于 Chef 0.9 和 Chef 11.4 堆栈,您仅可以安装一个自定义说明书存储库。对于 Chef 11.10 堆栈,您可以使用 Berkshelf
要使用 Berkshelf,您必须明确启用它,如安装自定义说明书中所述。然后,将一个 Berksfile
文件放入您的说明书存储库的根目录 (指明要安装哪些说明书)。
要在 Berksfile 中指定外部食谱来源,请在文件顶部添加一个用于指定默认存储库的 source 属性。URLURLs除非您明确指定存储库,否则 Berkshelf 将在源代码中查找食谱。然后为您希望安装的每个说明书添加一行,格式如下:
cookbook '
cookbook_name
', ['>=
cookbook_version
'], [cookbook_options
]
cookbook
后面的字段指定特定的说明书。
-
cookbook_name
—(必需)指定食谱的名称。如果您不包含任何其他字段,Berkshelf 会安装来自指定来源的食谱。URLs
-
cookbook_version
—(可选)指定一个或多个食谱版本。您可以使用诸如
=
或>=
等前缀指定特定版本或一系列可接受的版本。如果您不指定版本,则 Berkshelf 将安装最新的版本。 -
cookbook_options
—(可选)最后一个字段是一个哈希,其中包含一个或多个键值对,用于指定存储库位置等选项。例如,您可以添加一个
git
密钥来指定特定的 Git 存储库,添加一个tag
密钥来指定特定的存储库分支。指定存储库分支通常是确保安装您的首选说明书的最佳方式。
重要
切勿通过以下方式宣布说明书:在您的 Berksfile 中添加 metadata
行,并在 metadata.rb
中宣布说明书依赖项。为了能够正确执行这一操作,这两个文件必须位于同一目录中。对于 AWS OpsWorks Stacks,Berksfile 必须位于存储库的根目录中,但metadata.rb
文件必须位于各自的食谱目录中。您应当在 Berksfile 中明确宣布外部说明书。
下面是 Berksfile 的一个示例,介绍了指定说明书的不同方法。有关如何创建 Berksfile 的更多信息,请参阅 Berkshelf
source "https://supermarket.chef.io" cookbook 'apt' cookbook 'bluepill', '>= 2.3.1' cookbook 'ark', git: 'git://github.com/opscode-cookbooks/ark.git' cookbook 'build-essential', '>= 1.4.2', git: 'git://github.com/opscode-cookbooks/build-essential.git', tag: 'v1.4.2'
此文件安装以下说明书:
-
社区说明书存储库中最新版本的
apt
。 -
社区说明书中最新版本的
bluepill
,但前提是它是 2.3.1 版本或更高版本。 -
指定存储库中最新版本的
ark
。此示例URL适用于开启的公共社区食谱存储库 GitHub,但您可以安装其他存储库(包括私有存储库)中的食谱。有关更多信息,请参阅 Berkshelf
。 -
指定存储库的 v1.4.2 分支中的
build-essential
说明书。
除了 Berksfile,自定义说明书存储库还可以包含自定义说明书。在这种情况下, AWS OpsWorks Stacks 会安装两套食谱,这意味着一个实例可以有多达三个食谱存储库。
-
内置说明书安装到
/opt/aws/opsworks/current/cookbooks
中。 -
如果您的自定义说明书存储库包含说明书,则它们将安装到
/opt/aws/opsworks/current/site-cookbooks
中。 -
如果您已启用了 Berkshelf,并且您的自定义说明书存储库包含 Berksfile,则指定说明书将安装到
/opt/aws/opsworks/current/berkshelf-cookbooks
中。
在安装过程中,内置食谱和您的自定义食谱会安装在每个实例上,除非您手动运行 “更新自定义食谱” 堆栈命令,否则不会随后进行更新。 AWS OpsWorks Stacks 在berks install
每次 Chef 运行时都会运行,因此您的 Berkshelf 食谱会根据以下规则针对每个生命周期事件进行更新:
-
如果存储库中有新的说明书版本,则此操作将从存储库更新说明书。
-
否则,此操作将从本地缓存更新 Berkshelf 说明书。
注意
此操作将覆盖 Berkshelf 说明书,因此,如果您修改了任何说明书的本地副本,则所做的更改将被覆盖。有关更多信息,请参阅 Berkshelf
您还可以通过以下方法更新您的 Berkshelf 说明书:运行 Update Custom Cookbooks 堆栈命令,这会同时更新 Berkshelf 说明书和您的自定义说明书。