为 Chef 11.10 堆栈实施配方 - AWS OpsWorks

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

为 Chef 11.10 堆栈实施配方

重要

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

相对于 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 食谱后,它会按以下顺序将它们合并到公共目录中:

  1. 内置说明书。

  2. Berkshelf 说明书 (如果有)。

  3. 自定义说明书 (如果有)。

当 AWS OpsWorks Stacks 执行此合并时,它会复制目录的全部内容,包括配方。如果有重复项,则将依照以下规则处理:

  • Berkshelf 说明书的内容优先于内置说明书。

  • 自定义说明书的内容优先于 Berkshelf 说明书。

为了说明此过程的原理,请想一想以下场景,其中所有这三个说明书目标都包括名为 mycookbook 的说明书:

  • 内置说明书:mycookbook 包括一个名为 someattributes.rb 的属性文件、一个名为 sometemplate.erb 的模板文件以及一个名为 somerecipe.rb 的配方。

  • Berkshelf 说明书:mycookbook 包括 sometemplate.erbsomerecipe.rb

  • 自定义说明书:mycookbook 包括 somerecipe.rb

合并的说明书包含以下内容:

  • 内置说明书中的 someattributes.rb

  • Berkshelf 说明书中的 sometemplate.erb

  • 自定义说明书的 somerecipe.rb

重要

您不应当通过将整个内置说明书复制到您的存储库,然后修改该说明书的部分内容来自定义您的 Chef 11.10 堆栈。这样做会覆盖整个内置说明书,包括配方。如果 AWS OpsWorks Stacks 更新了该食谱,则除非您手动更新私有副本,否则您的堆栈将无法从这些更新中受益。有关如何自定义堆栈的更多信息,请参阅自定义堆栈 AWS OpsWorks

您可以在您的配方中使用 Chef search 方法来查询堆栈数据。你使用与 Chef 服务器相同的语法,但是 AWS OpsWorks Stacks 从本地节点对象获取数据,而不是查询 Chef 服务器。这些数据包括:

  • 实例的堆栈配置和部署属性

  • 实例的内置和自定义说明书的属性文件中的属性。

  • 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 方法来查询数据包中的信息。您使用与将为 Chef 服务器使用的语法相同的语法,但 AWS OpsWorks Stacks 从实例的堆栈配置和部署属性中获取数据。但是, AWS OpsWorks Stacks 目前不支持 Chef 环境,因此请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,您可以直接从其存储库安装与 AWS OpsWorks Stacks 兼容的社区食谱,而不必将它们复制到您的自定义食谱存储库中。哪个版本的 Berkshelf 受支持,取决于操作系统。有关更多信息,请参阅 AWS OpsWorks 堆栈操作系统

要使用 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 说明书和您的自定义说明书。