摘要:在基础篇中已经介绍了品高云应用自动化部署的基本功能,通过基础篇已经熟悉自动化部署的操作界面,可以完成一个简单应用的方案设计、发布及使用。本篇将介绍品高云应用自动化部署的更多高级功能,其中包括流程控制元素详解、执行器中的存储、安全组及 Host 设置和 parameters 参数引用。

本篇将通过四个章节介绍品高云应用自动化部署的更多高级功能,通过介绍更多的流程控制模块、执行器及 parameters 参数引用,来实现服务的多样化及专业性,具体章节内容如下:
第 1 章节: 对设计器中的流程控制模块进行介绍。
第 2 章节: 对执行器中的存储、安全组及 Host 设置进行介绍。
第 3 章节: 介绍参数引用的另一种方法 parameters。
第 4 章节: 通过部署一个 HaProxy 负载 Tomcat 架构来将涉及到的知识进行回顾。

1 流程控制元素介绍

品高云的自动化部署基于 BPM2.0 的工作流规范,所使用的设计器是开源项目 activiti 提供的设计器,在设计器中使用的元素可分为两大类,其中一类是开源项目 activiti 提供的元素,就是本章节要介绍的流程控制元素,另一类则是品高云自动化部署里面的执行器(可参考品高云应用自动化部署与云服务创造能力基础篇的第 2.4 章节执行器)。

流程控制元素主要提供对自动化部署的执行流程进行设计的功能,由于大部分的部署方案只使用事件,网关,子流程等少数元素,所以在设计器中屏蔽了大多数很少使用的 BPMN2.0 元素。设计器中保留大多数经常用到的流程控制元素,如图 1-1 所示:

图 1-1 流程控制元素

开始事件:

开始事件用来指明流程在哪里开始,所有流程(包括子流程)必须配备开始事件并在此启动流程。

结束事件:

结束事件用来指明流程在哪里结束,所有流程(包括子流程)必须配备结束事件并在此结束流程。

并行分支:

并行分支可以将流程分成多条分支,也可以把多条分支汇聚到一起,多用来执行流程中的并行事件,如想同时创建两个不同的实例,就可以使用到并行分支。

并行分支还可以有等待的作用,例如某些需要等待其他机器的脚本都运行成功之后才运行的场景,也可以使用并行分支。在 Haproxy 负载 Tomcat 集群的示例中,注册到 Hapaoxy 需要等待 tomcat 安装完成并部署完应用,这时并行分支就起到了等待的作用。 流程将会等待两个分支都运行完成后,才会运行注册到 Hapaoxy。

图 1-2 并行分支示例

扩展:

同一个并行分支允许有多个进入和多个外出,此时它就具有分支和汇聚功能。这时,网关会先汇聚所有进入的分支,然后再切分成多个并行分支。

并行分支允许进入和外出的数目不相等,并行网关只是等待所有分支进入,并可切分成多个并行分支,不会受到其他流程节点的影响。

排他网关:

排他网关多用来进行条件判断实现决策作用,当流程执行到这个网关,所有流程都会被处理一遍,其中条件解析为’true’ 的顺序流(如果没有设置条件,概念上每个流程都定义了一个’true’)会被选中,让流程继续运行。

如图 1-3 所示,当流程执行到排他网关时,会对后续的流程进行条件解析,流条件可根据实际情况进行设置,当 input 参数为 1 时,条件判断成立,单机部署流程的条件解析为’true’,此时执行单机部署流程。

图 1-3 排他网关示例

在排他网关中,如果有多个流程的条件结果为’true’,会被选中设置为默认流的流程,并用来继续运行流程。如果没有选中任何流程,会抛出一个异常。

包容分支:

包含分支的功能是进行条件判断,并可通过全部经过条件筛选的流程,可以看做是排他网关和并行分支的结合体。

包含分支和排他网关一样可以定义条件,然后根据条件对流程进行判断,但是主要的区别是包含网关可以通过多个’true’ 流程,这和并行网关一样。

包含网关如果拥有多个进入和外出流程, 它就会同时含有分支和汇聚功能,相比并行分支多了条件筛选功能。

子流程:

子流程就是一个完整的流程,也需要流程控制元素来进行流程启动和结束。它是包含在父流程里面,是父流程的一部分。

在多机部署的场景中,如果有几台实例执行的操作是相同的,可以借助子流程来简化设计的工作量。如 Haproxy 负载 Tomcat 集群示例,tomcat 集群借助子流程,只需要描述一次 tomcat 的部署过程即可。

图 1-4 子流程示例

子流程中需要部署实例的数量可以在子流程元素中通过参数引用的方式来定义。子流程的多实例类型设置为 Parallel 表示子流程并行执行,此时子流程内定义了多少台机器都会一同开始执行流程,设置为 Sequential 表示子流程串行执行,此时子流程内定义了多少台机器会依次执行流程。

子流程实例的编号会根据传入的数量在编号后加上后缀,例如 tomcat 服务器的编号为 tomcat,则实际产生的实例编号为 tomcat01,tomcat02。

如果负载均衡节点,要获取所有 tomcat 的 IP 地址,则可以通过 ${outputs.tomcat.privateIp},得到的将会是一个数组。

子流程内部的引用可以忽略后缀带来的影响,直接以 ${outputs.tomcat.privateIp} 表达式,就可以取到当前机器的 IP 地址。

2 执行器详情

执行器,是自动化部署流程中的流程元件,自动化部署中的每个任务节点对应一个执行器。在基础篇中已经介绍在自动化部署中比较常用的执行器,如实例(SIP::EC2::Instance)、自定义指令(Command)、文件(FileStone)及组件(Componet)。在本篇中将对剩余几个重要的执行器进行介绍,运用这些执行器结合流程控制元素可构建多样化的服务。

2.1 SIP::EC2::SecurityGroup

SIP::EC2::SecurityGroup,安全组执行器属于资源服务,在设计器中使用此执行器可以创建安全组,或者对已有安全组进行授权。如图 2-1 所示,在 Componet 的详情页中包含下面的参数字段信息以及在设计器中显示的信息:

图 2-1 安全组执行器参数的详情界面

安全组执行器可以创建安全组或对已有安全组进行授权,在设计器中可通过安全组执行器的端口信息进行规制设置,如图 2-2 所示:

端口信息设置支持多种协议,开放规则支持批量设置,如 22,80,22-33,端口信息也可通过参数结合参数模板进行获取,如图 2-3 所示:

图 2-2 安全组执行器在设计器中的显示

图 2-3 端口信息设置

2.2 HostSetting

HostSetting,Host 设置执行器属于指令服务,使用此执行器可以对机器配置 host。该执行器,会将当前环境下的所有机器,配置到指定机器的 host 中。 Host 的名字为各机器执行器配置的 code(既实例名称)。如图 2-4、2-5 所示,在 HostSetting 的详情页中包含下面的参数字段信息以及在设计器中显示的信息:  图 2-4 Host 设置执行器参数的详情界面

图 2-5 Host 设置执行器在设计器中的显示

如果是多机部署时,实例的名称会带上后缀,例如:
slave01 192.168.11.21
slave02 192.168.11.22

Host 设置的指令,会通过指令下发的方式启动,产生一条指令下发记录,可以在流程实例的详情页面查看到其运行日志和结果

2.3 SIP::EC2::Volume

SIP::EC2::Volume,存储执行器属于资源服务,是自动化部署服务中常用到的服务。在应用部署的场景中,我们经常需要把数据或者日志存储在存储卷中,而不是系统盘中。在 SIP::EC2::Volume 执行器的详情界面中,我们可以看到执行器所带的基本的基本参数字段信息,如图 2-6 所示:

图 2-6 存储执行器参数的详情界面

除了参数字段信息外,存储执行器中也有输出字段信息,在该执行器运行完之后,可以后续为运维方案所调用,输出参数具体如图 2-7 所示

图 2-7 存储执行器输出参数详情界面

在设计器中,可以通过存储执行器创建存储卷并挂载到指定的实例上,存储执行器如图 2-8 所示:

实例编号为 i-xxxx 格式的编号,是要挂载主机的输出,例如 ${outputs.tomcat.instanceCode},如果实例编号不存在,则只会创建一个空闲的存储卷,不会执行挂载动作。

数据盘大小 (G):数据盘的大小,可以为空,由参数传入;如果参数没有传入,则以此处为准。

图 2-8 存储执行器在设计器中的显示

2.4 CommonCommand

CommonCommand,通用指令执行器属于指令服务,使用此执行器可以将平台脚本管理中已有的脚本下发到实例中进行执行,如图 2-9、2-10 所示,在 CommonCommand 参数详情页中包含下面的参数字段信息以及在设计器中显示的信息:

图 2-9 CommonCommand 执行器参数的详情界面
图 2-10 CommonCommand 执行器在设计器中的显示

通用指令的指令,会通过指令下发的方式启动,产生一条指令下发记录,可以在流程实例的详情页面查看到其运行日志和结果,在平台中可用来调用磁盘格式化和挂载的脚本。

3 参数引用

在设计器中,针对参数引用有两个方式分别为 outputs 和 parameters、其中 outputs 多用于对执行器的参数信息进行引用,parameters 针对参数模板由用户定义的参数进行引用,两者引用的格式都为 ${},在基础篇中已经讲解 outputs 的引用方式,此章节着重介绍 parameters 的引用方式。

平台中参数引用的格式为 ${引用方式. 作用域. 所取的参数},如果在 ${} 中未填写引用方式,则默认是使用 parameters 进行参数引用,既 ${parameters.globalXX} = ${globalXX}。

Parameters 的作用是针对参数模板由用户定义的参数进行引用,例如在 Haproxy 负载 Tomcat 集群示例中,Tomcat 集群的数量是可变化的,在 Tomcat 子流程的实例基数中用 ${tomcatNum} 来收集 Tomcat 集群数量的参数。在参数模板中创建一个关键词为 tomcatNum 的参数,并设置为用户可选项,用户即可在申请此服务时填入 Tomcat 的集群数量。

图 3-1 Tomcat 集群参数设置

在服务设计过程中,可能同一参数需要进行重复调用,此时可以通过参数引用中的作用域来解决这问题,参数调用的格式为 ${引用方式. 作用域. 所取的参数},其中的作用域为用来区分不同的执行器。

如部署一个 wordpress 服务,需要构建一个 mysql,其中 mysql 的密码可以用 ${ passwd} 来进行参数引用,当 web 实例需要获取到 mysql 的密码时,可以通过 ${setMysql.passwd} 来获取到,其中 setMysql 为使用 ${ passwd} 的执行器编号,当然前提是需要参数模板中创建一个关键词为 passwd,命令空间为 setMysql 的参数。

图 3-2 Mysql 密码参数设置

关于参数引用的总结如下:

图 3-3 参数引用方式

参数引用格式为 ${},引用方式有 parameters 和 output,参数的引用级别如上图所示
a) parameters.globalXX
b) parameters.A.param1
c) outputs.A.param1

如不是 outputs 前缀,则默认为参数,如 ${parameters.globalXX} = ${globalXX}

4 Haproxy 负载 Tomcat 集群示例

本章节通过一个 Haproxy 负载 Tomcat 集群示例来展示在云中如何部署一个多主机的服务,示例中包含多机部署并存在引用关系。通过示例的学习可以将基础篇及进阶篇的知识进行回顾,后续可根据示例的思路自己构建更多的服务。

Haproxy 负载 Tomcat 集群的部署架构如图 4-1 所示,由 Haproxy 负载 Tomcat 对外提供服务,为集群内的机器设置好安全组,VPC 等基础信息,并通过子流程模块,实现 Tomcat 集群数量可定义。

图 4-1 Haproxy 负载 Tomcat 集群架构

在基础篇中,介绍了在云中如何制作一个可以自动化交付的应用并发布到目录中的全过程,本篇将不具体介绍服务创建的前期准备,如安装包上传,服务方案创建等,主要介绍部署方案的设计和参数模板的配置,如果对方案的创建及发布等相关概念不熟悉可以阅读基础篇的第 2 章节,图 4-2 是本次示例的整个流程,将分为 4 小节进行介绍:
4.1 节:Haproxy 负载 Tomcat 集群服务的前期准备,包括安装包的上传,服务方案及版本号的创建
4.2 节:着重介绍 Haproxy 负载 Tomcat 集群的部署方案如何设计
4.3 节:详细介绍方案的参数模板配置
4.4 节:对部署方案进行部署测试并发布到服务目录上

图 4-2 创建 Haproxy 负载 Tomcat 集群服务流程

4.1 前期准备:

Haproxy 负载 Tomcat 集群服务的安装包及脚本可通过 http://pan.bingosoft.net:81/drive/share/open_sharepage/a86b00e7-79db-4593-824b-4a1e34e55825:bingo【密码:FfxG】进行下载,文件中包含 Haproxy 负载 Tomcat 集群服务的安装包及服务的安装脚本,具体如图 4-3 所示:

图 4-3 安装包及脚本

将其中的 helloworld.zip 安装包上传并注册到云平台中的仓库文件中,用于应用的部署。如对 helloworld.zip 安装包的名称进行修改,需要将安装 tomcat 脚本和安装 haproxy 中的 unzip helloworld.zip 修改成 unzip NEW.zip,NEW 为新修改的名称,如图 4-4 所示:

图 4-4Tomca 安装脚本修改

步骤:
1) 进入【配置管理→高级服务→文件管理→临时文件管理】
2) 点击上传按键或者通过 FTP 上传 helloworld.zip 安装包
3) 选择已上传的文件,点击【更多操作→注册到仓库】

图 4-5 安装包注册到文件仓库

安装包注册到仓库文件后,在服务管理中为此服务创建一个部署方案,并为其添加版本信息,最后在版本号中创建流程模型。
步骤:
1) 进入【配置管理→高级服务→服务管理→部署方案】,点击【创建方案】
2) 在新建版本界面填写此部署方案的相关信息
3) 在列表中找到创建好的部署方案
4) 进入详情界面,点击【添加版本】,添加版本名称、版本号及版本的描述信息
5) 在创建好的版本右上角择【新增部署案】,填写方案名称【Haproxy 负载 Tomcat 集群】,流程选择【自动新建流程】,可按照实际填写流程模型说明

图 4-6 创建 Haproxy 负载 Tomcat 服务方案

4.2 方案设计

在创建完流程模型后,需要根据应用的架构来进行方案的设计,本节将对 Haproxy 负载 Tomcat 集群进行具体介绍,通过各组件来完成方案的设计。整个部署方案设计可以拆分为:
1. 为全部主机配置安全组并使用并行分支来分别创建 Tomcat 集群和 Haproxy 主机
2. 通过子流程创建 Tomcat 部署任务
3. 创建 Haproxy 主机,并将全部机器 host 写入 Haproxy 主机中
4. 使用并行分支等待全部主机创建完毕后将 Tomcat 主机注册到 HaProxy 中

在 Haproxy 负载 Tomcat 集群中需要部署 Tomcat 集群和 Haproxy 多台主机,在此次方案中,为所以主机使用同一安全组,并通过流程控制元素中的并行分支来分别创建 Tomcat 和 Haproxy 主机,具体操作步骤可参考图 4-5。
步骤:
1) 进入【配置管理→高级服务→服务管理→部署方案】,找到方案进入详情,点击流程模型进入设计器中
2) 拉入一个开始事件,在左侧拖入流程控制组件的【开始事件】,填写编号【start】,填写名称【开始】,其他默认
3) 从资源服务拖动一个安全组,在左侧拖入资源服务组件的【安全组】,填写编号【configGroup】,填写名称【配置安全组】,在端口信息中选择 tcp 并开放 80 端口,其他默认,并将【开始】与【配置安全组】相连接
4) 从资源服务拖动一个并行分支,在左侧拖入流程控制组件的【并行分支】,填写编号【Branch】,填写名称【进行分支】,其他默认,并将【配置安全组】与【进行分支】相连接

图 4-7 配置安全组及并行分支

在此方案中,Tomcat 集群的数量是根据服务的使用者进行定义的,为实现此效果可通过子流程模块来完成 Tomcat 集群的创建,具体操作步骤可参考图 4-6。
步骤:
5) 拉入一个子流程,在左侧拖入流程控制组件的【子流程】,填写编号【tomcat-process】,填写名称【创建 tomcat 部署任务】,在多实例类型选择【Parallel】,基数(多实例)填写【${tomcatNum}】,其他默认,并将【进行分支】与【创建 tomcat 部署任务】相连接
6) 拉入一个开始事件放置在子流程中,在左侧拖入流程控制组件的【开始事件】,填写编号【start01】,填写名称【子流程开始】,其他默认
7) 在左侧拖入资源服务组件的【实例】放置在子流程中,填写编号【createTomcat】,填写名称【创建 Tomcat 服务器】,填写实例名称【Tomcat】,其他默认,并将【子流程开始】与【创建 Tomcat 服务器】相连接
8) 在左侧拖入指令服务组件的【文件】放置在子流程中,用来下载服务安装包,填写编号【tomcat-getfile】,填写名称【tomcat 下载文件】,填写实例的 ID【${outputs.createTomcat.instanceId}】,选择文件 ID 为【上传的服务安装包(4.1 前期准备上传的安装包)】,其他默认,并将【创建 Tomcat 服务器】与【tomcat 下载文件】相连接
9) 在左侧拖入指令服务组件的【组件】放置在子流程中,用来下发安装 tomcat 服务的脚本,填写编号【installTomcat】,填写名称【安装 tomcat(存放在 4.1 前期准备的安装包中)】,填写安装目录【/apps/svr/tomcat7】,填写日志目录【/apps/srv/tomcat7/log】,填写端口【8080】,填写安装脚本内容为【Tomcat 安装脚本】,填写实例的 ID【${outputs.createTomcat.instanceId}】,其他默认,并将【tomcat 下载文件】与【安装 tomcat】相连接
10) 在左侧拖入指令服务组件的【自定义指令】放置在子流程中,用来给每台 Tomcat 实例配置不同的 web 页面,填写编号【deployApp】,填写名称【部署应用】,填写指令内容为【tomcat 部署应用脚本(存放在 4.1 前期准备的安装包中)】,填写实例的 ID【${outputs.createTomcat.instanceId}】,其他默认,并将【安装 tomcat】与【部署应用】相连接
11) 在左侧拖入流程控制组件的【结束事件】放置在子流程中,填写编号【end01】,填写名称【结束子流程】,其他默认,并将【部署应用】与【子流程结束】相连接

图 4-8 创建 tomcat 部署任务

在方案中通过并行分支的作用,创建 Haproxy 主机可以与 Tomcat 集群的流程可以同时进行创建,在上一个分支流程中完成创建 tomcat 部署任务,这一流程将完成 Haproxy 主机的创建,并将整个部署方案主机的 Host 写入 Haproxy 主机中,具体操作步骤可参考图 4-7:
步骤:
12) 在左侧拖入资源服务组件的【实例】放置在父流程中,填写编号【createHaproxy】,填写名称【创建负载均衡】,填写实例名称【Haproxy】,其他默认,并将【进行分支】与【创建负载均衡】相连接
13) 在左侧拖入指令服务组件的【文件】放置在父流程中,用来下载服务安装包,填写编号【loadbalancer-getfile】,填写名称【负载均衡下载文件】,填写实例的 ID【${outputs.createHaproxy.instanceId}】,选择文件 ID 为【上传的服务安装包(4.1 前期准备上传的安装包)】,其他默认,并将【创建负载均衡】与【负载均衡下载文件】相连接
14) 在左侧拖入指令服务组件的【组件】放置在父流程中,用来下发安装 haproxy 服务的脚本,填写编号【install_haproxy】,填写名称【安装 Haproxy】,填写安装目录【/usr/local/src/haproxy-1.5.3】,填写端口【80】,填写安装脚本内容为【haproxy 安装脚本(存放在 4.1 前期准备的安装包中)】,填写实例的 ID【${outputs.createHaproxy.instanceId}】,其他默认,并将【负载均衡下载文件】与【安装 Haproxy】相连接
15) 在左侧拖入指令服务组件的【Host 设置】放置在父流程中,用来将方案中的主机的 Host 写入到 Haproxy 主机,填写编号【setHost】,填写名称【设置 Host】,填写实例的 ID【${outputs.createHaproxy.instanceId}】,其他默认,并将【安装 Haproxy】与【设置 Host】相连接

图 4-9 创建 haproxy 部署任务

在创建 haproxy 和 Tomcat 后,需要将 tomcat 主机注册到负载均衡中,注册步骤需要 haproxy 和 Tomcat 的服务正常运行,因为一开始使用并行分支,两个流程在同时进行,为确保注册步骤能正常进行,需要再使用并行分支起到汇聚等待的作用,并完成最后的注册工作,具体操作步骤可参考图 4-8:
步骤:
16) 在左侧拖入流程控制组件的【并行分支】放置在父流程中,填写编号【wait】,填写名称【汇聚等待】,其他默认,并将【创建 tomcat 部署任务】及【设置 Host】与【汇聚等待】相连接
17) 在左侧拖入指令服务组件的【自定义指令】放置在父流程中,用来将 Tomcat 实例注册到 haproxy 中,填写编号【registe-ha】,填写名称【注册到 HaProxy】,填写指令内容为【注册到 HaProxy 脚本(存放在 4.1 前期准备的安装包中)】,填写实例的 ID【${outputs.createHaproxy.instanceId}】,其他默认,并将【汇聚等待】与【注册到 HaProxy】相连接
18) 在左侧拖入流程控制组件的【结束事件】,填写编号【end】,填写名称【结束】,其他默认,并将【注册到 HaProxy】与【结束】相连接
19) 点击左上角的保存,退出设计器

图 4-10 将 tomcat 机器注册 HaProxy 中

4.3 参数模板配置

通过参数模板收集用户定义的参数才能使流程启动,每一个流程模型都需要与之相对应的参数模板,在本次方案中,可为主机配置标准的云主机参数模板。

在方案设计中,创建 Tomcat 部署流程使用到参数变量 tomcatNum,此时在参数模板中需新增一个 tomcatNum 的参数,并设置为用户可修改。
步骤:
1) 进入【配置管理→高级服务→服务管理→部署方案】,找到方案进入详情,点击流程模型的参数模板,进入参数模板界面,点击【新建模板】
2) 在部署模板页面,填写模板名称【标准模板】,生成参数【选择模板】,并选择【云主机创建模板】,点击生成,如图 4-7 所示:
3) 在参数列表中点击【添加参数】按钮,新建一个关键词为【tomcatNum】,显示名称为【tomcat 节点数量】,命名空间为【全局参数】,类型为【数字】,显示类型【文本框】,默认值为【1】的参数项,如图 4-8 所示:
4) 在镜像参数一栏,点击参数信息修改按键将参数信息里面将镜像 ID 值改为平台上的 centos 镜像 ID(镜像要安装好 agent 及设置为支持自动化部署),并确定好保存,如图 4-9 所示:

图 4-11 配置方案的参数模板
  图 4-12 配置 tomcat 节点数量参数
图 4-13 修改服务的默认镜像

4.4 方案部署调试及服务上架

完成方案的设计及为其配置好参数模板后,此时需要对整个方案的可行性进行测试,测试成功后可将其上架到服务目录中进行使用。在测试过程中需要查看每个过程的进展情况,如发现流程实例没法执行成功,可查看具体出错信息,并对方案进行调整。
步骤:
1) 进入【配置管理→高级服务→服务管理→部署方案】,找到方案点击【部署】
2) 在申请界面中,填写相关信息 (本示例中的 Tomcat 实例主机内存要大于等于 2G),等待资源消耗信息后,点击【部署】
3) 部署过程中,可通过方案测试页面或是流程实例页面来查看每个过程的进展情况,如发现流程实例没法执行成功,可查看具体出错信息,并对方案进行调整
4) 方案执行成功后,访问 HaProxy 实例的 IP,看是否能访问到 Tomcat 服务
5) 验证应用无误后,进入方案测试页面将方案销毁,释放资源
6) 进入【配置管理→高级服务→服务管理】点击【新增】,启动新增服务向导
7) 服务类型选择【自动化部署】,依次填写相关信息,模式选择【工作流模式】并关联方案,其他默认,点击【提交】按钮
8) 服务列表中找到刚创建的服务,点击发布,选择【全部】角色,并点击【提交】

图 4-14 HaProxy 服务页面

至此,完成 Haproxy 负载 Tomcat 集群应用在云上成为自动化部署服务的全过程。

本篇文章对品高云自动化部署中涉及到重要元素和参数引用方法进行介绍,通过 Haproxy 负载 Tomcat 的示例介绍了在品高云自动化部署中多机部署架构的解决思路。结合基础篇和进阶篇的内容,可以熟悉品高云自动化部署服务并完成全新服务的设计和发布。在后续的高级篇中将着重介绍自动化部署中方案的导入导出、服务依赖及自动化运维方案等高级功能。