简短的题外话:食谱、食谱和堆栈属性 AWS OpsWorks - AWS OpsWorks

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

简短的题外话:食谱、食谱和堆栈属性 AWS OpsWorks

重要

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

现在,您拥有了应用程序和数据库服务器,但它们还未准备就绪,还不能使用。您仍然需要设置数据库并配置应用程序的连接设置。 AWS OpsWorks Stacks 不会自动处理这些任务,但它确实支持 Chef 食谱、食谱和动态属性。你可以实现两个配方,一个用于设置数据库,一个用于配置应用程序的连接设置,然后让 AWS OpsWorks Stacks 为你运行它们。

phpapp 说明书 (其中包含所需的配方) 已经实施并且准备就绪,可供使用;如果您愿意,您可以直接跳至 步骤 3.3:将自定义食谱添加到 MyStack。如果您想要了解更多信息,本部分提供了一些关于说明书和配方的背景知识,并介绍了配方的工作原理。要查看说明书,请转至 phpapp 说明书

配方和属性

Chef 配方基本上是一个专门的 Ruby 应用程序,可在实例上执行任务,例如安装程序包、创建配置文件、执行 shell 命令等。相关配方的组被组织成说明书,其中还包含配置文件创建模板等支持文件。

AWS OpsWorks Stacks 有一套支持内置图层的食谱。您也可以用自己的配方创建自定义说明书,以便在您的实例上执行自定义任务。本主题简要介绍配方,并展示如何使用配方来设置数据库并配置应用程序的连接设置。有关说明书和配方的更多信息,请参阅 说明书和诀窍自定义堆栈 AWS OpsWorks

配方通常依靠 Chef 属性来获得输入数据:

  • 其中一些属性由 Chef 定义并提供关于实例的基本信息,例如操作系统。

  • AWS OpsWorks 堆栈定义了一组属性,这些属性包含有关堆栈的信息(例如图层配置)和有关已部署应用程序的信息(例如应用程序存储库)。

    您可以通过向堆栈或部署分配自定义 JSON 的方法向该组添加自定义属性。

  • 您的说明书也可以定义特定于说明书的属性。

    attributes/default.rb 中定义了 phpapp 说明书属性。

有关 AWS OpsWorks 堆栈属性的完整列表,请参阅堆栈配置和部署属性:Linux和。内置说明书属性有关更多信息,请参阅 覆盖属性

属性按层次结构进行组织,可以表示为 JSON 对象。

您通过使用如下所示的 Chef 节点语法将此数据整合到应用程序中:

[:deploy][:simplephpapp][:database][:username]

deploy 节点具有单个应用程序节点 simplephpapp,该节点包含有关应用程序数据库、Git 存储库等内容的信息。本示例表示数据库用户名称的值,该值被解析为 root

设置数据库

MySQL 层的内置“设置”配方会自动为以应用程序的短名称命名的应用程序创建数据库,因此本示例中已经有一个名为 simplephpapp 的数据库。但是,您需要通过为应用程序创建表来存储其数据,以完成设置。你可以手动创建表,但更好的方法是实现自定义配方来处理任务,然后让 AWS OpsWorks Stacks 为你运行它。本部分介绍了如何实施 dbsetup.rb 配方。稍后将介绍让 AWS OpsWorks Stacks 运行配方的过程。

要查看存储库中的配方,请转至 dbsetup.rb。以下示例显示了 dbsetup.rb 代码。

execute 是执行指定命令的 Chef 资源。在本例中,它是一个用于创建表的 MySQL 命令。not_if 指令可确保如果指定表已经存在,则不会运行此命令。有关 Chef 资源的更多信息,请参阅关于资源和提供程序

配方使用之前讨论的节点语法将属性值插入命令字符串中。例如,以下会插入数据库的用户名称。

#{deploy[:database][:username]}

让我们对这个有些神秘的代码进行解压缩:

  • 对于每个迭代,将 deploy 设置为当前应用程序节点,因此它会解析为 [:deploy][:app_name]。在本示例中,它会解析为 [:deploy][:simplephpapp]

  • 使用之前所示的部署属性值,整个节点将解析为 root

  • 在 #{ } 中封装该节点,以将其插入到字符串中。

其他大多数节点都以类似方式进行解析。但 #{node[:phpapp][:dbtable]} 例外,它由自定义说明书的属性文件定义,并解析为表名称 urler。因此在 MySQL 实例上运行的实际命令是:

"/usr/bin/mysql -uroot -pvjud1hw5v8 simplephpapp -e'CREATE TABLE urler( id INT UNSIGNED NOT NULL AUTO_INCREMENT, author VARCHAR(63) NOT NULL, message TEXT, PRIMARY KEY (id))' "

此命令使用部署属性中的凭证和数据库名称来创建一个名为 urler 的表,其中包含 ID、作者和消息字段。

将应用程序连接到数据库

第二个难题是应用程序,它需要数据库密码等连接信息来访问表。SimplePHPApp 实际上只有一个工作文件 app.phpindex.php 所做的工作只是加载 app.php

app.php 包含 db-connect.php,该文件可处理数据库连接,但它不在存储库中。您无法提前创建 db-connect.php,因为它根据特定实例来定义数据库。而是由 appsetup.rb 配方使用部署属性中的连接数据来生成 db-connect.php

要查看存储库中的配方,请转至 appsetup.rb。以下示例显示了 appsetup.rb 代码。

dbsetup.rb 一样,appsetup.rb 会迭代 deploy 节点中的应用程序,simplephpapp 也同样。它运行包含 script 资源和 template 资源的代码块。

script 资源会安装 Composer,它是 PHP 应用程序的依存关系管理器。然后将运行 Composer 的 install 命令将示例应用程序的依赖项安装到应用程序的根目录中。

template 资源生成 db-connect.php 并将其放到 /srv/www/simplephpapp/current 中。请注意以下几点:

  • 配方使用条件语句来指定文件所有者,这取决于实例的操作系统。

  • 只有当指定目录存在时,only_if 指令才会指示 Chef 生成模板。

template 资源可对其内容和结构与关联文件基本相同、但包含各种数据值占位符的模板执行操作。source 参数指定模板 db-connect.php.erb,该模板在 phpapp 说明书的 templates/default 目录中,其中包含以下内容:

当 Chef 处理该模板时,它会用模板资源中相应变量的值替换 <%= => 占位符,这些变量值又从部署属性中提取。因此,生成的文件将是: