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

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

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

重要

这些区域有: AWS OpsWorks Stacks 该服务已于 2024 年 5 月 26 日终止,新客户和现有客户均已禁用。我们强烈建议客户尽快将其工作负载迁移到其他解决方案。如果您对迁移有疑问,请联系 AWS Support 团队开启 AWS re: post 或通过 AWS 高级支持

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

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

设置数据库

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

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

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

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

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

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

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

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

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

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

"/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、作者和消息字段。

将应用程序连接到数据库

第二个难题是应用程序,它需要数据库密码等连接信息来访问表。S implePHPApp 实际上只有一个工作文件,app.php而只是加载app.phpindex.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资源将安装 Compos er(PHP应用程序的依赖关系管理器)。然后将运行 Composer 的 install 命令将示例应用程序的依赖项安装到应用程序的根目录中。

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

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

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

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

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