在 Vagrant 上模拟堆栈配置和部署属性 - AWS OpsWorks

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

在 Vagrant 上模拟堆栈配置和部署属性

重要

AWS OpsWorks Stacks 不再接受新客户。在 2024 年 5 月 26 日之前,现有客户将能够正常使用 OpsWorks 控制台、API、CLI 和 CloudFormation 资源,届时它们将停产。为准备此过渡,我们建议您尽快将堆栈过渡到AWS Systems Manager。有关更多信息,请参阅 AWS OpsWorks Stacks 生命周期终止常见问题解答将 AWS OpsWorks Stacks 应用程序迁移到 AWS Systems Manager Application Manager

注意

本主题仅适用于 Linux 实例。Test Kitchen 尚不支持 Windows,因此您将在 AWS OpsWorks Stacks 实例上运行所有 Windows 示例。

AWS OpsWorks Stacks 会针对每个生命周期事件向您的堆栈中每个实例的节点对象添加堆栈配置和部署属性。这些属性可提供堆栈配置 (包括每个层及其联机实例的配置、每个已部署的应用程序的配置等) 的快照。由于这些属性位于节点对象中,因此任何配方都可以访问它们;AWS OpsWorks Stacks 实例的大多数配方都使用这些属性中的一个或多个。

Vagrant 盒子中运行的实例不由 AWS OpsWorks Stacks 管理,因此,在默认情况下,该实例的节点对象不包含任何堆栈配置和部署属性。但是,您可以向 Test Kitchen 环境添加一组合适的属性。Test Kitchen 随后会将这些属性添加到实例的节点对象,您的配方可以访问这些属性,这与它们在 AWS OpsWorks Stacks 实例上的行为非常相似。

本主题介绍如何获取合适的堆栈配置和部署属性的一个副本,在实例上设置这些属性,然后访问它们。

注意

如果您使用 Test Kitchen 来对您的配方运行测试,fauxhai 将提供一种替代方法来模拟堆栈配置和部署 JSON。

设置说明书
  1. 创建 opsworks_cookbooks 的名为 printjson 的子目录并导航到该子目录。

  2. 按照示例 1:安装软件包中所述初始化并配置 Test Kitchen。

  3. 将两个子目录添加到 printjsonrecipesenvironments

您可以通过向具有合适的定义的说明书添加属性文件来模拟堆栈配置和部署属性,但更好的方法是使用 Test Kitchen 环境。有两种基本方法:

  • 将属性定义添加到 .kitchen.yml

    如果您只有几个属性,那么这种方法最有用。有关更多信息,请参阅 kitchen.yml

  • 在一个环境文件中定义属性并在 .kitchen.yml 中引用该文件。

    此方法通常更适合堆栈配置和部署属性,因为环境文件已经采用 JSON 格式。您可以从合适的 AWS OpsWorks Stacks 实例中获取 JSON 格式的属性的副本,然后直接粘贴它。所有示例都使用一个环境文件。

为您的说明书创建堆栈配置和部署属性的最简单的方法是创建一个已适当配置的堆栈并从作为 JSON 的实例复制生成的属性。要保持您的 Test Kitchen 环境文件的可管理性,您可以随后编辑该 JSON,使其仅具有您的配方需要的属性。本章中的示例基于Chef 11 Linux 堆栈入门中的堆栈,该堆栈是一个简单的 PHP 应用程序服务器堆栈,包含一个负载均衡器、多个 PHP 应用程序服务器和一台 MySQL 数据库服务器。

创建堆栈配置和部署 JSON
  1. 按照 MyStack 中所述进行创建Chef 11 Linux 堆栈入门,包括部署 SimplephPapp。如果您愿意,可以省略 第 4 步:横向扩展 MyStack 中需要的第二个 PHP App Server 实例;这些示例不会使用这些属性。

  2. 如果您尚未执行此操作,请启动 php-app1 实例,然后使用 SSH 登录

  3. 在终端窗口中,运行以下代理 cli 命令:

    sudo opsworks-agent-cli get_json

    此命令会将实例的最新堆栈配置和部署属性以 JSON 格式输出到终端窗口。

  4. 将 JSON 复制到 .json 文件并将其保存到您工作站中方便的位置。具体细节取决于您的 SSH 客户端。例如,如果您在 Windows 上使用了 PuTTY,则可以运行 Copy All to Clipboard 命令,这会将终端窗口中的所有文本复制到 Windows 剪贴板。之后,您可以将内容粘贴到 .json 文件并编辑该文件以删除无关的文本。

  5. 根据需要编辑 MyStack JSON。堆栈配置和部署属性有很多,说明书通常仅使用其中的一小部分。为了保持您的环境文件的可管理性,您可以对 JSON 进行编辑,使其保留原来的结构但仅包含您的说明书实际使用的属性。

    此示例使用经过大量编辑的 MyStack JSON 版本,其中仅包含两个['opsworks']['stack']属性,['id]['name']。创建 MyStack JSON 的编辑版本,如下所示:

    { "opsworks": { "stack": { "name": "MyStack", "id": "42dfd151-6766-4f1c-9940-ba79e5220b58", }, }, }

要让此 JSON 进入实例的节点对象,您需要将其添加到 Test Kitchen 环境。

将堆栈配置和部署属性添加到 Test Kitchen 环境
  1. 创建一个包含以下内容的名为 test.json 的环境文件并将该文件保存到说明书的 environments 文件夹。

    { "default_attributes": { "opsworks" : { "stack" : { "name" : "MyStack", "id" : "42dfd151-6766-4f1c-9940-ba79e5220b58" } } }, "chef_type" : "environment", "json_class" : "Chef::Environment" }

    环境文件具有以下元素:

    • default_attributes- JSON 格式的默认属性。

      这些属性被添加到具有 default 属性类型的节点对象,该属性类型是所有堆栈配置和部署 JSON 属性使用的类型。本示例使用前面显示的堆栈配置和部署 JSON 的已编辑版本。

    • chef_type-将此元素设置为 environment

    • json_class-将此元素设置为 Chef::Environment

  2. 编辑 .kitchen.yml 以定义 Test Kitchen 环境,如下所示。

    --- driver: name: vagrant provisioner: name: chef_solo environments_path: ./environments platforms: - name: ubuntu-12.04 suites: - name: printjson provisioner: solo_rb: environment: test run_list: - recipe[printjson::default] attributes:

    将以下元素添加到 kitchen init 创建的默认 .kitchen.yml 来定义环境。

    provisioner

    添加以下元素。

    • name-将此元素设置为 chef_solo

      要更准确地复制 AWS OpsWorks Stacks 环境,您可以使用 Chef 客户端本地模式代替 Chef solo。本地模式是一个 Chef 客户端选项,该选项使用在实例上本地运行的轻量级版本的 Chef 服务器 (Chef Zero) 替代远程服务器。它使您的配方能够在不连接到远程服务器的情况下使用 Chef 服务器功能 (如搜索或数据包)。

    • environments_path-包含环境文件的说明书子目录,本示例中为 ./environments

    suites:provisioner

    加上 environment 元素设置为环境文件名称的 solo_rb 元素,再减去 .json 扩展名。本示例将 environment 设置为 test

  3. 创建一个包含以下内容的名为 default.rb 的配方文件并将该文件保存到说明书的 recipes 目录。

    log "Stack name: #{node['opsworks']['stack']['name']}" log "Stack id: #{node['opsworks']['stack']['id']}"

    此配方仅记录您添加到环境的两个堆栈配置和部署值。尽管配方在 Virtual Box 中本地运行,但您引用这些属性时使用的节点语法与配方在 AWS OpsWorks Stacks 实例上运行时使用的相同。

  4. 运行 kitchen converge。您应看到类似于以下内容的日志输出。

    ... Converging 2 resources Recipe: printjson::default * log[Stack name: MyStack] action write[2014-07-01T23:14:09+00:00] INFO: Processing log[Stack name: MyStack] action write (printjson::default line 1) [2014-07-01T23:14:09+00:00] INFO: Stack name: MyStack * log[Stack id: 42dfd151-6766-4f1c-9940-ba79e5220b58] action write[2014-07-01T23:14:09+00:00] INFO: Processing log[Stack id: 42dfd151-6766-4f1c-9940-ba79e5220b58] action write (printjson::default line 2) [2014-07-01T23:14:09+00:00] INFO: Stack id: 42dfd151-6766-4f1c-9940-ba79e5220b58 ...