Cloudify中的部署组合

[这篇文章是由DeWayne Filppi撰写的。]

Cloudify中,“部署”定义了一个包含nodes(节点)和relationships(关系)集合的独立命名空间。这些节点和关系通常被视为一个完整的技术栈,提供一个完整的计算平台。一个典型的部署包括负载均衡器层,Web服务器层,应用程序服务器层和数据库集群层。在某些情况下,希望有一个island(此处用来代指技术栈的一部分)代表一个完整的技术栈,而仅仅代表一个技术栈的一部分(例如某一层)。

在这种模式下,数据库部署可以独立于其他层而单独实例化。其他层可以独立于数据库运行。Cloudify默认不支持这种模式,但我们可以通过灵活的插件完成。

快速演练

DeploymentProxy(代理部署服务器)节点可以帮您在部署时解决相关的依赖关系。我们通过blueprint(蓝图)来部署DeploymentProxy节点,此节点其实是被定义为独立,更准确地说,是独立部署的输出。插件的源代码在github上,并包含一个示例。这个例子说明了一个的NodeJS蓝图,依赖于MongoDB的蓝图。依赖关系的细节有些做作,但足以证明。

DeploymentProxy使用蓝图“ 输出 ”作为基点的。所以在这个例子中,第一步是在MongoDB blueprint(蓝图)中建立有意义的输出。

outputs:
  endpoint:
    description: MongoDB endpoint # 此处是作为蓝图的描述
    value:
      ip_address: { get_property: [ host, ip ] } #我们通过使用get_property 内部函数提取主机ip
      port: { get_property: [mongod, port] }

一旦建立了输出,所有工作都将移到依赖蓝图(NodeJS),该蓝图包含DeploymentProxy节点。首先,NodeJS蓝图包括DeploymentProxy 的插件定义和TOSCA节点定义。

imports:  
  - http://www.getcloudify.org/spec/cloudify/3.1/types.yaml
  - http://www.getcloudify.org/spec/diamond-plugin/1.1/plugin.yaml
  - types/nodecellar.yaml
# 该代理的 yaml 文件在本示例中是本地的, 但一般情况下, 它位于共享驱动器或 web 服务器上
  - plugins/proxy/plugin.yaml

接下来,添加新的DeploymentProxy节点。此DeploymentProxy Node是表示独立的MongoDb蓝图。它的唯一功能是在内置安装工作流程中使用,以等待(如有必要)或提供有关所引用的蓝图/部署的信息。

  proxy:
    type: cloudify.nodes.DeploymentProxy
    properties:
      deployment_id: md
      wait_for: expr
      test: outputs['endpoint']['value']['port']>0

这个特定的节点演示了一个python布尔表达式,用于确定代理在安装工作流程中何时成功返回。简单来说,安装NodeJS时会一直等待到此条件成立或者操作超时。该表达式是目标部署的“输出”字典。另一个wait_for 选项是“exists” --- 如果命名属性存在于输出中,则返回成功。

最后一步是通过关系将NodeCellar应用程序连接到代理的MongoDB数据库。除了简单地等待MongoDB可用之外,该示例还演示了访问输出以连接到数据库。DeploymentProxy节点在其运行时属性中返回其目标蓝图的输出。

 nodecellar:
    type: nodecellar.nodes.NodecellarApplicationModule
    properties:
      port: 8080
    relationships:

      ################################
      # 设置mongoDB连接
      ################################

      - type: node_connected_to_mongo
        target: mongod

在“Node_connected_to_mongo”关系中,从标准NodeCellar蓝图的版本稍微修改,后配置生命周期方法获取MongoDB主机和端口。在原始版本中,它从当前蓝图中的MongoDB节点获取值。在这个版本中,由于MongoDB具有完全独立的蓝图,它从代理节点获取其主机和端口。这在/scripts/mongo/set-mongo-url.sh关系实现中的NodeJS蓝图中显示。

ctx source instance runtime_properties mongo_ip_address $(ctx target instance runtime_properties outputs.endpoint.value.ip_address)
ctx source instance runtime_properties mongo_port $(ctx target instance runtime_properties outputs.endpoint.value.port)

深入探讨

该插件只有一个功能“wait”,等待目标部署输出的条件。当“启动”方法被调用时,“等待”接收以下参数:

  • deployment_id:所依赖的部署(部署类似是cloudify的一个应用)的id。
  • wait_for:“exits”或“expr”。
    • 如果“exits”,将等待一个匹配属性为“test”(就是下面的test参数)的输出。
    • 如果是“expr”,它将属性“test”(就是下面的test参数)解释为一个python布尔表达式,其中集合“outputs”是输出字典(例如expr:outputs [port]> 0
  • test:输出的名称或布尔表达式(请参阅wait_for)
  • timeout:等待的秒数。当超时到期时,会引发“RecoverableError”。默认值= 30。

“wait”函数调用Cloudify REST API以从配置的部署id中获取输出。它要么检查一个特定的输出属性是否存在,要么通过python布尔表达式来实现更复杂的条件判断。如果配置wait_for是 “expr”,如果布尔表达式为真则根据目标部署“输出”字典进行部署安装。该函数会因为超时而引发“RecoverableError”报错。Cloudify安装工作流程会自动重试。这一直持续到安装工作流程最终放弃,或表达式评估为真。当DeploymentProxy完成时,它将目标部署的输出复制到它自己的运行属性中。这样此蓝图中的其他节点就可以轻松通过IP和端口访问到此节点。

结论和未来的方向

cloudify.nodes.DeploymentProxy节点提供了部署之间的基本依赖关系机制。它伪装成本地部署节点,同时访问另一个部署,等待其输出描述的就绪状态。这只是这个概念的冰山一角,因为沟通仅限于输出,而且是单向的。这个插件理论上应该可以被扩展到实际触发目标部署的安装,访问和公开运行时属性,并不断更新输出和其他属性。源代码以及本文中的演练的使用示例均在github上可找到。

本文的版权归 Hi胡瀚 所有,如需转载请联系作者。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏编程

tornado全面剖析与实践系列1

猿助猿的技术栈是基于Tornado的, 在学习的过程中参考了很多文章, 但是内容大都碎片化, 缺少系统性讲解, 而且不少关于异步应用的内容还是基于过时的旧版本....

34690
来自专栏北京马哥教育

黑客们会用到哪些Python技术?

学Python最简单的方法是什么?推荐阅读:Python开发工程师成长魔法 Python已经成为漏洞开发领域的行业标准,读者会发现大多数概念验证工具都是用Pyt...

87680
来自专栏java工会

这些快捷键,让你的编码速度快一倍

CTRL+N 查找类 CTRL+SHIFT+N 查找文件 CTRL+SHIFT+ALT+N 查找类中的方法或变量 CIRL+B ...

15930
来自专栏杂烩

一种海量日志存储、分析解决方案V1.1 原

针对上一个版本https://my.oschina.net/shyloveliyi/blog/786337,有如下更新:

12030
来自专栏机器学习养成记

静态爬虫与地址经纬度转换(python)

“ 本文通过一个小例子,展示了用python进行静态爬虫的方法,并且将爬取下来的城市列表,通过调用百度地图api,返回对应经纬度。” ---- requests...

67580
来自专栏任浩强的运维生涯

nginx关于限制请求数和连接数

nginx轻巧功能强大,能承受几百并发量,ddos攻击几乎没有影响到nginx自身的工作,但是,太多的请求就开始影响后端服务了。所以必须要在nginx做相应的限...

21100
来自专栏freesan44

iOS 对源代码进行混淆

代码混淆,刚刚看到是不是有点懵逼,反正我是最近才接触到这么个东西,因为之前对于代码和APP,只需要实现功能就好了,根本没有考虑什么安全问题。

26010
来自专栏静下来

#1273 – Unknown collation: ‘utf8mb4_unicode_ci’的解决方法

前段时间没心情更新博客,现在打算又慢慢更新吧。 换了个域名,换个心情。 最近由于一个新的网站程序。对mysql、php版本有特殊要求。 又不想浪费钱再去买个服务...

403120
来自专栏游戏杂谈

PHP实现一个简单url路由功能

如果一个页面的内容呈现,需要根据url上传递的参数来进行渲染。很多时候可能是这样子写:xxx.com/xx?c=x&m=x&t=..,而我们看到的url往往是...

1.1K10
来自专栏java工会

这些快捷键,让你的编码速度快一倍

19550

扫码关注云+社区

领取腾讯云代金券