使用插件在 IBM PureSystems 上部署新应用程序,第 2 部分

从一个启用实际 SugarCRM 解决方案的项目中汲取经验

IBM® PureSystems 是一个专业、集成、企业级的云系统系列(以最佳实践模式的形式提供),包含应用程序、服务、硬件甚至专业技能,IBM PureSystems 的引入将云计算推向一个新高度。让一个应用程序准备好利用 IBM PureSystems 的一种方式是制作插件来充当应用程序包与系统之间的桥梁。第 1 部分 描述了在 IBM PureSystems 上启用 SugarCRM 的开发工作。本文将讨论从这些开发工作中汲取的经验。

Chin Huang, 云解决方案架构师, IBM

Chin Huang 是一名专攻 IT 和软件架构的云解决方案架构师。他具有开发高级解决方案方面的专业经验,这些高级解决方案中包括 IaaS 平台、SaaS 集成、分析云、Web 服务和 IWD 插件。Chin 是一名认证的云计算解决方案顾问和 10 多篇技术论文的作者。他在加利福尼亚的硅谷生活和工作。



Ton Ngo, 云解决方案架构师, IBM

/developerworks/i/p-tngo.jpgTon Ngo 是位于加利福尼亚圣何塞的一名云解决方案架构师和高级开发人员。最近他是新加坡南洋理工大学的高性能云计算以及加拿大皇家银行的测试和开发云方面的架构师。之前他在 IBM 托马斯·沃森研究中心和阿尔马登研究中心担任了 17 年的研究员,并且发表了各方面主题的论文。



2012 年 5 月 21 日

在本系列的 第 1 部分 中,IBM 云实验室团队专家描述了在 IBM PureSystems 上启用 SugarCRM(一个独立服务供应商应用程序)的开发工作。SugarCRM 是一个需要 LAMP 栈(Linux®、Apache、MySQL 和 PHP)的 PHP 应用程序。IBM PureSystems 没有为 LAMP 提供开箱即用支持,因此团队开发了一个新的模式类型和一组插件,支持在基本 Linux 和 IBM AIX® 镜像之上建模、部署和运行应用程序。本文将讨论从项目中汲取的经验。

在查看本文之前阅读 第 1 部分 很有帮助,但不是必要的。

从为现有的第三方 SugarCRM 应用程序开发插件的过程中汲取的经验包含以下主题:

  • 支持多个平台
  • 管理 MySQL 和 DB2
  • 开发脚本
  • 调试脚本
  • 运行生命周期脚本
  • 删除不可删除的插件
  • 导入单个组件与成套组件
  • 使用版本加速开发
  • 处理大型二进制文件
  • 扩展基本镜像

支持多个平台

IBM PureSystems 插件本质上是平台中立的。插件开发人员必须设计一个执行计划,在插件和应用程序生命周期的不同阶段支持多个平台。否则正在进行的开发、维护和调试很快就会变得难以继续。

以下几个方面对于我们的项目尤其重要:

  • 声明平台支持和要求。
  • 针对多个平台组织文件和脚本。
  • 对多个平台收集插件启用输入。
  • 编写平台中立和特定于平台的脚本。
  • 管理受支持以及不受支持的平台。

下面我们更详细地看一下这几个方面。

声明平台支持和要求

插件配置文件 config.json 为每个程序包实例包含一个 requires 部分。如果某个插件支持具有相同文件集的多个平台,则没有必要声明平台。

而在我们的示例中,Linux 和 AIX 的文件和脚本之间存在差异巨大,此时应当使用 arch 子句以及内存和 CPU 等其他属性,用这些属性指出程序包定义受到限制,仅支持特定平台。结果表明,我们的程序包有两个定义,每个都有独立的系统要求和部件。

针对多个平台组织文件和脚本

插件中的文件夹结构与程序包定义紧密相关。为了简化维护,需要始终考虑对多个平台使用相同的文件和脚本。我们选择了在目录名称中明确指明平台,如第 1 部分 设计和开发 一节中所述。

对多个平台收集插件的启用输入

插件配置用户界面在插件的 config_meta.json 文件中加以定义。声明式方法使得构建用户界面变得很轻松,同时,如果需求各不相同,那么支持多个平台的灵活性方面会受到限制。

对于第 1 部分 解决方案打包 一节中描述的针对 Linux 和 AIX 的文件列表,我们决定对每个功能插件采用一个打包文件,其中所有必备文件都压缩在一个预定义的文件夹结构中。该设计能够让云管理员为目标平台收集足够多的文件,而我们的插件同时支持 Linux 和 AIX。

编写平台中立脚本和特定于平台的脚本

原则上,应该尽可能为 Linux 和 AIX 平台编写相同的脚本集。因为启动和运行 PHP 的流程截然不同,所以我们最终写了两个脚本集。

另外,我们了解到知道平台在命令和脚本方面的限制的重要性。例如,在 AIX 中,shell 脚本的第一行应当是 #!/bin/sh#!/bin/ksh,而非 #!/bin/bash,而且 gunzip 应该后接 tar,因为 tar 命令没有 -z 选项。

管理受支持以及不受支持的平台

我们的云部署初始目标平台是 System p;然而,由于实际的原因,我们发现支持 System x 也很有必要。

一个虚拟应用程序模式是独立于平台的,因此支持多个平台的需求不影响建模方面,不过它确实影响插件实现,因为它需要插件提供对所有平台的完全支持。

在我们的示例中,由于资源有限,提供对所有平台的完全支持是不可能的。这一限制确实暴露了在一个模式无法部署在一个不受支持的系统中时产生意料外用户体验的风险。对于这种情况,我们目前的解决方法是提供名称与受支持平台相关的模板,例如 “SugarCRM with DB2 on AIX”。


管理 MySQL 和 DB2

技术上来讲,MySQL 和 DB2 都充当 SugarCRM 应用程序的后端数据库。我们使用了类似的 Velocity 模板来进行建模和转换,这缩短了开发时间。不过,在我们的解决方案中,软件的所有权对受支持的拓扑和实现有着重大影响。IBM 拥有 DB2,所以我们自然而然地将我们的解决方案设计为与开箱即用的 DB2 插件集成在一起,如第 1 部分 重用现有插件 一节中所述。

反之,我们应用了松耦合方法来支持现有 MySQL。


开发脚本

在基本镜像上安装 SugarCRM 所需的软件栈时,我们发现很多程序包 (RPMs) 都没有包含在镜像中。因此,插件需要包含和安装这些缺失的 RPM。

一个可行的解决方案是在激活过程中提供一项服务来自动满足依赖关系和安装缺失的程序包。插件实现只是列出了必备的程序包,不需要处理它们。

我们遇到的一个错误状态涉及到两个角色之间的争用条件。(当流程的输出或结果出乎预料地极其依赖于其他事件的顺序或时间时,会发生争用条件。)需要重点注意的是,来自不同角色的生命周期脚本是并行调用的,因此在脚本管理共享资源时一定要注意避免冲突。

在一个实例中,我们发现来自一个角色的脚本试图停止 Apache,而来自另一个角色的脚本试图启动 Apache。这会导致出乎意料的行为,Apache 不会正常运行。必须识别共享服务或资源,并设计代码来合理管理它们。


调试插件

在开发 shell 脚本的过程中,我们发现完成整个周期需要太长时间了,其中涉及到在 Eclipse 中编辑脚本、构建插件、在 IBM PureSystems 中删除插件和重新部署。此外,需要删除和重新创建使用插件的 VM 和模式。

在实践中,我们利用了 PDK 中的调试支持来加快脚本开发。为此,首先需要将所有必要的工件和基本脚本文件都添加到插件中。我们部署了含有调试组件的模式来创建一个环境,其中包括存储库中的工件和包含 JSON 文件的激活目录。然后我们访问了 VM 并逐个调用了脚本,用这些脚本进行其他开发和调试。然后将脚本复制回 Eclipse 项目中。


运行生命周期脚本

在开发生命周期 Python 脚本时,开发人员必须密切注意触发每个脚本运行的生命周期事件。一些脚本在 VM 的整个生命周期中仅运行一次,而其他脚本则会在各个生命周期事件中执行。

例如,install.py 仅在初始化时运行一次,而 configure.py、start.py 和 stop.py 在每次 VM 重启时都会调用。

我们有一个特殊要求,即在 Apache、PHP 和数据库都得到适当配置之后,在数据库链接插件的 changed.py 脚本中执行 SugarCRM 安装。安装脚本应当只运行一次,用于设置和配置 SugarCRM 内容。而 changed.py 在每次 VM 重启时都会调用。

可以在 Python 中引入 role 属性来表明安装状态。在 changed.py 中,在安装结束后,我们会检查 SugarCRM 是否存在一个持久性文件,以确保没有多次重复进行安装。

生命周期脚本的细节可在 IBM Workload Deployer Information Center and Plug-in Development Guide 中找到。


删除不可删除的插件

在开发期间,我们经常面对这样一种情况:不能在 IBM PureSystems 中删除一个插件,因为插件的某些元素还在使用中。虽然错误消息仅仅指出插件在使用中,而不提供有关在哪里使用如何使用 的信息,但我们发现,对与插件相关的已部署应用程序实例、应用程序模式和应用程序模板进行一次彻底的清理通常能够消除错误。


导入单个组件与成套组件

尽管我们最终将所有插件打包为一个模式类型,但我们认识到,在开发期间将各个插件导入 IBM PureSystems 中会更高效、更及时。主要模式类型仍然需要单独导入,以便能够配置和启用单个插件。

这一后期绑定机制允许我们只更改和调试一个插件,而不影响模式类型和其他插件。由于我们的一些插件携带大文件集且需要较长时间才能重新导入和重新启用,缩短开发周期会特别有帮助。

也就是说,我们遇到这样一种情况:如果在 IBM PureSystems 中删除主要模式类型,我们无法再配置或删除一个单独导入的插件。当一个开发人员尝试删除插件而另一个开发人员正在刷新模式类型时,就会出现这种情况。在将主要模式类型放回去之后,就可以完全管理有问题的插件。模式类型打包的插件没有这种问题,因为它们随模式类型而变化。

我们建议 IBM PureSystems 产品团队仅在没有单独导入的相关插件时支持模式类型删除,该功能会在未来版本中提供。


使用版本加速开发

每个模式类型都有一个 major.minor 格式的版本。在开发过程中,我们有时会想要部署和比较一个模式类型的多个版本,或者不想经历模式类型清理周期。我们发现使用一个不同的主要版本来构建和安装模式类型会很方便。

打包在模式类型中的插件也需要有一个新的主要版本,并且会引用新的模式类型版本。例如,如果当前安装的模式类型版本是 1.0.0.1,新模式类型版本是 2.0.0.1,插件应当进行如下面 config.json 中的样例段所示的配置:

"name": "sugarcrm",
"version": "2.0.0.2",
"patterntypes": {
    "primary": {
        "sugarcrm": "2.0"
    }   
},

该技术不仅支持快速验证一个新的模式类型实现,而且允许多个开发人员共享相同的 IBM PureSystems 环境。


处理大型二进制文件

鉴于之前描述的许可考虑事项,我们必须将一些软件独立于插件进行打包,并且在部署插件时上传它们。在一般情况下,该步骤仅执行一次,但是在插件开发过程中,禁止重复上传 500MB 范围内的大型二进制文件,尤其是网速较慢时。

插件开发团队使用的一个技术是,使用一个改进的构建过程来支持独立于插件加载二进制文件。该操作对于内部开发环境是可行的。插件开发团队目前正在致力于将这一功能提供给所有插件开发人员。


扩展基本镜像

要为一个应用程序提供必备的软件,通常需要权衡一下是将软件安装在基本镜像上还是将其包含为基本镜像的一部分。因为 IBM PureSystems 允许用户扩展基本镜像,所以我们考虑使用 SugarCRM 所必需的 RPM 创建一个新基本镜像。这简化了初始开发工作以及未来的维护工作,因为插件将与基本镜像中的变更隔绝开来。

但是,由于这样一个定制的基本镜像对于所有模式都是常见的,所以这种方法在实践中是否可行还不太清楚。似乎灵活地将基本镜像与镜像构建工具(比如 ICON)结合使用会在插件设计中增添新的可能性。一般而言,让客户使用一个基本镜像会更容易。添加这一功能时需慎重考虑。


结束语

在本文以及 第 1 部分 中,我们展示了设计考虑事项,我们的团队将其用作一个模板来指导我们创建一个插件,以便在 IBM PureSystems 上部署现有的 SugarCRM 解决方案。我们还让您了解了我们所做的开发工作,详细介绍了我们从该项目中汲取的经验。

我们希望我们的实践经验能够让您更轻松地为现有应用程序编写 IBM PureSystems 插件。

在成功测试用例之后,我们揭示了 SugarCRM 解决方案是 IBM PureSystems 就绪的。除了在开发复杂插件方面获得的宝贵经验之外,我们相信我们的项目具有以下显著成效:

  • 基于一个非标准的软件栈在 IBM PureSystems 上成功交付了第一个应用程序模式。这能够让一个重要 ISV 将其软件作为 IBM PureSystems 目录的一部分来提供,从而促成 IBM PureSystems 和 SugarCRM 的成功。
  • 显然,IBM PureSystems 并没有局限于以开箱即用方式提供的应用程序模式。通过开发新插件,可以集成来自客户和 ISV 的新应用程序,从而利用 IBM PureSystems 的强大功能。
  • 在 IBM PureSystems 中严格实行对插件开发的支持。这一支持必须强大才能构建丰富的应用程序模式目录。通过将插件框架应用于不同于当前 IBM 软件集的场景中,我们帮助 IBM PureSystems 团队确认了需要改进的领域,而且这一工作促进了许多有助于未来开发的新功能的产生。

IBM PureSystems 能够让用户专注于其应用程序模式而无需担心底层基础架构,这带来了大幅提高生产效率的可能性。我们相信,新插件的大量增加会通过给予用户丰富的应用程序模式选项来确保 IBM PureSystems 的成功。

致谢

我想感谢该项目的主要支持人员:

  • 云实验室和 HiPODS 团队的 Willy Chiu、Larry Hsiung、Thomas Truong、Jeffrey Coveyduc、Kai Young、Nauman Fakhar、 Chris Kiernan 和 Raymond Wong
  • IBM Workload Deployer 开发团队的 Steve Ims、Lin Sun 和 Ted Kirby
  • IBM Database as a Service 开发团队的 Ning Wang 和 Qi Rong Wang
  • IBM Innovation Center 团队的 Nasser Momtaheni、Joseph Peterson 和 Rodney Johnson
  • SugarCRM 的 Stas Malyshev

参考资料

学习

获得产品和技术

  • 查看在 IBM SmartCloud Enterprise 上可用的 产品镜像

讨论

条评论

developerWorks: 登录

标有星(*)号的字段是必填字段。


需要一个 IBM ID?
忘记 IBM ID?


忘记密码?
更改您的密码

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件

 


在您首次登录 developerWorks 时,会为您创建一份个人概要。您的个人概要中的信息(您的姓名、国家/地区,以及公司名称)是公开显示的,而且会随着您发布的任何内容一起显示,除非您选择隐藏您的公司名称。您可以随时更新您的 IBM 帐户。

所有提交的信息确保安全。

选择您的昵称



当您初次登录到 developerWorks 时,将会为您创建一份概要信息,您需要指定一个昵称。您的昵称将和您在 developerWorks 发布的内容显示在一起。

昵称长度在 3 至 31 个字符之间。 您的昵称在 developerWorks 社区中必须是唯一的,并且出于隐私保护的原因,不能是您的电子邮件地址。

标有星(*)号的字段是必填字段。

(昵称长度在 3 至 31 个字符之间)

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件.

 


所有提交的信息确保安全。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=Cloud computing, Information Management
ArticleID=818237
ArticleTitle=使用插件在 IBM PureSystems 上部署新应用程序,第 2 部分
publish-date=05212012